xref: /aosp_15_r20/external/llvm/test/CodeGen/Generic/overflow.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s
2*9880d681SAndroid Build Coastguard Worker; Verify codegen's don't crash on overflow intrinsics.
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker;; SADD
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Workerdefine zeroext i8 @sadd_i8(i8 signext %a, i8 signext %b) nounwind ssp {
7*9880d681SAndroid Build Coastguard Workerentry:
8*9880d681SAndroid Build Coastguard Worker  %sadd = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %a, i8 %b)
9*9880d681SAndroid Build Coastguard Worker  %cmp = extractvalue { i8, i1 } %sadd, 1
10*9880d681SAndroid Build Coastguard Worker  %sadd.result = extractvalue { i8, i1 } %sadd, 0
11*9880d681SAndroid Build Coastguard Worker  %X = select i1 %cmp, i8 %sadd.result, i8 42
12*9880d681SAndroid Build Coastguard Worker  ret i8 %X
13*9880d681SAndroid Build Coastguard Worker}
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Workerdeclare { i8, i1 } @llvm.sadd.with.overflow.i8(i8, i8) nounwind readnone
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Workerdefine zeroext i16 @sadd_i16(i16 signext %a, i16 signext %b) nounwind ssp {
18*9880d681SAndroid Build Coastguard Workerentry:
19*9880d681SAndroid Build Coastguard Worker  %sadd = tail call { i16, i1 } @llvm.sadd.with.overflow.i16(i16 %a, i16 %b)
20*9880d681SAndroid Build Coastguard Worker  %cmp = extractvalue { i16, i1 } %sadd, 1
21*9880d681SAndroid Build Coastguard Worker  %sadd.result = extractvalue { i16, i1 } %sadd, 0
22*9880d681SAndroid Build Coastguard Worker  %X = select i1 %cmp, i16 %sadd.result, i16 42
23*9880d681SAndroid Build Coastguard Worker  ret i16 %X
24*9880d681SAndroid Build Coastguard Worker}
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Workerdeclare { i16, i1 } @llvm.sadd.with.overflow.i16(i16, i16) nounwind readnone
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Workerdefine zeroext i32 @sadd_i32(i32 signext %a, i32 signext %b) nounwind ssp {
29*9880d681SAndroid Build Coastguard Workerentry:
30*9880d681SAndroid Build Coastguard Worker  %sadd = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %a, i32 %b)
31*9880d681SAndroid Build Coastguard Worker  %cmp = extractvalue { i32, i1 } %sadd, 1
32*9880d681SAndroid Build Coastguard Worker  %sadd.result = extractvalue { i32, i1 } %sadd, 0
33*9880d681SAndroid Build Coastguard Worker  %X = select i1 %cmp, i32 %sadd.result, i32 42
34*9880d681SAndroid Build Coastguard Worker  ret i32 %X
35*9880d681SAndroid Build Coastguard Worker}
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Workerdeclare { i32, i1 } @llvm.sadd.with.overflow.i32(i32, i32) nounwind readnone
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Worker;; UADD
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Workerdefine zeroext i8 @uadd_i8(i8 signext %a, i8 signext %b) nounwind ssp {
43*9880d681SAndroid Build Coastguard Workerentry:
44*9880d681SAndroid Build Coastguard Worker  %uadd = tail call { i8, i1 } @llvm.uadd.with.overflow.i8(i8 %a, i8 %b)
45*9880d681SAndroid Build Coastguard Worker  %cmp = extractvalue { i8, i1 } %uadd, 1
46*9880d681SAndroid Build Coastguard Worker  %uadd.result = extractvalue { i8, i1 } %uadd, 0
47*9880d681SAndroid Build Coastguard Worker  %X = select i1 %cmp, i8 %uadd.result, i8 42
48*9880d681SAndroid Build Coastguard Worker  ret i8 %X
49*9880d681SAndroid Build Coastguard Worker}
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Workerdeclare { i8, i1 } @llvm.uadd.with.overflow.i8(i8, i8) nounwind readnone
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Workerdefine zeroext i16 @uadd_i16(i16 signext %a, i16 signext %b) nounwind ssp {
54*9880d681SAndroid Build Coastguard Workerentry:
55*9880d681SAndroid Build Coastguard Worker  %uadd = tail call { i16, i1 } @llvm.uadd.with.overflow.i16(i16 %a, i16 %b)
56*9880d681SAndroid Build Coastguard Worker  %cmp = extractvalue { i16, i1 } %uadd, 1
57*9880d681SAndroid Build Coastguard Worker  %uadd.result = extractvalue { i16, i1 } %uadd, 0
58*9880d681SAndroid Build Coastguard Worker  %X = select i1 %cmp, i16 %uadd.result, i16 42
59*9880d681SAndroid Build Coastguard Worker  ret i16 %X
60*9880d681SAndroid Build Coastguard Worker}
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Workerdeclare { i16, i1 } @llvm.uadd.with.overflow.i16(i16, i16) nounwind readnone
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Workerdefine zeroext i32 @uadd_i32(i32 signext %a, i32 signext %b) nounwind ssp {
65*9880d681SAndroid Build Coastguard Workerentry:
66*9880d681SAndroid Build Coastguard Worker  %uadd = tail call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %a, i32 %b)
67*9880d681SAndroid Build Coastguard Worker  %cmp = extractvalue { i32, i1 } %uadd, 1
68*9880d681SAndroid Build Coastguard Worker  %uadd.result = extractvalue { i32, i1 } %uadd, 0
69*9880d681SAndroid Build Coastguard Worker  %X = select i1 %cmp, i32 %uadd.result, i32 42
70*9880d681SAndroid Build Coastguard Worker  ret i32 %X
71*9880d681SAndroid Build Coastguard Worker}
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Workerdeclare { i32, i1 } @llvm.uadd.with.overflow.i32(i32, i32) nounwind readnone
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Worker
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Worker;; ssub
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Workerdefine zeroext i8 @ssub_i8(i8 signext %a, i8 signext %b) nounwind ssp {
80*9880d681SAndroid Build Coastguard Workerentry:
81*9880d681SAndroid Build Coastguard Worker  %ssub = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %a, i8 %b)
82*9880d681SAndroid Build Coastguard Worker  %cmp = extractvalue { i8, i1 } %ssub, 1
83*9880d681SAndroid Build Coastguard Worker  %ssub.result = extractvalue { i8, i1 } %ssub, 0
84*9880d681SAndroid Build Coastguard Worker  %X = select i1 %cmp, i8 %ssub.result, i8 42
85*9880d681SAndroid Build Coastguard Worker  ret i8 %X
86*9880d681SAndroid Build Coastguard Worker}
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Workerdeclare { i8, i1 } @llvm.ssub.with.overflow.i8(i8, i8) nounwind readnone
89*9880d681SAndroid Build Coastguard Worker
90*9880d681SAndroid Build Coastguard Workerdefine zeroext i16 @ssub_i16(i16 signext %a, i16 signext %b) nounwind ssp {
91*9880d681SAndroid Build Coastguard Workerentry:
92*9880d681SAndroid Build Coastguard Worker  %ssub = tail call { i16, i1 } @llvm.ssub.with.overflow.i16(i16 %a, i16 %b)
93*9880d681SAndroid Build Coastguard Worker  %cmp = extractvalue { i16, i1 } %ssub, 1
94*9880d681SAndroid Build Coastguard Worker  %ssub.result = extractvalue { i16, i1 } %ssub, 0
95*9880d681SAndroid Build Coastguard Worker  %X = select i1 %cmp, i16 %ssub.result, i16 42
96*9880d681SAndroid Build Coastguard Worker  ret i16 %X
97*9880d681SAndroid Build Coastguard Worker}
98*9880d681SAndroid Build Coastguard Worker
99*9880d681SAndroid Build Coastguard Workerdeclare { i16, i1 } @llvm.ssub.with.overflow.i16(i16, i16) nounwind readnone
100*9880d681SAndroid Build Coastguard Worker
101*9880d681SAndroid Build Coastguard Workerdefine zeroext i32 @ssub_i32(i32 signext %a, i32 signext %b) nounwind ssp {
102*9880d681SAndroid Build Coastguard Workerentry:
103*9880d681SAndroid Build Coastguard Worker  %ssub = tail call { i32, i1 } @llvm.ssub.with.overflow.i32(i32 %a, i32 %b)
104*9880d681SAndroid Build Coastguard Worker  %cmp = extractvalue { i32, i1 } %ssub, 1
105*9880d681SAndroid Build Coastguard Worker  %ssub.result = extractvalue { i32, i1 } %ssub, 0
106*9880d681SAndroid Build Coastguard Worker  %X = select i1 %cmp, i32 %ssub.result, i32 42
107*9880d681SAndroid Build Coastguard Worker  ret i32 %X
108*9880d681SAndroid Build Coastguard Worker}
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Workerdeclare { i32, i1 } @llvm.ssub.with.overflow.i32(i32, i32) nounwind readnone
111*9880d681SAndroid Build Coastguard Worker
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Worker;; usub
114*9880d681SAndroid Build Coastguard Worker
115*9880d681SAndroid Build Coastguard Workerdefine zeroext i8 @usub_i8(i8 signext %a, i8 signext %b) nounwind ssp {
116*9880d681SAndroid Build Coastguard Workerentry:
117*9880d681SAndroid Build Coastguard Worker  %usub = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 %a, i8 %b)
118*9880d681SAndroid Build Coastguard Worker  %cmp = extractvalue { i8, i1 } %usub, 1
119*9880d681SAndroid Build Coastguard Worker  %usub.result = extractvalue { i8, i1 } %usub, 0
120*9880d681SAndroid Build Coastguard Worker  %X = select i1 %cmp, i8 %usub.result, i8 42
121*9880d681SAndroid Build Coastguard Worker  ret i8 %X
122*9880d681SAndroid Build Coastguard Worker}
123*9880d681SAndroid Build Coastguard Worker
124*9880d681SAndroid Build Coastguard Workerdeclare { i8, i1 } @llvm.usub.with.overflow.i8(i8, i8) nounwind readnone
125*9880d681SAndroid Build Coastguard Worker
126*9880d681SAndroid Build Coastguard Workerdefine zeroext i16 @usub_i16(i16 signext %a, i16 signext %b) nounwind ssp {
127*9880d681SAndroid Build Coastguard Workerentry:
128*9880d681SAndroid Build Coastguard Worker  %usub = tail call { i16, i1 } @llvm.usub.with.overflow.i16(i16 %a, i16 %b)
129*9880d681SAndroid Build Coastguard Worker  %cmp = extractvalue { i16, i1 } %usub, 1
130*9880d681SAndroid Build Coastguard Worker  %usub.result = extractvalue { i16, i1 } %usub, 0
131*9880d681SAndroid Build Coastguard Worker  %X = select i1 %cmp, i16 %usub.result, i16 42
132*9880d681SAndroid Build Coastguard Worker  ret i16 %X
133*9880d681SAndroid Build Coastguard Worker}
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Workerdeclare { i16, i1 } @llvm.usub.with.overflow.i16(i16, i16) nounwind readnone
136*9880d681SAndroid Build Coastguard Worker
137*9880d681SAndroid Build Coastguard Workerdefine zeroext i32 @usub_i32(i32 signext %a, i32 signext %b) nounwind ssp {
138*9880d681SAndroid Build Coastguard Workerentry:
139*9880d681SAndroid Build Coastguard Worker  %usub = tail call { i32, i1 } @llvm.usub.with.overflow.i32(i32 %a, i32 %b)
140*9880d681SAndroid Build Coastguard Worker  %cmp = extractvalue { i32, i1 } %usub, 1
141*9880d681SAndroid Build Coastguard Worker  %usub.result = extractvalue { i32, i1 } %usub, 0
142*9880d681SAndroid Build Coastguard Worker  %X = select i1 %cmp, i32 %usub.result, i32 42
143*9880d681SAndroid Build Coastguard Worker  ret i32 %X
144*9880d681SAndroid Build Coastguard Worker}
145*9880d681SAndroid Build Coastguard Worker
146*9880d681SAndroid Build Coastguard Workerdeclare { i32, i1 } @llvm.usub.with.overflow.i32(i32, i32) nounwind readnone
147*9880d681SAndroid Build Coastguard Worker
148*9880d681SAndroid Build Coastguard Worker
149*9880d681SAndroid Build Coastguard Worker
150*9880d681SAndroid Build Coastguard Worker;; smul
151*9880d681SAndroid Build Coastguard Worker
152*9880d681SAndroid Build Coastguard Workerdefine zeroext i8 @smul_i8(i8 signext %a, i8 signext %b) nounwind ssp {
153*9880d681SAndroid Build Coastguard Workerentry:
154*9880d681SAndroid Build Coastguard Worker  %smul = tail call { i8, i1 } @llvm.smul.with.overflow.i8(i8 %a, i8 %b)
155*9880d681SAndroid Build Coastguard Worker  %cmp = extractvalue { i8, i1 } %smul, 1
156*9880d681SAndroid Build Coastguard Worker  %smul.result = extractvalue { i8, i1 } %smul, 0
157*9880d681SAndroid Build Coastguard Worker  %X = select i1 %cmp, i8 %smul.result, i8 42
158*9880d681SAndroid Build Coastguard Worker  ret i8 %X
159*9880d681SAndroid Build Coastguard Worker}
160*9880d681SAndroid Build Coastguard Worker
161*9880d681SAndroid Build Coastguard Workerdeclare { i8, i1 } @llvm.smul.with.overflow.i8(i8, i8) nounwind readnone
162*9880d681SAndroid Build Coastguard Worker
163*9880d681SAndroid Build Coastguard Workerdefine zeroext i16 @smul_i16(i16 signext %a, i16 signext %b) nounwind ssp {
164*9880d681SAndroid Build Coastguard Workerentry:
165*9880d681SAndroid Build Coastguard Worker  %smul = tail call { i16, i1 } @llvm.smul.with.overflow.i16(i16 %a, i16 %b)
166*9880d681SAndroid Build Coastguard Worker  %cmp = extractvalue { i16, i1 } %smul, 1
167*9880d681SAndroid Build Coastguard Worker  %smul.result = extractvalue { i16, i1 } %smul, 0
168*9880d681SAndroid Build Coastguard Worker  %X = select i1 %cmp, i16 %smul.result, i16 42
169*9880d681SAndroid Build Coastguard Worker  ret i16 %X
170*9880d681SAndroid Build Coastguard Worker}
171*9880d681SAndroid Build Coastguard Worker
172*9880d681SAndroid Build Coastguard Workerdeclare { i16, i1 } @llvm.smul.with.overflow.i16(i16, i16) nounwind readnone
173*9880d681SAndroid Build Coastguard Worker
174*9880d681SAndroid Build Coastguard Workerdefine zeroext i32 @smul_i32(i32 signext %a, i32 signext %b) nounwind ssp {
175*9880d681SAndroid Build Coastguard Workerentry:
176*9880d681SAndroid Build Coastguard Worker  %smul = tail call { i32, i1 } @llvm.smul.with.overflow.i32(i32 %a, i32 %b)
177*9880d681SAndroid Build Coastguard Worker  %cmp = extractvalue { i32, i1 } %smul, 1
178*9880d681SAndroid Build Coastguard Worker  %smul.result = extractvalue { i32, i1 } %smul, 0
179*9880d681SAndroid Build Coastguard Worker  %X = select i1 %cmp, i32 %smul.result, i32 42
180*9880d681SAndroid Build Coastguard Worker  ret i32 %X
181*9880d681SAndroid Build Coastguard Worker}
182*9880d681SAndroid Build Coastguard Worker
183*9880d681SAndroid Build Coastguard Workerdeclare { i32, i1 } @llvm.smul.with.overflow.i32(i32, i32) nounwind readnone
184*9880d681SAndroid Build Coastguard Worker
185*9880d681SAndroid Build Coastguard Worker
186*9880d681SAndroid Build Coastguard Worker;; umul
187*9880d681SAndroid Build Coastguard Worker
188*9880d681SAndroid Build Coastguard Workerdefine zeroext i8 @umul_i8(i8 signext %a, i8 signext %b) nounwind ssp {
189*9880d681SAndroid Build Coastguard Workerentry:
190*9880d681SAndroid Build Coastguard Worker  %umul = tail call { i8, i1 } @llvm.umul.with.overflow.i8(i8 %a, i8 %b)
191*9880d681SAndroid Build Coastguard Worker  %cmp = extractvalue { i8, i1 } %umul, 1
192*9880d681SAndroid Build Coastguard Worker  %umul.result = extractvalue { i8, i1 } %umul, 0
193*9880d681SAndroid Build Coastguard Worker  %X = select i1 %cmp, i8 %umul.result, i8 42
194*9880d681SAndroid Build Coastguard Worker  ret i8 %X
195*9880d681SAndroid Build Coastguard Worker}
196*9880d681SAndroid Build Coastguard Worker
197*9880d681SAndroid Build Coastguard Workerdeclare { i8, i1 } @llvm.umul.with.overflow.i8(i8, i8) nounwind readnone
198*9880d681SAndroid Build Coastguard Worker
199*9880d681SAndroid Build Coastguard Workerdefine zeroext i16 @umul_i16(i16 signext %a, i16 signext %b) nounwind ssp {
200*9880d681SAndroid Build Coastguard Workerentry:
201*9880d681SAndroid Build Coastguard Worker  %umul = tail call { i16, i1 } @llvm.umul.with.overflow.i16(i16 %a, i16 %b)
202*9880d681SAndroid Build Coastguard Worker  %cmp = extractvalue { i16, i1 } %umul, 1
203*9880d681SAndroid Build Coastguard Worker  %umul.result = extractvalue { i16, i1 } %umul, 0
204*9880d681SAndroid Build Coastguard Worker  %X = select i1 %cmp, i16 %umul.result, i16 42
205*9880d681SAndroid Build Coastguard Worker  ret i16 %X
206*9880d681SAndroid Build Coastguard Worker}
207*9880d681SAndroid Build Coastguard Worker
208*9880d681SAndroid Build Coastguard Workerdeclare { i16, i1 } @llvm.umul.with.overflow.i16(i16, i16) nounwind readnone
209*9880d681SAndroid Build Coastguard Worker
210*9880d681SAndroid Build Coastguard Workerdefine zeroext i32 @umul_i32(i32 signext %a, i32 signext %b) nounwind ssp {
211*9880d681SAndroid Build Coastguard Workerentry:
212*9880d681SAndroid Build Coastguard Worker  %umul = tail call { i32, i1 } @llvm.umul.with.overflow.i32(i32 %a, i32 %b)
213*9880d681SAndroid Build Coastguard Worker  %cmp = extractvalue { i32, i1 } %umul, 1
214*9880d681SAndroid Build Coastguard Worker  %umul.result = extractvalue { i32, i1 } %umul, 0
215*9880d681SAndroid Build Coastguard Worker  %X = select i1 %cmp, i32 %umul.result, i32 42
216*9880d681SAndroid Build Coastguard Worker  ret i32 %X
217*9880d681SAndroid Build Coastguard Worker}
218*9880d681SAndroid Build Coastguard Worker
219*9880d681SAndroid Build Coastguard Workerdeclare { i32, i1 } @llvm.umul.with.overflow.i32(i32, i32) nounwind readnone
220*9880d681SAndroid Build Coastguard Worker
221