[x32] Fix FrameIndex check in SelectLEA64_32Addr
[oota-llvm.git] / test / CodeGen / X86 / xaluo.ll
1 ; 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
3
4 ;
5 ; Get the actual value of the overflow bit.
6 ;
7 ; SADDO reg, reg
8 define zeroext i1 @saddo.i8(i8 signext %v1, i8 signext %v2, i8* %res) {
9 entry:
10 ; CHECK-LABEL: saddo.i8
11 ; CHECK:       addb %sil, %dil
12 ; CHECK-NEXT:  seto %al
13   %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
20 define zeroext i1 @saddo.i16(i16 %v1, i16 %v2, i16* %res) {
21 entry:
22 ; CHECK-LABEL: saddo.i16
23 ; CHECK:       addw %si, %di
24 ; CHECK-NEXT:  seto %al
25   %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
32 define zeroext i1 @saddo.i32(i32 %v1, i32 %v2, i32* %res) {
33 entry:
34 ; CHECK-LABEL: saddo.i32
35 ; CHECK:       addl %esi, %edi
36 ; CHECK-NEXT:  seto %al
37   %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
44 define zeroext i1 @saddo.i64(i64 %v1, i64 %v2, i64* %res) {
45 entry:
46 ; CHECK-LABEL: saddo.i64
47 ; CHECK:       addq %rsi, %rdi
48 ; CHECK-NEXT:  seto %al
49   %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
56 ; SADDO reg, 1 | INC
57 define zeroext i1 @saddo.inc.i8(i8 %v1, i8* %res) {
58 entry:
59 ; 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
69 define zeroext i1 @saddo.inc.i16(i16 %v1, i16* %res) {
70 entry:
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
81 define zeroext i1 @saddo.inc.i32(i32 %v1, i32* %res) {
82 entry:
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
93 define zeroext i1 @saddo.inc.i64(i64 %v1, i64* %res) {
94 entry:
95 ; CHECK-LABEL: saddo.inc.i64
96 ; CHECK:       incq %rdi
97 ; CHECK-NEXT:  seto %al
98   %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
105 ; SADDO reg, imm | imm, reg
106 ; FIXME: DAG doesn't optimize immediates on the LHS.
107 define zeroext i1 @saddo.i64imm1(i64 %v1, i64* %res) {
108 entry:
109 ; 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
116   %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 2, i64 %v1)
117   %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.
124 define zeroext i1 @saddo.i64imm2(i64 %v1, i64* %res) {
125 entry:
126 ; 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
132   %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
139 define zeroext i1 @saddo.i64imm3(i64 %v1, i64* %res) {
140 entry:
141 ; CHECK-LABEL: saddo.i64imm3
142 ; CHECK:       movabsq $-21474836489, %[[REG:[a-z]+]]
143 ; CHECK-NEXT:  addq %rdi, %[[REG]]
144 ; CHECK-NEXT:  seto
145   %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
152 define zeroext i1 @saddo.i64imm4(i64 %v1, i64* %res) {
153 entry:
154 ; CHECK-LABEL: saddo.i64imm4
155 ; CHECK:       addq $2147483647, %rdi
156 ; CHECK-NEXT:  seto
157   %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
164 define zeroext i1 @saddo.i64imm5(i64 %v1, i64* %res) {
165 entry:
166 ; CHECK-LABEL: saddo.i64imm5
167 ; CHECK:       movl $2147483648
168 ; CHECK:       addq %rdi
169 ; CHECK-NEXT:  seto
170   %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
178 define zeroext i1 @uaddo.i32(i32 %v1, i32 %v2, i32* %res) {
179 entry:
180 ; CHECK-LABEL: uaddo.i32
181 ; CHECK:       addl %esi, %edi
182 ; CHECK-NEXT:  setb %al
183   %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
190 define zeroext i1 @uaddo.i64(i64 %v1, i64 %v2, i64* %res) {
191 entry:
192 ; CHECK-LABEL: uaddo.i64
193 ; CHECK:       addq %rsi, %rdi
194 ; CHECK-NEXT:  setb %al
195   %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
202 ; UADDO reg, 1 | NOT INC
203 define zeroext i1 @uaddo.inc.i8(i8 %v1, i8* %res) {
204 entry:
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
214 define zeroext i1 @uaddo.inc.i16(i16 %v1, i16* %res) {
215 entry:
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
225 define zeroext i1 @uaddo.inc.i32(i32 %v1, i32* %res) {
226 entry:
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
236 define zeroext i1 @uaddo.inc.i64(i64 %v1, i64* %res) {
237 entry:
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
247 ; SSUBO
248 define zeroext i1 @ssubo.i32(i32 %v1, i32 %v2, i32* %res) {
249 entry:
250 ; CHECK-LABEL: ssubo.i32
251 ; CHECK:       subl %esi, %edi
252 ; CHECK-NEXT:  seto %al
253   %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
260 define zeroext i1 @ssubo.i64(i64 %v1, i64 %v2, i64* %res) {
261 entry:
262 ; CHECK-LABEL: ssubo.i64
263 ; CHECK:       subq %rsi, %rdi
264 ; CHECK-NEXT:  seto %al
265   %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
273 define zeroext i1 @usubo.i32(i32 %v1, i32 %v2, i32* %res) {
274 entry:
275 ; CHECK-LABEL: usubo.i32
276 ; CHECK:       subl %esi, %edi
277 ; CHECK-NEXT:  setb %al
278   %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
285 define zeroext i1 @usubo.i64(i64 %v1, i64 %v2, i64* %res) {
286 entry:
287 ; CHECK-LABEL: usubo.i64
288 ; CHECK:       subq %rsi, %rdi
289 ; CHECK-NEXT:  setb %al
290   %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
298 define zeroext i1 @smulo.i8(i8 %v1, i8 %v2, i8* %res) {
299 entry:
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
311 define zeroext i1 @smulo.i16(i16 %v1, i16 %v2, i16* %res) {
312 entry:
313 ; CHECK-LABEL: smulo.i16
314 ; CHECK:       imulw %si, %di
315 ; CHECK-NEXT:  seto %al
316   %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
323 define zeroext i1 @smulo.i32(i32 %v1, i32 %v2, i32* %res) {
324 entry:
325 ; CHECK-LABEL: smulo.i32
326 ; CHECK:       imull %esi, %edi
327 ; CHECK-NEXT:  seto %al
328   %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
335 define zeroext i1 @smulo.i64(i64 %v1, i64 %v2, i64* %res) {
336 entry:
337 ; CHECK-LABEL: smulo.i64
338 ; CHECK:       imulq %rsi, %rdi
339 ; CHECK-NEXT:  seto %al
340   %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
348 define zeroext i1 @umulo.i8(i8 %v1, i8 %v2, i8* %res) {
349 entry:
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
361 define zeroext i1 @umulo.i16(i16 %v1, i16 %v2, i16* %res) {
362 entry:
363 ; CHECK-LABEL: umulo.i16
364 ; CHECK:       mulw %si
365 ; CHECK-NEXT:  seto
366   %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
373 define zeroext i1 @umulo.i32(i32 %v1, i32 %v2, i32* %res) {
374 entry:
375 ; CHECK-LABEL: umulo.i32
376 ; CHECK:       mull %esi
377 ; CHECK-NEXT:  seto
378   %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
385 define zeroext i1 @umulo.i64(i64 %v1, i64 %v2, i64* %res) {
386 entry:
387 ; CHECK-LABEL: umulo.i64
388 ; CHECK:       mulq %rsi
389 ; CHECK-NEXT:  seto
390   %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
397 ;
398 ; Check the use of the overflow bit in combination with a select instruction.
399 ;
400 define i32 @saddo.select.i32(i32 %v1, i32 %v2) {
401 entry:
402 ; CHECK-LABEL: saddo.select.i32
403 ; CHECK:       addl   %esi, %eax
404 ; CHECK-NEXT:  cmovol %edi, %esi
405   %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
411 define i64 @saddo.select.i64(i64 %v1, i64 %v2) {
412 entry:
413 ; CHECK-LABEL: saddo.select.i64
414 ; CHECK:       addq   %rsi, %rax
415 ; CHECK-NEXT:  cmovoq %rdi, %rsi
416   %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
422 define i32 @uaddo.select.i32(i32 %v1, i32 %v2) {
423 entry:
424 ; CHECK-LABEL: uaddo.select.i32
425 ; CHECK:       addl   %esi, %eax
426 ; CHECK-NEXT:  cmovbl %edi, %esi
427   %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
433 define i64 @uaddo.select.i64(i64 %v1, i64 %v2) {
434 entry:
435 ; CHECK-LABEL: uaddo.select.i64
436 ; CHECK:       addq   %rsi, %rax
437 ; CHECK-NEXT:  cmovbq %rdi, %rsi
438   %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
444 define i32 @ssubo.select.i32(i32 %v1, i32 %v2) {
445 entry:
446 ; CHECK-LABEL: ssubo.select.i32
447 ; CHECK:       cmpl   %esi, %edi
448 ; CHECK-NEXT:  cmovol %edi, %esi
449   %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
455 define i64 @ssubo.select.i64(i64 %v1, i64 %v2) {
456 entry:
457 ; CHECK-LABEL: ssubo.select.i64
458 ; CHECK:       cmpq   %rsi, %rdi
459 ; CHECK-NEXT:  cmovoq %rdi, %rsi
460   %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
466 define i32 @usubo.select.i32(i32 %v1, i32 %v2) {
467 entry:
468 ; CHECK-LABEL: usubo.select.i32
469 ; CHECK:       cmpl   %esi, %edi
470 ; CHECK-NEXT:  cmovbl %edi, %esi
471   %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
477 define i64 @usubo.select.i64(i64 %v1, i64 %v2) {
478 entry:
479 ; CHECK-LABEL: usubo.select.i64
480 ; CHECK:       cmpq   %rsi, %rdi
481 ; CHECK-NEXT:  cmovbq %rdi, %rsi
482   %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
488 define i32 @smulo.select.i32(i32 %v1, i32 %v2) {
489 entry:
490 ; CHECK-LABEL: smulo.select.i32
491 ; CHECK:       imull  %esi, %eax
492 ; CHECK-NEXT:  cmovol %edi, %esi
493   %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
499 define i64 @smulo.select.i64(i64 %v1, i64 %v2) {
500 entry:
501 ; CHECK-LABEL: smulo.select.i64
502 ; CHECK:       imulq  %rsi, %rax
503 ; CHECK-NEXT:  cmovoq %rdi, %rsi
504   %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
510 define i32 @umulo.select.i32(i32 %v1, i32 %v2) {
511 entry:
512 ; CHECK-LABEL: umulo.select.i32
513 ; CHECK:       mull   %esi
514 ; CHECK-NEXT:  cmovol %edi, %esi
515   %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
521 define i64 @umulo.select.i64(i64 %v1, i64 %v2) {
522 entry:
523 ; CHECK-LABEL: umulo.select.i64
524 ; CHECK:       mulq   %rsi
525 ; CHECK-NEXT:  cmovoq %rdi, %rsi
526   %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 ;
536 define zeroext i1 @saddo.br.i32(i32 %v1, i32 %v2) {
537 entry:
538 ; CHECK-LABEL: saddo.br.i32
539 ; CHECK:       addl   %esi, %edi
540 ; CHECK-NEXT:  jo
541   %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
546 overflow:
547   ret i1 false
548
549 continue:
550   ret i1 true
551 }
552
553 define zeroext i1 @saddo.br.i64(i64 %v1, i64 %v2) {
554 entry:
555 ; CHECK-LABEL: saddo.br.i64
556 ; CHECK:       addq   %rsi, %rdi
557 ; CHECK-NEXT:  jo
558   %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
563 overflow:
564   ret i1 false
565
566 continue:
567   ret i1 true
568 }
569
570 define zeroext i1 @uaddo.br.i32(i32 %v1, i32 %v2) {
571 entry:
572 ; CHECK-LABEL: uaddo.br.i32
573 ; CHECK:       addl   %esi, %edi
574 ; CHECK-NEXT:  jb
575   %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
580 overflow:
581   ret i1 false
582
583 continue:
584   ret i1 true
585 }
586
587 define zeroext i1 @uaddo.br.i64(i64 %v1, i64 %v2) {
588 entry:
589 ; CHECK-LABEL: uaddo.br.i64
590 ; CHECK:       addq   %rsi, %rdi
591 ; CHECK-NEXT:  jb
592   %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
597 overflow:
598   ret i1 false
599
600 continue:
601   ret i1 true
602 }
603
604 define zeroext i1 @ssubo.br.i32(i32 %v1, i32 %v2) {
605 entry:
606 ; CHECK-LABEL: ssubo.br.i32
607 ; CHECK:       cmpl   %esi, %edi
608 ; CHECK-NEXT:  jo
609   %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
614 overflow:
615   ret i1 false
616
617 continue:
618   ret i1 true
619 }
620
621 define zeroext i1 @ssubo.br.i64(i64 %v1, i64 %v2) {
622 entry:
623 ; CHECK-LABEL: ssubo.br.i64
624 ; CHECK:       cmpq   %rsi, %rdi
625 ; CHECK-NEXT:  jo
626   %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
631 overflow:
632   ret i1 false
633
634 continue:
635   ret i1 true
636 }
637
638 define zeroext i1 @usubo.br.i32(i32 %v1, i32 %v2) {
639 entry:
640 ; CHECK-LABEL: usubo.br.i32
641 ; CHECK:       cmpl   %esi, %edi
642 ; CHECK-NEXT:  jb
643   %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
648 overflow:
649   ret i1 false
650
651 continue:
652   ret i1 true
653 }
654
655 define zeroext i1 @usubo.br.i64(i64 %v1, i64 %v2) {
656 entry:
657 ; CHECK-LABEL: usubo.br.i64
658 ; CHECK:       cmpq   %rsi, %rdi
659 ; CHECK-NEXT:  jb
660   %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
665 overflow:
666   ret i1 false
667
668 continue:
669   ret i1 true
670 }
671
672 define zeroext i1 @smulo.br.i32(i32 %v1, i32 %v2) {
673 entry:
674 ; CHECK-LABEL: smulo.br.i32
675 ; CHECK:       imull  %esi, %edi
676 ; CHECK-NEXT:  jo
677   %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
682 overflow:
683   ret i1 false
684
685 continue:
686   ret i1 true
687 }
688
689 define zeroext i1 @smulo.br.i64(i64 %v1, i64 %v2) {
690 entry:
691 ; CHECK-LABEL: smulo.br.i64
692 ; CHECK:       imulq  %rsi, %rdi
693 ; CHECK-NEXT:  jo
694   %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
699 overflow:
700   ret i1 false
701
702 continue:
703   ret i1 true
704 }
705
706 define zeroext i1 @umulo.br.i32(i32 %v1, i32 %v2) {
707 entry:
708 ; CHECK-LABEL: umulo.br.i32
709 ; CHECK:       mull  %esi
710 ; CHECK-NEXT:  jo
711   %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
716 overflow:
717   ret i1 false
718
719 continue:
720   ret i1 true
721 }
722
723 define zeroext i1 @umulo.br.i64(i64 %v1, i64 %v2) {
724 entry:
725 ; CHECK-LABEL: umulo.br.i64
726 ; CHECK:       mulq  %rsi
727 ; CHECK-NEXT:  jo
728   %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
733 overflow:
734   ret i1 false
735
736 continue:
737   ret i1 true
738 }
739
740 declare {i8,  i1} @llvm.sadd.with.overflow.i8 (i8,  i8 ) nounwind readnone
741 declare {i16, i1} @llvm.sadd.with.overflow.i16(i16, i16) nounwind readnone
742 declare {i32, i1} @llvm.sadd.with.overflow.i32(i32, i32) nounwind readnone
743 declare {i64, i1} @llvm.sadd.with.overflow.i64(i64, i64) nounwind readnone
744 declare {i8,  i1} @llvm.uadd.with.overflow.i8 (i8,  i8 ) nounwind readnone
745 declare {i16, i1} @llvm.uadd.with.overflow.i16(i16, i16) nounwind readnone
746 declare {i32, i1} @llvm.uadd.with.overflow.i32(i32, i32) nounwind readnone
747 declare {i64, i1} @llvm.uadd.with.overflow.i64(i64, i64) nounwind readnone
748 declare {i32, i1} @llvm.ssub.with.overflow.i32(i32, i32) nounwind readnone
749 declare {i64, i1} @llvm.ssub.with.overflow.i64(i64, i64) nounwind readnone
750 declare {i32, i1} @llvm.usub.with.overflow.i32(i32, i32) nounwind readnone
751 declare {i64, i1} @llvm.usub.with.overflow.i64(i64, i64) nounwind readnone
752 declare {i8,  i1} @llvm.smul.with.overflow.i8 (i8,  i8 ) nounwind readnone
753 declare {i16, i1} @llvm.smul.with.overflow.i16(i16, i16) nounwind readnone
754 declare {i32, i1} @llvm.smul.with.overflow.i32(i32, i32) nounwind readnone
755 declare {i64, i1} @llvm.smul.with.overflow.i64(i64, i64) nounwind readnone
756 declare {i8,  i1} @llvm.umul.with.overflow.i8 (i8,  i8 ) nounwind readnone
757 declare {i16, i1} @llvm.umul.with.overflow.i16(i16, i16) nounwind readnone
758 declare {i32, i1} @llvm.umul.with.overflow.i32(i32, i32) nounwind readnone
759 declare {i64, i1} @llvm.umul.with.overflow.i64(i64, i64) nounwind readnone
760
761 !0 = metadata !{metadata !"branch_weights", i32 0, i32 2147483647}