blob: 6a98037f29d67e48fd9672bf3476e60b0dba5dea [file] [log] [blame]
Juergen Ributzka4952c352014-08-19 19:44:06 +00001; RUN: llc -mtriple=x86_64-darwin-unknown < %s | FileCheck %s --check-prefix=CHECK --check-prefix=SDAG
2; RUN: llc -mtriple=x86_64-darwin-unknown -fast-isel -fast-isel-abort < %s | FileCheck %s --check-prefix=CHECK --check-prefix=FAST
Juergen Ributzka2dace6e2014-06-10 23:52:44 +00003
4;
5; Get the actual value of the overflow bit.
6;
7; SADDO reg, reg
8define zeroext i1 @saddo.i8(i8 signext %v1, i8 signext %v2, i8* %res) {
9entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +000010; CHECK-LABEL: saddo.i8
11; CHECK: addb %sil, %dil
12; CHECK-NEXT: seto %al
Juergen Ributzka2dace6e2014-06-10 23:52:44 +000013 %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 %v1, i8 %v2)
14 %val = extractvalue {i8, i1} %t, 0
15 %obit = extractvalue {i8, i1} %t, 1
16 store i8 %val, i8* %res
17 ret i1 %obit
18}
19
20define zeroext i1 @saddo.i16(i16 %v1, i16 %v2, i16* %res) {
21entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +000022; CHECK-LABEL: saddo.i16
23; CHECK: addw %si, %di
24; CHECK-NEXT: seto %al
Juergen Ributzka2dace6e2014-06-10 23:52:44 +000025 %t = call {i16, i1} @llvm.sadd.with.overflow.i16(i16 %v1, i16 %v2)
26 %val = extractvalue {i16, i1} %t, 0
27 %obit = extractvalue {i16, i1} %t, 1
28 store i16 %val, i16* %res
29 ret i1 %obit
30}
31
32define zeroext i1 @saddo.i32(i32 %v1, i32 %v2, i32* %res) {
33entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +000034; CHECK-LABEL: saddo.i32
35; CHECK: addl %esi, %edi
36; CHECK-NEXT: seto %al
Juergen Ributzka2dace6e2014-06-10 23:52:44 +000037 %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 %v2)
38 %val = extractvalue {i32, i1} %t, 0
39 %obit = extractvalue {i32, i1} %t, 1
40 store i32 %val, i32* %res
41 ret i1 %obit
42}
43
44define zeroext i1 @saddo.i64(i64 %v1, i64 %v2, i64* %res) {
45entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +000046; CHECK-LABEL: saddo.i64
47; CHECK: addq %rsi, %rdi
48; CHECK-NEXT: seto %al
Juergen Ributzka2dace6e2014-06-10 23:52:44 +000049 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 %v2)
50 %val = extractvalue {i64, i1} %t, 0
51 %obit = extractvalue {i64, i1} %t, 1
52 store i64 %val, i64* %res
53 ret i1 %obit
54}
55
Juergen Ributzka40226142014-08-08 17:21:37 +000056; SADDO reg, 1 | INC
57define zeroext i1 @saddo.inc.i8(i8 %v1, i8* %res) {
Juergen Ributzka2dace6e2014-06-10 23:52:44 +000058entry:
Juergen Ributzka40226142014-08-08 17:21:37 +000059; CHECK-LABEL: saddo.inc.i8
60; CHECK: incb %dil
61; CHECK-NEXT: seto %al
62 %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 %v1, i8 1)
63 %val = extractvalue {i8, i1} %t, 0
64 %obit = extractvalue {i8, i1} %t, 1
65 store i8 %val, i8* %res
66 ret i1 %obit
67}
68
69define zeroext i1 @saddo.inc.i16(i16 %v1, i16* %res) {
70entry:
71; CHECK-LABEL: saddo.inc.i16
72; CHECK: incw %di
73; CHECK-NEXT: seto %al
74 %t = call {i16, i1} @llvm.sadd.with.overflow.i16(i16 %v1, i16 1)
75 %val = extractvalue {i16, i1} %t, 0
76 %obit = extractvalue {i16, i1} %t, 1
77 store i16 %val, i16* %res
78 ret i1 %obit
79}
80
81define zeroext i1 @saddo.inc.i32(i32 %v1, i32* %res) {
82entry:
83; CHECK-LABEL: saddo.inc.i32
84; CHECK: incl %edi
85; CHECK-NEXT: seto %al
86 %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 1)
87 %val = extractvalue {i32, i1} %t, 0
88 %obit = extractvalue {i32, i1} %t, 1
89 store i32 %val, i32* %res
90 ret i1 %obit
91}
92
93define zeroext i1 @saddo.inc.i64(i64 %v1, i64* %res) {
94entry:
95; CHECK-LABEL: saddo.inc.i64
96; CHECK: incq %rdi
97; CHECK-NEXT: seto %al
Juergen Ributzka2dace6e2014-06-10 23:52:44 +000098 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 1)
99 %val = extractvalue {i64, i1} %t, 0
100 %obit = extractvalue {i64, i1} %t, 1
101 store i64 %val, i64* %res
102 ret i1 %obit
103}
104
Juergen Ributzka40226142014-08-08 17:21:37 +0000105; SADDO reg, imm | imm, reg
Juergen Ributzka2dace6e2014-06-10 23:52:44 +0000106; FIXME: DAG doesn't optimize immediates on the LHS.
Juergen Ributzka40226142014-08-08 17:21:37 +0000107define zeroext i1 @saddo.i64imm1(i64 %v1, i64* %res) {
Juergen Ributzka2dace6e2014-06-10 23:52:44 +0000108entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +0000109; SDAG-LABEL: saddo.i64imm1
110; SDAG: mov
111; SDAG-NEXT: addq
112; SDAG-NEXT: seto
113; FAST-LABEL: saddo.i64imm1
114; FAST: addq $2, %rdi
115; FAST-NEXT: seto %al
Juergen Ributzka40226142014-08-08 17:21:37 +0000116 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 2, i64 %v1)
Juergen Ributzka2dace6e2014-06-10 23:52:44 +0000117 %val = extractvalue {i64, i1} %t, 0
118 %obit = extractvalue {i64, i1} %t, 1
119 store i64 %val, i64* %res
120 ret i1 %obit
121}
122
123; Check boundary conditions for large immediates.
Juergen Ributzka40226142014-08-08 17:21:37 +0000124define zeroext i1 @saddo.i64imm2(i64 %v1, i64* %res) {
Juergen Ributzka2dace6e2014-06-10 23:52:44 +0000125entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +0000126; SDAG-LABEL: saddo.i64imm2
127; SDAG: addq $-2147483648, %rdi
128; SDAG-NEXT: seto %al
129; FAST-LABEL: saddo.i64imm2
130; FAST: addq $-2147483648, %rdi
131; FAST-NEXT: seto %al
Juergen Ributzka2dace6e2014-06-10 23:52:44 +0000132 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 -2147483648)
133 %val = extractvalue {i64, i1} %t, 0
134 %obit = extractvalue {i64, i1} %t, 1
135 store i64 %val, i64* %res
136 ret i1 %obit
137}
138
Juergen Ributzka40226142014-08-08 17:21:37 +0000139define zeroext i1 @saddo.i64imm3(i64 %v1, i64* %res) {
Juergen Ributzka2dace6e2014-06-10 23:52:44 +0000140entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +0000141; CHECK-LABEL: saddo.i64imm3
142; CHECK: movabsq $-21474836489, %[[REG:[a-z]+]]
143; CHECK-NEXT: addq %rdi, %[[REG]]
144; CHECK-NEXT: seto
Juergen Ributzka2dace6e2014-06-10 23:52:44 +0000145 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 -21474836489)
146 %val = extractvalue {i64, i1} %t, 0
147 %obit = extractvalue {i64, i1} %t, 1
148 store i64 %val, i64* %res
149 ret i1 %obit
150}
151
Juergen Ributzka40226142014-08-08 17:21:37 +0000152define zeroext i1 @saddo.i64imm4(i64 %v1, i64* %res) {
Juergen Ributzka2dace6e2014-06-10 23:52:44 +0000153entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +0000154; CHECK-LABEL: saddo.i64imm4
155; CHECK: addq $2147483647, %rdi
156; CHECK-NEXT: seto
Juergen Ributzka2dace6e2014-06-10 23:52:44 +0000157 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 2147483647)
158 %val = extractvalue {i64, i1} %t, 0
159 %obit = extractvalue {i64, i1} %t, 1
160 store i64 %val, i64* %res
161 ret i1 %obit
162}
163
Juergen Ributzka40226142014-08-08 17:21:37 +0000164define zeroext i1 @saddo.i64imm5(i64 %v1, i64* %res) {
Juergen Ributzka2dace6e2014-06-10 23:52:44 +0000165entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +0000166; CHECK-LABEL: saddo.i64imm5
167; CHECK: movl $2147483648
168; CHECK: addq %rdi
169; CHECK-NEXT: seto
Juergen Ributzka2dace6e2014-06-10 23:52:44 +0000170 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 2147483648)
171 %val = extractvalue {i64, i1} %t, 0
172 %obit = extractvalue {i64, i1} %t, 1
173 store i64 %val, i64* %res
174 ret i1 %obit
175}
176
177; UADDO
178define zeroext i1 @uaddo.i32(i32 %v1, i32 %v2, i32* %res) {
179entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +0000180; CHECK-LABEL: uaddo.i32
181; CHECK: addl %esi, %edi
182; CHECK-NEXT: setb %al
Juergen Ributzka2dace6e2014-06-10 23:52:44 +0000183 %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 %v2)
184 %val = extractvalue {i32, i1} %t, 0
185 %obit = extractvalue {i32, i1} %t, 1
186 store i32 %val, i32* %res
187 ret i1 %obit
188}
189
190define zeroext i1 @uaddo.i64(i64 %v1, i64 %v2, i64* %res) {
191entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +0000192; CHECK-LABEL: uaddo.i64
193; CHECK: addq %rsi, %rdi
194; CHECK-NEXT: setb %al
Juergen Ributzka2dace6e2014-06-10 23:52:44 +0000195 %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %v1, i64 %v2)
196 %val = extractvalue {i64, i1} %t, 0
197 %obit = extractvalue {i64, i1} %t, 1
198 store i64 %val, i64* %res
199 ret i1 %obit
200}
201
Juergen Ributzka793f28d2014-08-08 18:47:04 +0000202; UADDO reg, 1 | NOT INC
203define zeroext i1 @uaddo.inc.i8(i8 %v1, i8* %res) {
204entry:
205; CHECK-LABEL: uaddo.inc.i8
206; CHECK-NOT: incb %dil
207 %t = call {i8, i1} @llvm.uadd.with.overflow.i8(i8 %v1, i8 1)
208 %val = extractvalue {i8, i1} %t, 0
209 %obit = extractvalue {i8, i1} %t, 1
210 store i8 %val, i8* %res
211 ret i1 %obit
212}
213
214define zeroext i1 @uaddo.inc.i16(i16 %v1, i16* %res) {
215entry:
216; CHECK-LABEL: uaddo.inc.i16
217; CHECK-NOT: incw %di
218 %t = call {i16, i1} @llvm.uadd.with.overflow.i16(i16 %v1, i16 1)
219 %val = extractvalue {i16, i1} %t, 0
220 %obit = extractvalue {i16, i1} %t, 1
221 store i16 %val, i16* %res
222 ret i1 %obit
223}
224
225define zeroext i1 @uaddo.inc.i32(i32 %v1, i32* %res) {
226entry:
227; CHECK-LABEL: uaddo.inc.i32
228; CHECK-NOT: incl %edi
229 %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 1)
230 %val = extractvalue {i32, i1} %t, 0
231 %obit = extractvalue {i32, i1} %t, 1
232 store i32 %val, i32* %res
233 ret i1 %obit
234}
235
236define zeroext i1 @uaddo.inc.i64(i64 %v1, i64* %res) {
237entry:
238; CHECK-LABEL: uaddo.inc.i64
239; CHECK-NOT: incq %rdi
240 %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %v1, i64 1)
241 %val = extractvalue {i64, i1} %t, 0
242 %obit = extractvalue {i64, i1} %t, 1
243 store i64 %val, i64* %res
244 ret i1 %obit
245}
246
Juergen Ributzka2dace6e2014-06-10 23:52:44 +0000247; SSUBO
248define zeroext i1 @ssubo.i32(i32 %v1, i32 %v2, i32* %res) {
249entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +0000250; CHECK-LABEL: ssubo.i32
251; CHECK: subl %esi, %edi
252; CHECK-NEXT: seto %al
Juergen Ributzka2dace6e2014-06-10 23:52:44 +0000253 %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %v1, i32 %v2)
254 %val = extractvalue {i32, i1} %t, 0
255 %obit = extractvalue {i32, i1} %t, 1
256 store i32 %val, i32* %res
257 ret i1 %obit
258}
259
260define zeroext i1 @ssubo.i64(i64 %v1, i64 %v2, i64* %res) {
261entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +0000262; CHECK-LABEL: ssubo.i64
263; CHECK: subq %rsi, %rdi
264; CHECK-NEXT: seto %al
Juergen Ributzka2dace6e2014-06-10 23:52:44 +0000265 %t = call {i64, i1} @llvm.ssub.with.overflow.i64(i64 %v1, i64 %v2)
266 %val = extractvalue {i64, i1} %t, 0
267 %obit = extractvalue {i64, i1} %t, 1
268 store i64 %val, i64* %res
269 ret i1 %obit
270}
271
272; USUBO
273define zeroext i1 @usubo.i32(i32 %v1, i32 %v2, i32* %res) {
274entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +0000275; CHECK-LABEL: usubo.i32
276; CHECK: subl %esi, %edi
277; CHECK-NEXT: setb %al
Juergen Ributzka2dace6e2014-06-10 23:52:44 +0000278 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %v1, i32 %v2)
279 %val = extractvalue {i32, i1} %t, 0
280 %obit = extractvalue {i32, i1} %t, 1
281 store i32 %val, i32* %res
282 ret i1 %obit
283}
284
285define zeroext i1 @usubo.i64(i64 %v1, i64 %v2, i64* %res) {
286entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +0000287; CHECK-LABEL: usubo.i64
288; CHECK: subq %rsi, %rdi
289; CHECK-NEXT: setb %al
Juergen Ributzka2dace6e2014-06-10 23:52:44 +0000290 %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %v1, i64 %v2)
291 %val = extractvalue {i64, i1} %t, 0
292 %obit = extractvalue {i64, i1} %t, 1
293 store i64 %val, i64* %res
294 ret i1 %obit
295}
296
297; SMULO
Juergen Ributzka665ea712014-07-07 21:52:21 +0000298define zeroext i1 @smulo.i8(i8 %v1, i8 %v2, i8* %res) {
299entry:
300; FAST-LABEL: smulo.i8
301; FAST: movb %dil, %al
302; FAST-NEXT: imulb %sil
303; FAST-NEXT: seto %cl
304 %t = call {i8, i1} @llvm.smul.with.overflow.i8(i8 %v1, i8 %v2)
305 %val = extractvalue {i8, i1} %t, 0
306 %obit = extractvalue {i8, i1} %t, 1
307 store i8 %val, i8* %res
308 ret i1 %obit
309}
310
311define zeroext i1 @smulo.i16(i16 %v1, i16 %v2, i16* %res) {
312entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +0000313; CHECK-LABEL: smulo.i16
314; CHECK: imulw %si, %di
315; CHECK-NEXT: seto %al
Juergen Ributzka665ea712014-07-07 21:52:21 +0000316 %t = call {i16, i1} @llvm.smul.with.overflow.i16(i16 %v1, i16 %v2)
317 %val = extractvalue {i16, i1} %t, 0
318 %obit = extractvalue {i16, i1} %t, 1
319 store i16 %val, i16* %res
320 ret i1 %obit
321}
322
Juergen Ributzka2dace6e2014-06-10 23:52:44 +0000323define zeroext i1 @smulo.i32(i32 %v1, i32 %v2, i32* %res) {
324entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +0000325; CHECK-LABEL: smulo.i32
326; CHECK: imull %esi, %edi
327; CHECK-NEXT: seto %al
Juergen Ributzka2dace6e2014-06-10 23:52:44 +0000328 %t = call {i32, i1} @llvm.smul.with.overflow.i32(i32 %v1, i32 %v2)
329 %val = extractvalue {i32, i1} %t, 0
330 %obit = extractvalue {i32, i1} %t, 1
331 store i32 %val, i32* %res
332 ret i1 %obit
333}
334
335define zeroext i1 @smulo.i64(i64 %v1, i64 %v2, i64* %res) {
336entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +0000337; CHECK-LABEL: smulo.i64
338; CHECK: imulq %rsi, %rdi
339; CHECK-NEXT: seto %al
Juergen Ributzka2dace6e2014-06-10 23:52:44 +0000340 %t = call {i64, i1} @llvm.smul.with.overflow.i64(i64 %v1, i64 %v2)
341 %val = extractvalue {i64, i1} %t, 0
342 %obit = extractvalue {i64, i1} %t, 1
343 store i64 %val, i64* %res
344 ret i1 %obit
345}
346
347; UMULO
Juergen Ributzka665ea712014-07-07 21:52:21 +0000348define zeroext i1 @umulo.i8(i8 %v1, i8 %v2, i8* %res) {
349entry:
350; FAST-LABEL: umulo.i8
351; FAST: movb %dil, %al
352; FAST-NEXT: mulb %sil
353; FAST-NEXT: seto %cl
354 %t = call {i8, i1} @llvm.umul.with.overflow.i8(i8 %v1, i8 %v2)
355 %val = extractvalue {i8, i1} %t, 0
356 %obit = extractvalue {i8, i1} %t, 1
357 store i8 %val, i8* %res
358 ret i1 %obit
359}
360
361define zeroext i1 @umulo.i16(i16 %v1, i16 %v2, i16* %res) {
362entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +0000363; CHECK-LABEL: umulo.i16
364; CHECK: mulw %si
365; CHECK-NEXT: seto
Juergen Ributzka665ea712014-07-07 21:52:21 +0000366 %t = call {i16, i1} @llvm.umul.with.overflow.i16(i16 %v1, i16 %v2)
367 %val = extractvalue {i16, i1} %t, 0
368 %obit = extractvalue {i16, i1} %t, 1
369 store i16 %val, i16* %res
370 ret i1 %obit
371}
372
Juergen Ributzka2dace6e2014-06-10 23:52:44 +0000373define zeroext i1 @umulo.i32(i32 %v1, i32 %v2, i32* %res) {
374entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +0000375; CHECK-LABEL: umulo.i32
376; CHECK: mull %esi
377; CHECK-NEXT: seto
Juergen Ributzka2dace6e2014-06-10 23:52:44 +0000378 %t = call {i32, i1} @llvm.umul.with.overflow.i32(i32 %v1, i32 %v2)
379 %val = extractvalue {i32, i1} %t, 0
380 %obit = extractvalue {i32, i1} %t, 1
381 store i32 %val, i32* %res
382 ret i1 %obit
383}
384
385define zeroext i1 @umulo.i64(i64 %v1, i64 %v2, i64* %res) {
386entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +0000387; CHECK-LABEL: umulo.i64
388; CHECK: mulq %rsi
389; CHECK-NEXT: seto
Juergen Ributzka2dace6e2014-06-10 23:52:44 +0000390 %t = call {i64, i1} @llvm.umul.with.overflow.i64(i64 %v1, i64 %v2)
391 %val = extractvalue {i64, i1} %t, 0
392 %obit = extractvalue {i64, i1} %t, 1
393 store i64 %val, i64* %res
394 ret i1 %obit
395}
396
Juergen Ributzka2bce27e2014-06-24 23:51:21 +0000397;
398; Check the use of the overflow bit in combination with a select instruction.
399;
400define i32 @saddo.select.i32(i32 %v1, i32 %v2) {
401entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +0000402; CHECK-LABEL: saddo.select.i32
403; CHECK: addl %esi, %eax
404; CHECK-NEXT: cmovol %edi, %esi
Juergen Ributzka2bce27e2014-06-24 23:51:21 +0000405 %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 %v2)
406 %obit = extractvalue {i32, i1} %t, 1
407 %ret = select i1 %obit, i32 %v1, i32 %v2
408 ret i32 %ret
409}
410
411define i64 @saddo.select.i64(i64 %v1, i64 %v2) {
412entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +0000413; CHECK-LABEL: saddo.select.i64
414; CHECK: addq %rsi, %rax
415; CHECK-NEXT: cmovoq %rdi, %rsi
Juergen Ributzka2bce27e2014-06-24 23:51:21 +0000416 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 %v2)
417 %obit = extractvalue {i64, i1} %t, 1
418 %ret = select i1 %obit, i64 %v1, i64 %v2
419 ret i64 %ret
420}
421
422define i32 @uaddo.select.i32(i32 %v1, i32 %v2) {
423entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +0000424; CHECK-LABEL: uaddo.select.i32
425; CHECK: addl %esi, %eax
426; CHECK-NEXT: cmovbl %edi, %esi
Juergen Ributzka2bce27e2014-06-24 23:51:21 +0000427 %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 %v2)
428 %obit = extractvalue {i32, i1} %t, 1
429 %ret = select i1 %obit, i32 %v1, i32 %v2
430 ret i32 %ret
431}
432
433define i64 @uaddo.select.i64(i64 %v1, i64 %v2) {
434entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +0000435; CHECK-LABEL: uaddo.select.i64
436; CHECK: addq %rsi, %rax
437; CHECK-NEXT: cmovbq %rdi, %rsi
Juergen Ributzka2bce27e2014-06-24 23:51:21 +0000438 %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %v1, i64 %v2)
439 %obit = extractvalue {i64, i1} %t, 1
440 %ret = select i1 %obit, i64 %v1, i64 %v2
441 ret i64 %ret
442}
443
444define i32 @ssubo.select.i32(i32 %v1, i32 %v2) {
445entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +0000446; CHECK-LABEL: ssubo.select.i32
447; CHECK: cmpl %esi, %edi
448; CHECK-NEXT: cmovol %edi, %esi
Juergen Ributzka2bce27e2014-06-24 23:51:21 +0000449 %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %v1, i32 %v2)
450 %obit = extractvalue {i32, i1} %t, 1
451 %ret = select i1 %obit, i32 %v1, i32 %v2
452 ret i32 %ret
453}
454
455define i64 @ssubo.select.i64(i64 %v1, i64 %v2) {
456entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +0000457; CHECK-LABEL: ssubo.select.i64
458; CHECK: cmpq %rsi, %rdi
459; CHECK-NEXT: cmovoq %rdi, %rsi
Juergen Ributzka2bce27e2014-06-24 23:51:21 +0000460 %t = call {i64, i1} @llvm.ssub.with.overflow.i64(i64 %v1, i64 %v2)
461 %obit = extractvalue {i64, i1} %t, 1
462 %ret = select i1 %obit, i64 %v1, i64 %v2
463 ret i64 %ret
464}
465
466define i32 @usubo.select.i32(i32 %v1, i32 %v2) {
467entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +0000468; CHECK-LABEL: usubo.select.i32
469; CHECK: cmpl %esi, %edi
470; CHECK-NEXT: cmovbl %edi, %esi
Juergen Ributzka2bce27e2014-06-24 23:51:21 +0000471 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %v1, i32 %v2)
472 %obit = extractvalue {i32, i1} %t, 1
473 %ret = select i1 %obit, i32 %v1, i32 %v2
474 ret i32 %ret
475}
476
477define i64 @usubo.select.i64(i64 %v1, i64 %v2) {
478entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +0000479; CHECK-LABEL: usubo.select.i64
480; CHECK: cmpq %rsi, %rdi
481; CHECK-NEXT: cmovbq %rdi, %rsi
Juergen Ributzka2bce27e2014-06-24 23:51:21 +0000482 %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %v1, i64 %v2)
483 %obit = extractvalue {i64, i1} %t, 1
484 %ret = select i1 %obit, i64 %v1, i64 %v2
485 ret i64 %ret
486}
487
488define i32 @smulo.select.i32(i32 %v1, i32 %v2) {
489entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +0000490; CHECK-LABEL: smulo.select.i32
491; CHECK: imull %esi, %eax
492; CHECK-NEXT: cmovol %edi, %esi
Juergen Ributzka2bce27e2014-06-24 23:51:21 +0000493 %t = call {i32, i1} @llvm.smul.with.overflow.i32(i32 %v1, i32 %v2)
494 %obit = extractvalue {i32, i1} %t, 1
495 %ret = select i1 %obit, i32 %v1, i32 %v2
496 ret i32 %ret
497}
498
499define i64 @smulo.select.i64(i64 %v1, i64 %v2) {
500entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +0000501; CHECK-LABEL: smulo.select.i64
502; CHECK: imulq %rsi, %rax
503; CHECK-NEXT: cmovoq %rdi, %rsi
Juergen Ributzka2bce27e2014-06-24 23:51:21 +0000504 %t = call {i64, i1} @llvm.smul.with.overflow.i64(i64 %v1, i64 %v2)
505 %obit = extractvalue {i64, i1} %t, 1
506 %ret = select i1 %obit, i64 %v1, i64 %v2
507 ret i64 %ret
508}
509
510define i32 @umulo.select.i32(i32 %v1, i32 %v2) {
511entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +0000512; CHECK-LABEL: umulo.select.i32
513; CHECK: mull %esi
514; CHECK-NEXT: cmovol %edi, %esi
Juergen Ributzka2bce27e2014-06-24 23:51:21 +0000515 %t = call {i32, i1} @llvm.umul.with.overflow.i32(i32 %v1, i32 %v2)
516 %obit = extractvalue {i32, i1} %t, 1
517 %ret = select i1 %obit, i32 %v1, i32 %v2
518 ret i32 %ret
519}
520
521define i64 @umulo.select.i64(i64 %v1, i64 %v2) {
522entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +0000523; CHECK-LABEL: umulo.select.i64
524; CHECK: mulq %rsi
525; CHECK-NEXT: cmovoq %rdi, %rsi
Juergen Ributzka2bce27e2014-06-24 23:51:21 +0000526 %t = call {i64, i1} @llvm.umul.with.overflow.i64(i64 %v1, i64 %v2)
527 %obit = extractvalue {i64, i1} %t, 1
528 %ret = select i1 %obit, i64 %v1, i64 %v2
529 ret i64 %ret
530}
531
532
533;
534; Check the use of the overflow bit in combination with a branch instruction.
535;
536define zeroext i1 @saddo.br.i32(i32 %v1, i32 %v2) {
537entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +0000538; CHECK-LABEL: saddo.br.i32
539; CHECK: addl %esi, %edi
540; CHECK-NEXT: jo
Juergen Ributzka2bce27e2014-06-24 23:51:21 +0000541 %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 %v2)
542 %val = extractvalue {i32, i1} %t, 0
543 %obit = extractvalue {i32, i1} %t, 1
544 br i1 %obit, label %overflow, label %continue, !prof !0
545
546overflow:
547 ret i1 false
548
549continue:
550 ret i1 true
551}
552
553define zeroext i1 @saddo.br.i64(i64 %v1, i64 %v2) {
554entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +0000555; CHECK-LABEL: saddo.br.i64
556; CHECK: addq %rsi, %rdi
557; CHECK-NEXT: jo
Juergen Ributzka2bce27e2014-06-24 23:51:21 +0000558 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 %v2)
559 %val = extractvalue {i64, i1} %t, 0
560 %obit = extractvalue {i64, i1} %t, 1
561 br i1 %obit, label %overflow, label %continue, !prof !0
562
563overflow:
564 ret i1 false
565
566continue:
567 ret i1 true
568}
569
570define zeroext i1 @uaddo.br.i32(i32 %v1, i32 %v2) {
571entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +0000572; CHECK-LABEL: uaddo.br.i32
573; CHECK: addl %esi, %edi
574; CHECK-NEXT: jb
Juergen Ributzka2bce27e2014-06-24 23:51:21 +0000575 %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 %v2)
576 %val = extractvalue {i32, i1} %t, 0
577 %obit = extractvalue {i32, i1} %t, 1
578 br i1 %obit, label %overflow, label %continue, !prof !0
579
580overflow:
581 ret i1 false
582
583continue:
584 ret i1 true
585}
586
587define zeroext i1 @uaddo.br.i64(i64 %v1, i64 %v2) {
588entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +0000589; CHECK-LABEL: uaddo.br.i64
590; CHECK: addq %rsi, %rdi
591; CHECK-NEXT: jb
Juergen Ributzka2bce27e2014-06-24 23:51:21 +0000592 %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %v1, i64 %v2)
593 %val = extractvalue {i64, i1} %t, 0
594 %obit = extractvalue {i64, i1} %t, 1
595 br i1 %obit, label %overflow, label %continue, !prof !0
596
597overflow:
598 ret i1 false
599
600continue:
601 ret i1 true
602}
603
604define zeroext i1 @ssubo.br.i32(i32 %v1, i32 %v2) {
605entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +0000606; CHECK-LABEL: ssubo.br.i32
607; CHECK: cmpl %esi, %edi
608; CHECK-NEXT: jo
Juergen Ributzka2bce27e2014-06-24 23:51:21 +0000609 %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %v1, i32 %v2)
610 %val = extractvalue {i32, i1} %t, 0
611 %obit = extractvalue {i32, i1} %t, 1
612 br i1 %obit, label %overflow, label %continue, !prof !0
613
614overflow:
615 ret i1 false
616
617continue:
618 ret i1 true
619}
620
621define zeroext i1 @ssubo.br.i64(i64 %v1, i64 %v2) {
622entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +0000623; CHECK-LABEL: ssubo.br.i64
624; CHECK: cmpq %rsi, %rdi
625; CHECK-NEXT: jo
Juergen Ributzka2bce27e2014-06-24 23:51:21 +0000626 %t = call {i64, i1} @llvm.ssub.with.overflow.i64(i64 %v1, i64 %v2)
627 %val = extractvalue {i64, i1} %t, 0
628 %obit = extractvalue {i64, i1} %t, 1
629 br i1 %obit, label %overflow, label %continue, !prof !0
630
631overflow:
632 ret i1 false
633
634continue:
635 ret i1 true
636}
637
638define zeroext i1 @usubo.br.i32(i32 %v1, i32 %v2) {
639entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +0000640; CHECK-LABEL: usubo.br.i32
641; CHECK: cmpl %esi, %edi
642; CHECK-NEXT: jb
Juergen Ributzka2bce27e2014-06-24 23:51:21 +0000643 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %v1, i32 %v2)
644 %val = extractvalue {i32, i1} %t, 0
645 %obit = extractvalue {i32, i1} %t, 1
646 br i1 %obit, label %overflow, label %continue, !prof !0
647
648overflow:
649 ret i1 false
650
651continue:
652 ret i1 true
653}
654
655define zeroext i1 @usubo.br.i64(i64 %v1, i64 %v2) {
656entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +0000657; CHECK-LABEL: usubo.br.i64
658; CHECK: cmpq %rsi, %rdi
659; CHECK-NEXT: jb
Juergen Ributzka2bce27e2014-06-24 23:51:21 +0000660 %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %v1, i64 %v2)
661 %val = extractvalue {i64, i1} %t, 0
662 %obit = extractvalue {i64, i1} %t, 1
663 br i1 %obit, label %overflow, label %continue, !prof !0
664
665overflow:
666 ret i1 false
667
668continue:
669 ret i1 true
670}
671
672define zeroext i1 @smulo.br.i32(i32 %v1, i32 %v2) {
673entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +0000674; CHECK-LABEL: smulo.br.i32
675; CHECK: imull %esi, %edi
676; CHECK-NEXT: jo
Juergen Ributzka2bce27e2014-06-24 23:51:21 +0000677 %t = call {i32, i1} @llvm.smul.with.overflow.i32(i32 %v1, i32 %v2)
678 %val = extractvalue {i32, i1} %t, 0
679 %obit = extractvalue {i32, i1} %t, 1
680 br i1 %obit, label %overflow, label %continue, !prof !0
681
682overflow:
683 ret i1 false
684
685continue:
686 ret i1 true
687}
688
689define zeroext i1 @smulo.br.i64(i64 %v1, i64 %v2) {
690entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +0000691; CHECK-LABEL: smulo.br.i64
692; CHECK: imulq %rsi, %rdi
693; CHECK-NEXT: jo
Juergen Ributzka2bce27e2014-06-24 23:51:21 +0000694 %t = call {i64, i1} @llvm.smul.with.overflow.i64(i64 %v1, i64 %v2)
695 %val = extractvalue {i64, i1} %t, 0
696 %obit = extractvalue {i64, i1} %t, 1
697 br i1 %obit, label %overflow, label %continue, !prof !0
698
699overflow:
700 ret i1 false
701
702continue:
703 ret i1 true
704}
705
706define zeroext i1 @umulo.br.i32(i32 %v1, i32 %v2) {
707entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +0000708; CHECK-LABEL: umulo.br.i32
709; CHECK: mull %esi
710; CHECK-NEXT: jo
Juergen Ributzka2bce27e2014-06-24 23:51:21 +0000711 %t = call {i32, i1} @llvm.umul.with.overflow.i32(i32 %v1, i32 %v2)
712 %val = extractvalue {i32, i1} %t, 0
713 %obit = extractvalue {i32, i1} %t, 1
714 br i1 %obit, label %overflow, label %continue, !prof !0
715
716overflow:
717 ret i1 false
718
719continue:
720 ret i1 true
721}
722
723define zeroext i1 @umulo.br.i64(i64 %v1, i64 %v2) {
724entry:
Juergen Ributzka4952c352014-08-19 19:44:06 +0000725; CHECK-LABEL: umulo.br.i64
726; CHECK: mulq %rsi
727; CHECK-NEXT: jo
Juergen Ributzka2bce27e2014-06-24 23:51:21 +0000728 %t = call {i64, i1} @llvm.umul.with.overflow.i64(i64 %v1, i64 %v2)
729 %val = extractvalue {i64, i1} %t, 0
730 %obit = extractvalue {i64, i1} %t, 1
731 br i1 %obit, label %overflow, label %continue, !prof !0
732
733overflow:
734 ret i1 false
735
736continue:
737 ret i1 true
738}
739
Juergen Ributzka665ea712014-07-07 21:52:21 +0000740declare {i8, i1} @llvm.sadd.with.overflow.i8 (i8, i8 ) nounwind readnone
Juergen Ributzka2dace6e2014-06-10 23:52:44 +0000741declare {i16, i1} @llvm.sadd.with.overflow.i16(i16, i16) nounwind readnone
742declare {i32, i1} @llvm.sadd.with.overflow.i32(i32, i32) nounwind readnone
743declare {i64, i1} @llvm.sadd.with.overflow.i64(i64, i64) nounwind readnone
Juergen Ributzka793f28d2014-08-08 18:47:04 +0000744declare {i8, i1} @llvm.uadd.with.overflow.i8 (i8, i8 ) nounwind readnone
745declare {i16, i1} @llvm.uadd.with.overflow.i16(i16, i16) nounwind readnone
Juergen Ributzka2dace6e2014-06-10 23:52:44 +0000746declare {i32, i1} @llvm.uadd.with.overflow.i32(i32, i32) nounwind readnone
747declare {i64, i1} @llvm.uadd.with.overflow.i64(i64, i64) nounwind readnone
748declare {i32, i1} @llvm.ssub.with.overflow.i32(i32, i32) nounwind readnone
749declare {i64, i1} @llvm.ssub.with.overflow.i64(i64, i64) nounwind readnone
750declare {i32, i1} @llvm.usub.with.overflow.i32(i32, i32) nounwind readnone
751declare {i64, i1} @llvm.usub.with.overflow.i64(i64, i64) nounwind readnone
Juergen Ributzka665ea712014-07-07 21:52:21 +0000752declare {i8, i1} @llvm.smul.with.overflow.i8 (i8, i8 ) nounwind readnone
753declare {i16, i1} @llvm.smul.with.overflow.i16(i16, i16) nounwind readnone
Juergen Ributzka2dace6e2014-06-10 23:52:44 +0000754declare {i32, i1} @llvm.smul.with.overflow.i32(i32, i32) nounwind readnone
755declare {i64, i1} @llvm.smul.with.overflow.i64(i64, i64) nounwind readnone
Juergen Ributzka665ea712014-07-07 21:52:21 +0000756declare {i8, i1} @llvm.umul.with.overflow.i8 (i8, i8 ) nounwind readnone
757declare {i16, i1} @llvm.umul.with.overflow.i16(i16, i16) nounwind readnone
Juergen Ributzka2dace6e2014-06-10 23:52:44 +0000758declare {i32, i1} @llvm.umul.with.overflow.i32(i32, i32) nounwind readnone
759declare {i64, i1} @llvm.umul.with.overflow.i64(i64, i64) nounwind readnone
760
Juergen Ributzka2bce27e2014-06-24 23:51:21 +0000761!0 = metadata !{metadata !"branch_weights", i32 0, i32 2147483647}