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
5 ; Get the actual value of the overflow bit.
8 define zeroext i1 @saddo.i8(i8 signext %v1, i8 signext %v2, i8* %res) {
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
20 define zeroext i1 @saddo.i16(i16 %v1, i16 %v2, i16* %res) {
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
32 define zeroext i1 @saddo.i32(i32 %v1, i32 %v2, i32* %res) {
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
44 define zeroext i1 @saddo.i64(i64 %v1, i64 %v2, i64* %res) {
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
57 define zeroext i1 @saddo.inc.i8(i8 %v1, i8* %res) {
59 ; CHECK-LABEL: saddo.inc.i8
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
69 define zeroext i1 @saddo.inc.i16(i16 %v1, i16* %res) {
71 ; CHECK-LABEL: saddo.inc.i16
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
81 define zeroext i1 @saddo.inc.i32(i32 %v1, i32* %res) {
83 ; CHECK-LABEL: saddo.inc.i32
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
93 define zeroext i1 @saddo.inc.i64(i64 %v1, i64* %res) {
95 ; CHECK-LABEL: saddo.inc.i64
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
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) {
109 ; SDAG-LABEL: saddo.i64imm1
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
123 ; Check boundary conditions for large immediates.
124 define zeroext i1 @saddo.i64imm2(i64 %v1, i64* %res) {
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
139 define zeroext i1 @saddo.i64imm3(i64 %v1, i64* %res) {
141 ; CHECK-LABEL: saddo.i64imm3
142 ; CHECK: movabsq $-21474836489, %[[REG:[a-z]+]]
143 ; CHECK-NEXT: addq %rdi, %[[REG]]
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
152 define zeroext i1 @saddo.i64imm4(i64 %v1, i64* %res) {
154 ; CHECK-LABEL: saddo.i64imm4
155 ; CHECK: addq $2147483647, %rdi
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
164 define zeroext i1 @saddo.i64imm5(i64 %v1, i64* %res) {
166 ; CHECK-LABEL: saddo.i64imm5
167 ; CHECK: movl $2147483648
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
178 define zeroext i1 @uaddo.i32(i32 %v1, i32 %v2, i32* %res) {
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
190 define zeroext i1 @uaddo.i64(i64 %v1, i64 %v2, i64* %res) {
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
202 ; UADDO reg, 1 | NOT INC
203 define zeroext i1 @uaddo.inc.i8(i8 %v1, i8* %res) {
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
214 define zeroext i1 @uaddo.inc.i16(i16 %v1, i16* %res) {
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
225 define zeroext i1 @uaddo.inc.i32(i32 %v1, i32* %res) {
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
236 define zeroext i1 @uaddo.inc.i64(i64 %v1, i64* %res) {
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
248 define zeroext i1 @ssubo.i32(i32 %v1, i32 %v2, i32* %res) {
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
260 define zeroext i1 @ssubo.i64(i64 %v1, i64 %v2, i64* %res) {
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
273 define zeroext i1 @usubo.i32(i32 %v1, i32 %v2, i32* %res) {
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
285 define zeroext i1 @usubo.i64(i64 %v1, i64 %v2, i64* %res) {
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
298 define zeroext i1 @smulo.i8(i8 %v1, i8 %v2, i8* %res) {
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
311 define zeroext i1 @smulo.i16(i16 %v1, i16 %v2, i16* %res) {
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
323 define zeroext i1 @smulo.i32(i32 %v1, i32 %v2, i32* %res) {
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
335 define zeroext i1 @smulo.i64(i64 %v1, i64 %v2, i64* %res) {
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
348 define zeroext i1 @umulo.i8(i8 %v1, i8 %v2, i8* %res) {
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
361 define zeroext i1 @umulo.i16(i16 %v1, i16 %v2, i16* %res) {
363 ; CHECK-LABEL: umulo.i16
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
373 define zeroext i1 @umulo.i32(i32 %v1, i32 %v2, i32* %res) {
375 ; CHECK-LABEL: umulo.i32
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
385 define zeroext i1 @umulo.i64(i64 %v1, i64 %v2, i64* %res) {
387 ; CHECK-LABEL: umulo.i64
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
398 ; Check the use of the overflow bit in combination with a select instruction.
400 define i32 @saddo.select.i32(i32 %v1, i32 %v2) {
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
411 define i64 @saddo.select.i64(i64 %v1, i64 %v2) {
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
422 define i32 @uaddo.select.i32(i32 %v1, i32 %v2) {
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
433 define i64 @uaddo.select.i64(i64 %v1, i64 %v2) {
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
444 define i32 @ssubo.select.i32(i32 %v1, i32 %v2) {
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
455 define i64 @ssubo.select.i64(i64 %v1, i64 %v2) {
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
466 define i32 @usubo.select.i32(i32 %v1, i32 %v2) {
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
477 define i64 @usubo.select.i64(i64 %v1, i64 %v2) {
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
488 define i32 @smulo.select.i32(i32 %v1, i32 %v2) {
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
499 define i64 @smulo.select.i64(i64 %v1, i64 %v2) {
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
510 define i32 @umulo.select.i32(i32 %v1, i32 %v2) {
512 ; CHECK-LABEL: umulo.select.i32
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
521 define i64 @umulo.select.i64(i64 %v1, i64 %v2) {
523 ; CHECK-LABEL: umulo.select.i64
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
534 ; Check the use of the overflow bit in combination with a branch instruction.
536 define zeroext i1 @saddo.br.i32(i32 %v1, i32 %v2) {
538 ; CHECK-LABEL: saddo.br.i32
539 ; CHECK: addl %esi, %edi
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
553 define zeroext i1 @saddo.br.i64(i64 %v1, i64 %v2) {
555 ; CHECK-LABEL: saddo.br.i64
556 ; CHECK: addq %rsi, %rdi
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
570 define zeroext i1 @uaddo.br.i32(i32 %v1, i32 %v2) {
572 ; CHECK-LABEL: uaddo.br.i32
573 ; CHECK: addl %esi, %edi
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
587 define zeroext i1 @uaddo.br.i64(i64 %v1, i64 %v2) {
589 ; CHECK-LABEL: uaddo.br.i64
590 ; CHECK: addq %rsi, %rdi
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
604 define zeroext i1 @ssubo.br.i32(i32 %v1, i32 %v2) {
606 ; CHECK-LABEL: ssubo.br.i32
607 ; CHECK: cmpl %esi, %edi
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
621 define zeroext i1 @ssubo.br.i64(i64 %v1, i64 %v2) {
623 ; CHECK-LABEL: ssubo.br.i64
624 ; CHECK: cmpq %rsi, %rdi
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
638 define zeroext i1 @usubo.br.i32(i32 %v1, i32 %v2) {
640 ; CHECK-LABEL: usubo.br.i32
641 ; CHECK: cmpl %esi, %edi
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
655 define zeroext i1 @usubo.br.i64(i64 %v1, i64 %v2) {
657 ; CHECK-LABEL: usubo.br.i64
658 ; CHECK: cmpq %rsi, %rdi
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
672 define zeroext i1 @smulo.br.i32(i32 %v1, i32 %v2) {
674 ; CHECK-LABEL: smulo.br.i32
675 ; CHECK: imull %esi, %edi
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
689 define zeroext i1 @smulo.br.i64(i64 %v1, i64 %v2) {
691 ; CHECK-LABEL: smulo.br.i64
692 ; CHECK: imulq %rsi, %rdi
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
706 define zeroext i1 @umulo.br.i32(i32 %v1, i32 %v2) {
708 ; CHECK-LABEL: umulo.br.i32
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
723 define zeroext i1 @umulo.br.i64(i64 %v1, i64 %v2) {
725 ; CHECK-LABEL: umulo.br.i64
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
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
761 !0 = metadata !{metadata !"branch_weights", i32 0, i32 2147483647}