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