]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/CodeGen/X86/xaluo.ll
Vendor import of llvm trunk r291274:
[FreeBSD/FreeBSD.git] / test / CodeGen / X86 / xaluo.ll
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=x86_64-darwin-unknown                             < %s | FileCheck %s --check-prefix=CHECK --check-prefix=SDAG
3 ; RUN: llc -mtriple=x86_64-darwin-unknown -fast-isel -fast-isel-abort=1 < %s | FileCheck %s --check-prefix=CHECK --check-prefix=FAST
4 ; RUN: llc -mtriple=x86_64-darwin-unknown -mcpu=knl < %s | FileCheck %s --check-prefix=KNL
5 ;
6 ; Get the actual value of the overflow bit.
7 ;
8 ; SADDO reg, reg
9 define zeroext i1 @saddo.i8(i8 signext %v1, i8 signext %v2, i8* %res) {
10 entry:
11 ; CHECK-LABEL: saddo.i8
12 ; CHECK:       addb %sil, %dil
13 ; CHECK-NEXT:  seto %al
14   %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 %v1, i8 %v2)
15   %val = extractvalue {i8, i1} %t, 0
16   %obit = extractvalue {i8, i1} %t, 1
17   store i8 %val, i8* %res
18   ret i1 %obit
19 }
20
21 define zeroext i1 @saddo.i16(i16 %v1, i16 %v2, i16* %res) {
22 entry:
23 ; CHECK-LABEL: saddo.i16
24 ; CHECK:       addw %si, %di
25 ; CHECK-NEXT:  seto %al
26   %t = call {i16, i1} @llvm.sadd.with.overflow.i16(i16 %v1, i16 %v2)
27   %val = extractvalue {i16, i1} %t, 0
28   %obit = extractvalue {i16, i1} %t, 1
29   store i16 %val, i16* %res
30   ret i1 %obit
31 }
32
33 define zeroext i1 @saddo.i32(i32 %v1, i32 %v2, i32* %res) {
34 entry:
35 ; CHECK-LABEL: saddo.i32
36 ; CHECK:       addl %esi, %edi
37 ; CHECK-NEXT:  seto %al
38   %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 %v2)
39   %val = extractvalue {i32, i1} %t, 0
40   %obit = extractvalue {i32, i1} %t, 1
41   store i32 %val, i32* %res
42   ret i1 %obit
43 }
44
45 define zeroext i1 @saddo.i64(i64 %v1, i64 %v2, i64* %res) {
46 entry:
47 ; CHECK-LABEL: saddo.i64
48 ; CHECK:       addq %rsi, %rdi
49 ; CHECK-NEXT:  seto %al
50   %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 %v2)
51   %val = extractvalue {i64, i1} %t, 0
52   %obit = extractvalue {i64, i1} %t, 1
53   store i64 %val, i64* %res
54   ret i1 %obit
55 }
56
57 ; SADDO reg, 1 | INC
58 define zeroext i1 @saddo.inc.i8(i8 %v1, i8* %res) {
59 entry:
60 ; CHECK-LABEL: saddo.inc.i8
61 ; CHECK:       incb %dil
62 ; CHECK-NEXT:  seto %al
63   %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 %v1, i8 1)
64   %val = extractvalue {i8, i1} %t, 0
65   %obit = extractvalue {i8, i1} %t, 1
66   store i8 %val, i8* %res
67   ret i1 %obit
68 }
69
70 define zeroext i1 @saddo.inc.i16(i16 %v1, i16* %res) {
71 entry:
72 ; CHECK-LABEL: saddo.inc.i16
73 ; CHECK:       incw %di
74 ; CHECK-NEXT:  seto %al
75   %t = call {i16, i1} @llvm.sadd.with.overflow.i16(i16 %v1, i16 1)
76   %val = extractvalue {i16, i1} %t, 0
77   %obit = extractvalue {i16, i1} %t, 1
78   store i16 %val, i16* %res
79   ret i1 %obit
80 }
81
82 define zeroext i1 @saddo.inc.i32(i32 %v1, i32* %res) {
83 entry:
84 ; CHECK-LABEL: saddo.inc.i32
85 ; CHECK:       incl %edi
86 ; CHECK-NEXT:  seto %al
87   %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 1)
88   %val = extractvalue {i32, i1} %t, 0
89   %obit = extractvalue {i32, i1} %t, 1
90   store i32 %val, i32* %res
91   ret i1 %obit
92 }
93
94 define zeroext i1 @saddo.inc.i64(i64 %v1, i64* %res) {
95 entry:
96 ; CHECK-LABEL: saddo.inc.i64
97 ; CHECK:       incq %rdi
98 ; CHECK-NEXT:  seto %al
99   %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 1)
100   %val = extractvalue {i64, i1} %t, 0
101   %obit = extractvalue {i64, i1} %t, 1
102   store i64 %val, i64* %res
103   ret i1 %obit
104 }
105
106 ; SADDO reg, imm | imm, reg
107 ; FIXME: DAG doesn't optimize immediates on the LHS.
108 define zeroext i1 @saddo.i64imm1(i64 %v1, i64* %res) {
109 entry:
110 ; SDAG-LABEL: saddo.i64imm1
111 ; SDAG:       mov
112 ; SDAG-NEXT:  addq
113 ; SDAG-NEXT:  seto
114 ; FAST-LABEL: saddo.i64imm1
115 ; FAST:       addq $2, %rdi
116 ; FAST-NEXT:  seto %al
117   %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 2, i64 %v1)
118   %val = extractvalue {i64, i1} %t, 0
119   %obit = extractvalue {i64, i1} %t, 1
120   store i64 %val, i64* %res
121   ret i1 %obit
122 }
123
124 ; Check boundary conditions for large immediates.
125 define zeroext i1 @saddo.i64imm2(i64 %v1, i64* %res) {
126 entry:
127 ; CHECK-LABEL: saddo.i64imm2
128 ; CHECK:       addq $-2147483648, %rdi
129 ; CHECK-NEXT:  seto %al
130   %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 -2147483648)
131   %val = extractvalue {i64, i1} %t, 0
132   %obit = extractvalue {i64, i1} %t, 1
133   store i64 %val, i64* %res
134   ret i1 %obit
135 }
136
137 define zeroext i1 @saddo.i64imm3(i64 %v1, i64* %res) {
138 entry:
139 ; CHECK-LABEL: saddo.i64imm3
140 ; CHECK:       movabsq $-21474836489, %[[REG:[a-z]+]]
141 ; CHECK-NEXT:  addq %rdi, %[[REG]]
142 ; CHECK-NEXT:  seto
143   %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 -21474836489)
144   %val = extractvalue {i64, i1} %t, 0
145   %obit = extractvalue {i64, i1} %t, 1
146   store i64 %val, i64* %res
147   ret i1 %obit
148 }
149
150 define zeroext i1 @saddo.i64imm4(i64 %v1, i64* %res) {
151 entry:
152 ; CHECK-LABEL: saddo.i64imm4
153 ; CHECK:       addq $2147483647, %rdi
154 ; CHECK-NEXT:  seto
155   %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 2147483647)
156   %val = extractvalue {i64, i1} %t, 0
157   %obit = extractvalue {i64, i1} %t, 1
158   store i64 %val, i64* %res
159   ret i1 %obit
160 }
161
162 define zeroext i1 @saddo.i64imm5(i64 %v1, i64* %res) {
163 entry:
164 ; CHECK-LABEL: saddo.i64imm5
165 ; CHECK:       movl $2147483648
166 ; CHECK:       addq %rdi
167 ; CHECK-NEXT:  seto
168   %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 2147483648)
169   %val = extractvalue {i64, i1} %t, 0
170   %obit = extractvalue {i64, i1} %t, 1
171   store i64 %val, i64* %res
172   ret i1 %obit
173 }
174
175 ; UADDO
176 define zeroext i1 @uaddo.i32(i32 %v1, i32 %v2, i32* %res) {
177 entry:
178 ; CHECK-LABEL: uaddo.i32
179 ; CHECK:       addl %esi, %edi
180 ; CHECK-NEXT:  setb %al
181   %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 %v2)
182   %val = extractvalue {i32, i1} %t, 0
183   %obit = extractvalue {i32, i1} %t, 1
184   store i32 %val, i32* %res
185   ret i1 %obit
186 }
187
188 define zeroext i1 @uaddo.i64(i64 %v1, i64 %v2, i64* %res) {
189 entry:
190 ; CHECK-LABEL: uaddo.i64
191 ; CHECK:       addq %rsi, %rdi
192 ; CHECK-NEXT:  setb %al
193   %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %v1, i64 %v2)
194   %val = extractvalue {i64, i1} %t, 0
195   %obit = extractvalue {i64, i1} %t, 1
196   store i64 %val, i64* %res
197   ret i1 %obit
198 }
199
200 ; UADDO reg, 1 | NOT INC
201 define zeroext i1 @uaddo.inc.i8(i8 %v1, i8* %res) {
202 entry:
203 ; CHECK-LABEL: uaddo.inc.i8
204 ; CHECK-NOT:   incb %dil
205   %t = call {i8, i1} @llvm.uadd.with.overflow.i8(i8 %v1, i8 1)
206   %val = extractvalue {i8, i1} %t, 0
207   %obit = extractvalue {i8, i1} %t, 1
208   store i8 %val, i8* %res
209   ret i1 %obit
210 }
211
212 define zeroext i1 @uaddo.inc.i16(i16 %v1, i16* %res) {
213 entry:
214 ; CHECK-LABEL: uaddo.inc.i16
215 ; CHECK-NOT:   incw %di
216   %t = call {i16, i1} @llvm.uadd.with.overflow.i16(i16 %v1, i16 1)
217   %val = extractvalue {i16, i1} %t, 0
218   %obit = extractvalue {i16, i1} %t, 1
219   store i16 %val, i16* %res
220   ret i1 %obit
221 }
222
223 define zeroext i1 @uaddo.inc.i32(i32 %v1, i32* %res) {
224 entry:
225 ; CHECK-LABEL: uaddo.inc.i32
226 ; CHECK-NOT:   incl %edi
227   %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 1)
228   %val = extractvalue {i32, i1} %t, 0
229   %obit = extractvalue {i32, i1} %t, 1
230   store i32 %val, i32* %res
231   ret i1 %obit
232 }
233
234 define zeroext i1 @uaddo.inc.i64(i64 %v1, i64* %res) {
235 entry:
236 ; CHECK-LABEL: uaddo.inc.i64
237 ; CHECK-NOT:   incq %rdi
238   %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %v1, i64 1)
239   %val = extractvalue {i64, i1} %t, 0
240   %obit = extractvalue {i64, i1} %t, 1
241   store i64 %val, i64* %res
242   ret i1 %obit
243 }
244
245 ; SSUBO
246 define zeroext i1 @ssubo.i32(i32 %v1, i32 %v2, i32* %res) {
247 entry:
248 ; CHECK-LABEL: ssubo.i32
249 ; CHECK:       subl %esi, %edi
250 ; CHECK-NEXT:  seto %al
251   %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %v1, i32 %v2)
252   %val = extractvalue {i32, i1} %t, 0
253   %obit = extractvalue {i32, i1} %t, 1
254   store i32 %val, i32* %res
255   ret i1 %obit
256 }
257
258 define zeroext i1 @ssubo.i64(i64 %v1, i64 %v2, i64* %res) {
259 entry:
260 ; CHECK-LABEL: ssubo.i64
261 ; CHECK:       subq %rsi, %rdi
262 ; CHECK-NEXT:  seto %al
263   %t = call {i64, i1} @llvm.ssub.with.overflow.i64(i64 %v1, i64 %v2)
264   %val = extractvalue {i64, i1} %t, 0
265   %obit = extractvalue {i64, i1} %t, 1
266   store i64 %val, i64* %res
267   ret i1 %obit
268 }
269
270 ; USUBO
271 define zeroext i1 @usubo.i32(i32 %v1, i32 %v2, i32* %res) {
272 entry:
273 ; CHECK-LABEL: usubo.i32
274 ; CHECK:       subl %esi, %edi
275 ; CHECK-NEXT:  setb %al
276   %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %v1, i32 %v2)
277   %val = extractvalue {i32, i1} %t, 0
278   %obit = extractvalue {i32, i1} %t, 1
279   store i32 %val, i32* %res
280   ret i1 %obit
281 }
282
283 define zeroext i1 @usubo.i64(i64 %v1, i64 %v2, i64* %res) {
284 entry:
285 ; CHECK-LABEL: usubo.i64
286 ; CHECK:       subq %rsi, %rdi
287 ; CHECK-NEXT:  setb %al
288   %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %v1, i64 %v2)
289   %val = extractvalue {i64, i1} %t, 0
290   %obit = extractvalue {i64, i1} %t, 1
291   store i64 %val, i64* %res
292   ret i1 %obit
293 }
294
295 ; SMULO
296 define zeroext i1 @smulo.i8(i8 %v1, i8 %v2, i8* %res) {
297 entry:
298 ; CHECK-LABEL:   smulo.i8
299 ; CHECK:         movl %edi, %eax
300 ; CHECK-NEXT:    imulb %sil
301 ; CHECK-NEXT:    seto %cl
302   %t = call {i8, i1} @llvm.smul.with.overflow.i8(i8 %v1, i8 %v2)
303   %val = extractvalue {i8, i1} %t, 0
304   %obit = extractvalue {i8, i1} %t, 1
305   store i8 %val, i8* %res
306   ret i1 %obit
307 }
308
309 define zeroext i1 @smulo.i16(i16 %v1, i16 %v2, i16* %res) {
310 entry:
311 ; CHECK-LABEL: smulo.i16
312 ; CHECK:       imulw %si, %di
313 ; CHECK-NEXT:  seto %al
314   %t = call {i16, i1} @llvm.smul.with.overflow.i16(i16 %v1, i16 %v2)
315   %val = extractvalue {i16, i1} %t, 0
316   %obit = extractvalue {i16, i1} %t, 1
317   store i16 %val, i16* %res
318   ret i1 %obit
319 }
320
321 define zeroext i1 @smulo.i32(i32 %v1, i32 %v2, i32* %res) {
322 entry:
323 ; CHECK-LABEL: smulo.i32
324 ; CHECK:       imull %esi, %edi
325 ; CHECK-NEXT:  seto %al
326   %t = call {i32, i1} @llvm.smul.with.overflow.i32(i32 %v1, i32 %v2)
327   %val = extractvalue {i32, i1} %t, 0
328   %obit = extractvalue {i32, i1} %t, 1
329   store i32 %val, i32* %res
330   ret i1 %obit
331 }
332
333 define zeroext i1 @smulo.i64(i64 %v1, i64 %v2, i64* %res) {
334 entry:
335 ; CHECK-LABEL: smulo.i64
336 ; CHECK:       imulq %rsi, %rdi
337 ; CHECK-NEXT:  seto %al
338   %t = call {i64, i1} @llvm.smul.with.overflow.i64(i64 %v1, i64 %v2)
339   %val = extractvalue {i64, i1} %t, 0
340   %obit = extractvalue {i64, i1} %t, 1
341   store i64 %val, i64* %res
342   ret i1 %obit
343 }
344
345 ; UMULO
346 define zeroext i1 @umulo.i8(i8 %v1, i8 %v2, i8* %res) {
347 entry:
348 ; CHECK-LABEL:   umulo.i8
349 ; CHECK:         movl %edi, %eax
350 ; CHECK-NEXT:    mulb %sil
351 ; CHECK-NEXT:    seto %cl
352   %t = call {i8, i1} @llvm.umul.with.overflow.i8(i8 %v1, i8 %v2)
353   %val = extractvalue {i8, i1} %t, 0
354   %obit = extractvalue {i8, i1} %t, 1
355   store i8 %val, i8* %res
356   ret i1 %obit
357 }
358
359 define zeroext i1 @umulo.i16(i16 %v1, i16 %v2, i16* %res) {
360 entry:
361 ; CHECK-LABEL: umulo.i16
362 ; CHECK:       mulw %si
363 ; CHECK-NEXT:  seto
364   %t = call {i16, i1} @llvm.umul.with.overflow.i16(i16 %v1, i16 %v2)
365   %val = extractvalue {i16, i1} %t, 0
366   %obit = extractvalue {i16, i1} %t, 1
367   store i16 %val, i16* %res
368   ret i1 %obit
369 }
370
371 define zeroext i1 @umulo.i32(i32 %v1, i32 %v2, i32* %res) {
372 entry:
373 ; CHECK-LABEL: umulo.i32
374 ; CHECK:       mull %esi
375 ; CHECK-NEXT:  seto
376   %t = call {i32, i1} @llvm.umul.with.overflow.i32(i32 %v1, i32 %v2)
377   %val = extractvalue {i32, i1} %t, 0
378   %obit = extractvalue {i32, i1} %t, 1
379   store i32 %val, i32* %res
380   ret i1 %obit
381 }
382
383 define zeroext i1 @umulo.i64(i64 %v1, i64 %v2, i64* %res) {
384 entry:
385 ; CHECK-LABEL: umulo.i64
386 ; CHECK:       mulq %rsi
387 ; CHECK-NEXT:  seto
388   %t = call {i64, i1} @llvm.umul.with.overflow.i64(i64 %v1, i64 %v2)
389   %val = extractvalue {i64, i1} %t, 0
390   %obit = extractvalue {i64, i1} %t, 1
391   store i64 %val, i64* %res
392   ret i1 %obit
393 }
394
395 ;
396 ; Check the use of the overflow bit in combination with a select instruction.
397 ;
398 define i32 @saddo.select.i32(i32 %v1, i32 %v2) {
399 entry:
400 ; CHECK-LABEL: saddo.select.i32
401 ; CHECK:       addl   %esi, %eax
402 ; CHECK-NEXT:  cmovol %edi, %esi
403   %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 %v2)
404   %obit = extractvalue {i32, i1} %t, 1
405   %ret = select i1 %obit, i32 %v1, i32 %v2
406   ret i32 %ret
407 }
408
409 define i64 @saddo.select.i64(i64 %v1, i64 %v2) {
410 entry:
411 ; CHECK-LABEL: saddo.select.i64
412 ; CHECK:       addq   %rsi, %rax
413 ; CHECK-NEXT:  cmovoq %rdi, %rsi
414   %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 %v2)
415   %obit = extractvalue {i64, i1} %t, 1
416   %ret = select i1 %obit, i64 %v1, i64 %v2
417   ret i64 %ret
418 }
419
420 define i32 @uaddo.select.i32(i32 %v1, i32 %v2) {
421 entry:
422 ; CHECK-LABEL: uaddo.select.i32
423 ; CHECK:       addl   %esi, %eax
424 ; CHECK-NEXT:  cmovbl %edi, %esi
425   %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 %v2)
426   %obit = extractvalue {i32, i1} %t, 1
427   %ret = select i1 %obit, i32 %v1, i32 %v2
428   ret i32 %ret
429 }
430
431 define i64 @uaddo.select.i64(i64 %v1, i64 %v2) {
432 entry:
433 ; CHECK-LABEL: uaddo.select.i64
434 ; CHECK:       addq   %rsi, %rax
435 ; CHECK-NEXT:  cmovbq %rdi, %rsi
436   %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %v1, i64 %v2)
437   %obit = extractvalue {i64, i1} %t, 1
438   %ret = select i1 %obit, i64 %v1, i64 %v2
439   ret i64 %ret
440 }
441
442 define i32 @ssubo.select.i32(i32 %v1, i32 %v2) {
443 entry:
444 ; CHECK-LABEL: ssubo.select.i32
445 ; CHECK:       cmpl   %esi, %edi
446 ; CHECK-NEXT:  cmovol %edi, %esi
447   %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %v1, i32 %v2)
448   %obit = extractvalue {i32, i1} %t, 1
449   %ret = select i1 %obit, i32 %v1, i32 %v2
450   ret i32 %ret
451 }
452
453 define i64 @ssubo.select.i64(i64 %v1, i64 %v2) {
454 entry:
455 ; CHECK-LABEL: ssubo.select.i64
456 ; CHECK:       cmpq   %rsi, %rdi
457 ; CHECK-NEXT:  cmovoq %rdi, %rsi
458   %t = call {i64, i1} @llvm.ssub.with.overflow.i64(i64 %v1, i64 %v2)
459   %obit = extractvalue {i64, i1} %t, 1
460   %ret = select i1 %obit, i64 %v1, i64 %v2
461   ret i64 %ret
462 }
463
464 define i32 @usubo.select.i32(i32 %v1, i32 %v2) {
465 entry:
466 ; CHECK-LABEL: usubo.select.i32
467 ; CHECK:       cmpl   %esi, %edi
468 ; CHECK-NEXT:  cmovbl %edi, %esi
469   %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %v1, i32 %v2)
470   %obit = extractvalue {i32, i1} %t, 1
471   %ret = select i1 %obit, i32 %v1, i32 %v2
472   ret i32 %ret
473 }
474
475 define i64 @usubo.select.i64(i64 %v1, i64 %v2) {
476 entry:
477 ; CHECK-LABEL: usubo.select.i64
478 ; CHECK:       cmpq   %rsi, %rdi
479 ; CHECK-NEXT:  cmovbq %rdi, %rsi
480   %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %v1, i64 %v2)
481   %obit = extractvalue {i64, i1} %t, 1
482   %ret = select i1 %obit, i64 %v1, i64 %v2
483   ret i64 %ret
484 }
485
486 define i32 @smulo.select.i32(i32 %v1, i32 %v2) {
487 entry:
488 ; CHECK-LABEL: smulo.select.i32
489 ; CHECK:       imull  %esi, %eax
490 ; CHECK-NEXT:  cmovol %edi, %esi
491   %t = call {i32, i1} @llvm.smul.with.overflow.i32(i32 %v1, i32 %v2)
492   %obit = extractvalue {i32, i1} %t, 1
493   %ret = select i1 %obit, i32 %v1, i32 %v2
494   ret i32 %ret
495 }
496
497 define i64 @smulo.select.i64(i64 %v1, i64 %v2) {
498 entry:
499 ; CHECK-LABEL: smulo.select.i64
500 ; CHECK:       imulq  %rsi, %rax
501 ; CHECK-NEXT:  cmovoq %rdi, %rsi
502   %t = call {i64, i1} @llvm.smul.with.overflow.i64(i64 %v1, i64 %v2)
503   %obit = extractvalue {i64, i1} %t, 1
504   %ret = select i1 %obit, i64 %v1, i64 %v2
505   ret i64 %ret
506 }
507
508 define i32 @umulo.select.i32(i32 %v1, i32 %v2) {
509 entry:
510 ; CHECK-LABEL: umulo.select.i32
511 ; CHECK:       mull   %esi
512 ; CHECK-NEXT:  cmovol %edi, %esi
513   %t = call {i32, i1} @llvm.umul.with.overflow.i32(i32 %v1, i32 %v2)
514   %obit = extractvalue {i32, i1} %t, 1
515   %ret = select i1 %obit, i32 %v1, i32 %v2
516   ret i32 %ret
517 }
518
519 define i64 @umulo.select.i64(i64 %v1, i64 %v2) {
520 entry:
521 ; CHECK-LABEL: umulo.select.i64
522 ; CHECK:       mulq   %rsi
523 ; CHECK-NEXT:  cmovoq %rdi, %rsi
524   %t = call {i64, i1} @llvm.umul.with.overflow.i64(i64 %v1, i64 %v2)
525   %obit = extractvalue {i64, i1} %t, 1
526   %ret = select i1 %obit, i64 %v1, i64 %v2
527   ret i64 %ret
528 }
529
530
531 ;
532 ; Check the use of the overflow bit in combination with a branch instruction.
533 ;
534 define zeroext i1 @saddo.br.i32(i32 %v1, i32 %v2) {
535 entry:
536 ; CHECK-LABEL: saddo.br.i32
537 ; CHECK:       addl   %esi, %edi
538 ; CHECK-NEXT:  jo
539   %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 %v2)
540   %val = extractvalue {i32, i1} %t, 0
541   %obit = extractvalue {i32, i1} %t, 1
542   br i1 %obit, label %overflow, label %continue, !prof !0
543
544 overflow:
545   ret i1 false
546
547 continue:
548   ret i1 true
549 }
550
551 define zeroext i1 @saddo.br.i64(i64 %v1, i64 %v2) {
552 entry:
553 ; CHECK-LABEL: saddo.br.i64
554 ; CHECK:       addq   %rsi, %rdi
555 ; CHECK-NEXT:  jo
556   %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 %v2)
557   %val = extractvalue {i64, i1} %t, 0
558   %obit = extractvalue {i64, i1} %t, 1
559   br i1 %obit, label %overflow, label %continue, !prof !0
560
561 overflow:
562   ret i1 false
563
564 continue:
565   ret i1 true
566 }
567
568 define zeroext i1 @uaddo.br.i32(i32 %v1, i32 %v2) {
569 entry:
570 ; CHECK-LABEL: uaddo.br.i32
571 ; CHECK:       addl   %esi, %edi
572 ; CHECK-NEXT:  jb
573   %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 %v2)
574   %val = extractvalue {i32, i1} %t, 0
575   %obit = extractvalue {i32, i1} %t, 1
576   br i1 %obit, label %overflow, label %continue, !prof !0
577
578 overflow:
579   ret i1 false
580
581 continue:
582   ret i1 true
583 }
584
585 define zeroext i1 @uaddo.br.i64(i64 %v1, i64 %v2) {
586 entry:
587 ; CHECK-LABEL: uaddo.br.i64
588 ; CHECK:       addq   %rsi, %rdi
589 ; CHECK-NEXT:  jb
590   %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %v1, i64 %v2)
591   %val = extractvalue {i64, i1} %t, 0
592   %obit = extractvalue {i64, i1} %t, 1
593   br i1 %obit, label %overflow, label %continue, !prof !0
594
595 overflow:
596   ret i1 false
597
598 continue:
599   ret i1 true
600 }
601
602 define zeroext i1 @ssubo.br.i32(i32 %v1, i32 %v2) {
603 entry:
604 ; CHECK-LABEL: ssubo.br.i32
605 ; CHECK:       cmpl   %esi, %edi
606 ; CHECK-NEXT:  jo
607   %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %v1, i32 %v2)
608   %val = extractvalue {i32, i1} %t, 0
609   %obit = extractvalue {i32, i1} %t, 1
610   br i1 %obit, label %overflow, label %continue, !prof !0
611
612 overflow:
613   ret i1 false
614
615 continue:
616   ret i1 true
617 }
618
619 define zeroext i1 @ssubo.br.i64(i64 %v1, i64 %v2) {
620 entry:
621 ; CHECK-LABEL: ssubo.br.i64
622 ; CHECK:       cmpq   %rsi, %rdi
623 ; CHECK-NEXT:  jo
624   %t = call {i64, i1} @llvm.ssub.with.overflow.i64(i64 %v1, i64 %v2)
625   %val = extractvalue {i64, i1} %t, 0
626   %obit = extractvalue {i64, i1} %t, 1
627   br i1 %obit, label %overflow, label %continue, !prof !0
628
629 overflow:
630   ret i1 false
631
632 continue:
633   ret i1 true
634 }
635
636 define zeroext i1 @usubo.br.i32(i32 %v1, i32 %v2) {
637 entry:
638 ; CHECK-LABEL: usubo.br.i32
639 ; CHECK:       cmpl   %esi, %edi
640 ; CHECK-NEXT:  jb
641   %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %v1, i32 %v2)
642   %val = extractvalue {i32, i1} %t, 0
643   %obit = extractvalue {i32, i1} %t, 1
644   br i1 %obit, label %overflow, label %continue, !prof !0
645
646 overflow:
647   ret i1 false
648
649 continue:
650   ret i1 true
651 }
652
653 define zeroext i1 @usubo.br.i64(i64 %v1, i64 %v2) {
654 entry:
655 ; CHECK-LABEL: usubo.br.i64
656 ; CHECK:       cmpq   %rsi, %rdi
657 ; CHECK-NEXT:  jb
658   %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %v1, i64 %v2)
659   %val = extractvalue {i64, i1} %t, 0
660   %obit = extractvalue {i64, i1} %t, 1
661   br i1 %obit, label %overflow, label %continue, !prof !0
662
663 overflow:
664   ret i1 false
665
666 continue:
667   ret i1 true
668 }
669
670 define zeroext i1 @smulo.br.i32(i32 %v1, i32 %v2) {
671 entry:
672 ; CHECK-LABEL: smulo.br.i32
673 ; CHECK:       imull  %esi, %edi
674 ; CHECK-NEXT:  jo
675   %t = call {i32, i1} @llvm.smul.with.overflow.i32(i32 %v1, i32 %v2)
676   %val = extractvalue {i32, i1} %t, 0
677   %obit = extractvalue {i32, i1} %t, 1
678   br i1 %obit, label %overflow, label %continue, !prof !0
679
680 overflow:
681   ret i1 false
682
683 continue:
684   ret i1 true
685 }
686
687 define zeroext i1 @smulo.br.i64(i64 %v1, i64 %v2) {
688 entry:
689 ; CHECK-LABEL: smulo.br.i64
690 ; CHECK:       imulq  %rsi, %rdi
691 ; CHECK-NEXT:  jo
692   %t = call {i64, i1} @llvm.smul.with.overflow.i64(i64 %v1, i64 %v2)
693   %val = extractvalue {i64, i1} %t, 0
694   %obit = extractvalue {i64, i1} %t, 1
695   br i1 %obit, label %overflow, label %continue, !prof !0
696
697 overflow:
698   ret i1 false
699
700 continue:
701   ret i1 true
702 }
703
704 define zeroext i1 @umulo.br.i32(i32 %v1, i32 %v2) {
705 entry:
706 ; CHECK-LABEL: umulo.br.i32
707 ; CHECK:       mull  %esi
708 ; CHECK-NEXT:  jo
709   %t = call {i32, i1} @llvm.umul.with.overflow.i32(i32 %v1, i32 %v2)
710   %val = extractvalue {i32, i1} %t, 0
711   %obit = extractvalue {i32, i1} %t, 1
712   br i1 %obit, label %overflow, label %continue, !prof !0
713
714 overflow:
715   ret i1 false
716
717 continue:
718   ret i1 true
719 }
720
721 define zeroext i1 @umulo.br.i64(i64 %v1, i64 %v2) {
722 entry:
723 ; CHECK-LABEL: umulo.br.i64
724 ; CHECK:       mulq  %rsi
725 ; CHECK-NEXT:  jo
726   %t = call {i64, i1} @llvm.umul.with.overflow.i64(i64 %v1, i64 %v2)
727   %val = extractvalue {i64, i1} %t, 0
728   %obit = extractvalue {i64, i1} %t, 1
729   br i1 %obit, label %overflow, label %continue, !prof !0
730
731 overflow:
732   ret i1 false
733
734 continue:
735   ret i1 true
736 }
737
738 define i1 @bug27873(i64 %c1, i1 %c2) {
739 ; CHECK-LABEL: bug27873:
740 ; CHECK:       ## BB#0:
741 ; CHECK-NEXT:    movl $160, %ecx
742 ; CHECK-NEXT:    movq %rdi, %rax
743 ; CHECK-NEXT:    mulq %rcx
744 ; CHECK-NEXT:    seto %al
745 ; CHECK-NEXT:    orb %sil, %al
746 ; CHECK-NEXT:    retq
747 ;
748 ; KNL-LABEL: bug27873:
749 ; KNL:       ## BB#0:
750 ; KNL-NEXT:    andl $1, %esi
751 ; KNL-NEXT:    kmovw %esi, %k0
752 ; KNL-NEXT:    movl $160, %ecx
753 ; KNL-NEXT:    movq %rdi, %rax
754 ; KNL-NEXT:    mulq %rcx
755 ; KNL-NEXT:    seto %al
756 ; KNL-NEXT:    andl $1, %eax
757 ; KNL-NEXT:    kmovw %eax, %k1
758 ; KNL-NEXT:    korw %k1, %k0, %k0
759 ; KNL-NEXT:    kmovw %k0, %eax
760 ; KNL-NEXT:    ## kill: %AL<def> %AL<kill> %EAX<kill>
761 ; KNL-NEXT:    retq
762   %mul = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 %c1, i64 160)
763   %mul.overflow = extractvalue { i64, i1 } %mul, 1
764   %x1 = or i1 %c2, %mul.overflow
765   ret i1 %x1
766 }
767
768 declare {i8,  i1} @llvm.sadd.with.overflow.i8 (i8,  i8 ) nounwind readnone
769 declare {i16, i1} @llvm.sadd.with.overflow.i16(i16, i16) nounwind readnone
770 declare {i32, i1} @llvm.sadd.with.overflow.i32(i32, i32) nounwind readnone
771 declare {i64, i1} @llvm.sadd.with.overflow.i64(i64, i64) nounwind readnone
772 declare {i8,  i1} @llvm.uadd.with.overflow.i8 (i8,  i8 ) nounwind readnone
773 declare {i16, i1} @llvm.uadd.with.overflow.i16(i16, i16) nounwind readnone
774 declare {i32, i1} @llvm.uadd.with.overflow.i32(i32, i32) nounwind readnone
775 declare {i64, i1} @llvm.uadd.with.overflow.i64(i64, i64) nounwind readnone
776 declare {i32, i1} @llvm.ssub.with.overflow.i32(i32, i32) nounwind readnone
777 declare {i64, i1} @llvm.ssub.with.overflow.i64(i64, i64) nounwind readnone
778 declare {i32, i1} @llvm.usub.with.overflow.i32(i32, i32) nounwind readnone
779 declare {i64, i1} @llvm.usub.with.overflow.i64(i64, i64) nounwind readnone
780 declare {i8,  i1} @llvm.smul.with.overflow.i8 (i8,  i8 ) nounwind readnone
781 declare {i16, i1} @llvm.smul.with.overflow.i16(i16, i16) nounwind readnone
782 declare {i32, i1} @llvm.smul.with.overflow.i32(i32, i32) nounwind readnone
783 declare {i64, i1} @llvm.smul.with.overflow.i64(i64, i64) nounwind readnone
784 declare {i8,  i1} @llvm.umul.with.overflow.i8 (i8,  i8 ) nounwind readnone
785 declare {i16, i1} @llvm.umul.with.overflow.i16(i16, i16) nounwind readnone
786 declare {i32, i1} @llvm.umul.with.overflow.i32(i32, i32) nounwind readnone
787 declare {i64, i1} @llvm.umul.with.overflow.i64(i64, i64) nounwind readnone
788
789 !0 = !{!"branch_weights", i32 0, i32 2147483647}