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