1 ; RUN: llc -mtriple=x86_64-darwin-unknown < %s | FileCheck %s --check-prefix=DAG
2 ; RUN: llc -mtriple=x86_64-darwin-unknown -fast-isel -fast-isel-abort < %s | FileCheck %s --check-prefix=FAST
3 ; RUN: llc -mtriple=x86_64-darwin-unknown < %s | FileCheck %s
4 ; RUN: llc -mtriple=x86_64-darwin-unknown -fast-isel -fast-isel-abort < %s | FileCheck %s
7 ; Get the actual value of the overflow bit.
10 define zeroext i1 @saddo.i8(i8 signext %v1, i8 signext %v2, i8* %res) {
13 ; DAG: addb %sil, %dil
15 ; FAST-LABEL: saddo.i8
16 ; FAST: addb %sil, %dil
18 %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 %v1, i8 %v2)
19 %val = extractvalue {i8, i1} %t, 0
20 %obit = extractvalue {i8, i1} %t, 1
21 store i8 %val, i8* %res
25 define zeroext i1 @saddo.i16(i16 %v1, i16 %v2, i16* %res) {
27 ; DAG-LABEL: saddo.i16
30 ; FAST-LABEL: saddo.i16
33 %t = call {i16, i1} @llvm.sadd.with.overflow.i16(i16 %v1, i16 %v2)
34 %val = extractvalue {i16, i1} %t, 0
35 %obit = extractvalue {i16, i1} %t, 1
36 store i16 %val, i16* %res
40 define zeroext i1 @saddo.i32(i32 %v1, i32 %v2, i32* %res) {
42 ; DAG-LABEL: saddo.i32
43 ; DAG: addl %esi, %edi
45 ; FAST-LABEL: saddo.i32
46 ; FAST: addl %esi, %edi
48 %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 %v2)
49 %val = extractvalue {i32, i1} %t, 0
50 %obit = extractvalue {i32, i1} %t, 1
51 store i32 %val, i32* %res
55 define zeroext i1 @saddo.i64(i64 %v1, i64 %v2, i64* %res) {
57 ; DAG-LABEL: saddo.i64
58 ; DAG: addq %rsi, %rdi
60 ; FAST-LABEL: saddo.i64
61 ; FAST: addq %rsi, %rdi
63 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 %v2)
64 %val = extractvalue {i64, i1} %t, 0
65 %obit = extractvalue {i64, i1} %t, 1
66 store i64 %val, i64* %res
71 define zeroext i1 @saddo.inc.i8(i8 %v1, i8* %res) {
73 ; CHECK-LABEL: saddo.inc.i8
75 ; CHECK-NEXT: seto %al
76 %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 %v1, i8 1)
77 %val = extractvalue {i8, i1} %t, 0
78 %obit = extractvalue {i8, i1} %t, 1
79 store i8 %val, i8* %res
83 define zeroext i1 @saddo.inc.i16(i16 %v1, i16* %res) {
85 ; CHECK-LABEL: saddo.inc.i16
87 ; CHECK-NEXT: seto %al
88 %t = call {i16, i1} @llvm.sadd.with.overflow.i16(i16 %v1, i16 1)
89 %val = extractvalue {i16, i1} %t, 0
90 %obit = extractvalue {i16, i1} %t, 1
91 store i16 %val, i16* %res
95 define zeroext i1 @saddo.inc.i32(i32 %v1, i32* %res) {
97 ; CHECK-LABEL: saddo.inc.i32
99 ; CHECK-NEXT: seto %al
100 %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 1)
101 %val = extractvalue {i32, i1} %t, 0
102 %obit = extractvalue {i32, i1} %t, 1
103 store i32 %val, i32* %res
107 define zeroext i1 @saddo.inc.i64(i64 %v1, i64* %res) {
109 ; CHECK-LABEL: saddo.inc.i64
111 ; CHECK-NEXT: seto %al
112 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 1)
113 %val = extractvalue {i64, i1} %t, 0
114 %obit = extractvalue {i64, i1} %t, 1
115 store i64 %val, i64* %res
119 ; SADDO reg, imm | imm, reg
120 ; FIXME: DAG doesn't optimize immediates on the LHS.
121 define zeroext i1 @saddo.i64imm1(i64 %v1, i64* %res) {
123 ; DAG-LABEL: saddo.i64imm1
127 ; FAST-LABEL: saddo.i64imm1
128 ; FAST: addq $2, %rdi
129 ; FAST-NEXT: seto %al
130 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 2, i64 %v1)
131 %val = extractvalue {i64, i1} %t, 0
132 %obit = extractvalue {i64, i1} %t, 1
133 store i64 %val, i64* %res
137 ; Check boundary conditions for large immediates.
138 define zeroext i1 @saddo.i64imm2(i64 %v1, i64* %res) {
140 ; DAG-LABEL: saddo.i64imm2
141 ; DAG: addq $-2147483648, %rdi
143 ; FAST-LABEL: saddo.i64imm2
144 ; FAST: addq $-2147483648, %rdi
145 ; FAST-NEXT: seto %al
146 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 -2147483648)
147 %val = extractvalue {i64, i1} %t, 0
148 %obit = extractvalue {i64, i1} %t, 1
149 store i64 %val, i64* %res
153 define zeroext i1 @saddo.i64imm3(i64 %v1, i64* %res) {
155 ; DAG-LABEL: saddo.i64imm3
156 ; DAG: movabsq $-21474836489, %[[REG:[a-z]+]]
157 ; DAG-NEXT: addq %rdi, %[[REG]]
159 ; FAST-LABEL: saddo.i64imm3
160 ; FAST: movabsq $-21474836489, %[[REG:[a-z]+]]
161 ; FAST-NEXT: addq %rdi, %[[REG]]
163 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 -21474836489)
164 %val = extractvalue {i64, i1} %t, 0
165 %obit = extractvalue {i64, i1} %t, 1
166 store i64 %val, i64* %res
170 define zeroext i1 @saddo.i64imm4(i64 %v1, i64* %res) {
172 ; DAG-LABEL: saddo.i64imm4
173 ; DAG: addq $2147483647, %rdi
175 ; FAST-LABEL: saddo.i64imm4
176 ; FAST: addq $2147483647, %rdi
178 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 2147483647)
179 %val = extractvalue {i64, i1} %t, 0
180 %obit = extractvalue {i64, i1} %t, 1
181 store i64 %val, i64* %res
185 ; TODO: FastISel shouldn't use movabsq.
186 define zeroext i1 @saddo.i64imm5(i64 %v1, i64* %res) {
188 ; DAG-LABEL: saddo.i64imm5
189 ; DAG: movl $2147483648, %ecx
190 ; DAG: addq %rdi, %rcx
192 ; FAST-LABEL: saddo.i64imm5
193 ; FAST: movabsq $2147483648, %[[REG:[a-z]+]]
194 ; FAST: addq %rdi, %[[REG]]
196 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 2147483648)
197 %val = extractvalue {i64, i1} %t, 0
198 %obit = extractvalue {i64, i1} %t, 1
199 store i64 %val, i64* %res
204 define zeroext i1 @uaddo.i32(i32 %v1, i32 %v2, i32* %res) {
206 ; DAG-LABEL: uaddo.i32
207 ; DAG: addl %esi, %edi
209 ; FAST-LABEL: uaddo.i32
210 ; FAST: addl %esi, %edi
211 ; FAST-NEXT: setb %al
212 %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 %v2)
213 %val = extractvalue {i32, i1} %t, 0
214 %obit = extractvalue {i32, i1} %t, 1
215 store i32 %val, i32* %res
219 define zeroext i1 @uaddo.i64(i64 %v1, i64 %v2, i64* %res) {
221 ; DAG-LABEL: uaddo.i64
222 ; DAG: addq %rsi, %rdi
224 ; FAST-LABEL: uaddo.i64
225 ; FAST: addq %rsi, %rdi
226 ; FAST-NEXT: setb %al
227 %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %v1, i64 %v2)
228 %val = extractvalue {i64, i1} %t, 0
229 %obit = extractvalue {i64, i1} %t, 1
230 store i64 %val, i64* %res
235 define zeroext i1 @ssubo.i32(i32 %v1, i32 %v2, i32* %res) {
237 ; DAG-LABEL: ssubo.i32
238 ; DAG: subl %esi, %edi
240 ; FAST-LABEL: ssubo.i32
241 ; FAST: subl %esi, %edi
242 ; FAST-NEXT: seto %al
243 %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %v1, i32 %v2)
244 %val = extractvalue {i32, i1} %t, 0
245 %obit = extractvalue {i32, i1} %t, 1
246 store i32 %val, i32* %res
250 define zeroext i1 @ssubo.i64(i64 %v1, i64 %v2, i64* %res) {
252 ; DAG-LABEL: ssubo.i64
253 ; DAG: subq %rsi, %rdi
255 ; FAST-LABEL: ssubo.i64
256 ; FAST: subq %rsi, %rdi
257 ; FAST-NEXT: seto %al
258 %t = call {i64, i1} @llvm.ssub.with.overflow.i64(i64 %v1, i64 %v2)
259 %val = extractvalue {i64, i1} %t, 0
260 %obit = extractvalue {i64, i1} %t, 1
261 store i64 %val, i64* %res
266 define zeroext i1 @usubo.i32(i32 %v1, i32 %v2, i32* %res) {
268 ; DAG-LABEL: usubo.i32
269 ; DAG: subl %esi, %edi
271 ; FAST-LABEL: usubo.i32
272 ; FAST: subl %esi, %edi
273 ; FAST-NEXT: setb %al
274 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %v1, i32 %v2)
275 %val = extractvalue {i32, i1} %t, 0
276 %obit = extractvalue {i32, i1} %t, 1
277 store i32 %val, i32* %res
281 define zeroext i1 @usubo.i64(i64 %v1, i64 %v2, i64* %res) {
283 ; DAG-LABEL: usubo.i64
284 ; DAG: subq %rsi, %rdi
286 ; FAST-LABEL: usubo.i64
287 ; FAST: subq %rsi, %rdi
288 ; FAST-NEXT: setb %al
289 %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %v1, i64 %v2)
290 %val = extractvalue {i64, i1} %t, 0
291 %obit = extractvalue {i64, i1} %t, 1
292 store i64 %val, i64* %res
297 define zeroext i1 @smulo.i8(i8 %v1, i8 %v2, i8* %res) {
299 ; FAST-LABEL: smulo.i8
300 ; FAST: movb %dil, %al
301 ; FAST-NEXT: imulb %sil
302 ; FAST-NEXT: seto %cl
303 %t = call {i8, i1} @llvm.smul.with.overflow.i8(i8 %v1, i8 %v2)
304 %val = extractvalue {i8, i1} %t, 0
305 %obit = extractvalue {i8, i1} %t, 1
306 store i8 %val, i8* %res
310 define zeroext i1 @smulo.i16(i16 %v1, i16 %v2, i16* %res) {
312 ; DAG-LABEL: smulo.i16
313 ; DAG: imulw %si, %di
315 ; FAST-LABEL: smulo.i16
316 ; FAST: imulw %si, %di
317 ; FAST-NEXT: seto %al
318 %t = call {i16, i1} @llvm.smul.with.overflow.i16(i16 %v1, i16 %v2)
319 %val = extractvalue {i16, i1} %t, 0
320 %obit = extractvalue {i16, i1} %t, 1
321 store i16 %val, i16* %res
325 define zeroext i1 @smulo.i32(i32 %v1, i32 %v2, i32* %res) {
327 ; DAG-LABEL: smulo.i32
328 ; DAG: imull %esi, %edi
330 ; FAST-LABEL: smulo.i32
331 ; FAST: imull %esi, %edi
332 ; FAST-NEXT: seto %al
333 %t = call {i32, i1} @llvm.smul.with.overflow.i32(i32 %v1, i32 %v2)
334 %val = extractvalue {i32, i1} %t, 0
335 %obit = extractvalue {i32, i1} %t, 1
336 store i32 %val, i32* %res
340 define zeroext i1 @smulo.i64(i64 %v1, i64 %v2, i64* %res) {
342 ; DAG-LABEL: smulo.i64
343 ; DAG: imulq %rsi, %rdi
345 ; FAST-LABEL: smulo.i64
346 ; FAST: imulq %rsi, %rdi
347 ; FAST-NEXT: seto %al
348 %t = call {i64, i1} @llvm.smul.with.overflow.i64(i64 %v1, i64 %v2)
349 %val = extractvalue {i64, i1} %t, 0
350 %obit = extractvalue {i64, i1} %t, 1
351 store i64 %val, i64* %res
356 define zeroext i1 @umulo.i8(i8 %v1, i8 %v2, i8* %res) {
358 ; FAST-LABEL: umulo.i8
359 ; FAST: movb %dil, %al
360 ; FAST-NEXT: mulb %sil
361 ; FAST-NEXT: seto %cl
362 %t = call {i8, i1} @llvm.umul.with.overflow.i8(i8 %v1, i8 %v2)
363 %val = extractvalue {i8, i1} %t, 0
364 %obit = extractvalue {i8, i1} %t, 1
365 store i8 %val, i8* %res
369 define zeroext i1 @umulo.i16(i16 %v1, i16 %v2, i16* %res) {
371 ; DAG-LABEL: umulo.i16
374 ; FAST-LABEL: umulo.i16
377 %t = call {i16, i1} @llvm.umul.with.overflow.i16(i16 %v1, i16 %v2)
378 %val = extractvalue {i16, i1} %t, 0
379 %obit = extractvalue {i16, i1} %t, 1
380 store i16 %val, i16* %res
384 define zeroext i1 @umulo.i32(i32 %v1, i32 %v2, i32* %res) {
386 ; DAG-LABEL: umulo.i32
389 ; FAST-LABEL: umulo.i32
392 %t = call {i32, i1} @llvm.umul.with.overflow.i32(i32 %v1, i32 %v2)
393 %val = extractvalue {i32, i1} %t, 0
394 %obit = extractvalue {i32, i1} %t, 1
395 store i32 %val, i32* %res
399 define zeroext i1 @umulo.i64(i64 %v1, i64 %v2, i64* %res) {
401 ; DAG-LABEL: umulo.i64
404 ; FAST-LABEL: umulo.i64
407 %t = call {i64, i1} @llvm.umul.with.overflow.i64(i64 %v1, i64 %v2)
408 %val = extractvalue {i64, i1} %t, 0
409 %obit = extractvalue {i64, i1} %t, 1
410 store i64 %val, i64* %res
415 ; Check the use of the overflow bit in combination with a select instruction.
417 define i32 @saddo.select.i32(i32 %v1, i32 %v2) {
419 ; CHECK-LABEL: saddo.select.i32
420 ; CHECK: addl %esi, %eax
421 ; CHECK-NEXT: cmovol %edi, %esi
422 %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 %v2)
423 %obit = extractvalue {i32, i1} %t, 1
424 %ret = select i1 %obit, i32 %v1, i32 %v2
428 define i64 @saddo.select.i64(i64 %v1, i64 %v2) {
430 ; CHECK-LABEL: saddo.select.i64
431 ; CHECK: addq %rsi, %rax
432 ; CHECK-NEXT: cmovoq %rdi, %rsi
433 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 %v2)
434 %obit = extractvalue {i64, i1} %t, 1
435 %ret = select i1 %obit, i64 %v1, i64 %v2
439 define i32 @uaddo.select.i32(i32 %v1, i32 %v2) {
441 ; CHECK-LABEL: uaddo.select.i32
442 ; CHECK: addl %esi, %eax
443 ; CHECK-NEXT: cmovbl %edi, %esi
444 %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 %v2)
445 %obit = extractvalue {i32, i1} %t, 1
446 %ret = select i1 %obit, i32 %v1, i32 %v2
450 define i64 @uaddo.select.i64(i64 %v1, i64 %v2) {
452 ; CHECK-LABEL: uaddo.select.i64
453 ; CHECK: addq %rsi, %rax
454 ; CHECK-NEXT: cmovbq %rdi, %rsi
455 %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %v1, i64 %v2)
456 %obit = extractvalue {i64, i1} %t, 1
457 %ret = select i1 %obit, i64 %v1, i64 %v2
461 define i32 @ssubo.select.i32(i32 %v1, i32 %v2) {
463 ; CHECK-LABEL: ssubo.select.i32
464 ; CHECK: cmpl %esi, %edi
465 ; CHECK-NEXT: cmovol %edi, %esi
466 %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %v1, i32 %v2)
467 %obit = extractvalue {i32, i1} %t, 1
468 %ret = select i1 %obit, i32 %v1, i32 %v2
472 define i64 @ssubo.select.i64(i64 %v1, i64 %v2) {
474 ; CHECK-LABEL: ssubo.select.i64
475 ; CHECK: cmpq %rsi, %rdi
476 ; CHECK-NEXT: cmovoq %rdi, %rsi
477 %t = call {i64, i1} @llvm.ssub.with.overflow.i64(i64 %v1, i64 %v2)
478 %obit = extractvalue {i64, i1} %t, 1
479 %ret = select i1 %obit, i64 %v1, i64 %v2
483 define i32 @usubo.select.i32(i32 %v1, i32 %v2) {
485 ; CHECK-LABEL: usubo.select.i32
486 ; CHECK: cmpl %esi, %edi
487 ; CHECK-NEXT: cmovbl %edi, %esi
488 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %v1, i32 %v2)
489 %obit = extractvalue {i32, i1} %t, 1
490 %ret = select i1 %obit, i32 %v1, i32 %v2
494 define i64 @usubo.select.i64(i64 %v1, i64 %v2) {
496 ; CHECK-LABEL: usubo.select.i64
497 ; CHECK: cmpq %rsi, %rdi
498 ; CHECK-NEXT: cmovbq %rdi, %rsi
499 %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %v1, i64 %v2)
500 %obit = extractvalue {i64, i1} %t, 1
501 %ret = select i1 %obit, i64 %v1, i64 %v2
505 define i32 @smulo.select.i32(i32 %v1, i32 %v2) {
507 ; CHECK-LABEL: smulo.select.i32
508 ; CHECK: imull %esi, %eax
509 ; CHECK-NEXT: cmovol %edi, %esi
510 %t = call {i32, i1} @llvm.smul.with.overflow.i32(i32 %v1, i32 %v2)
511 %obit = extractvalue {i32, i1} %t, 1
512 %ret = select i1 %obit, i32 %v1, i32 %v2
516 define i64 @smulo.select.i64(i64 %v1, i64 %v2) {
518 ; CHECK-LABEL: smulo.select.i64
519 ; CHECK: imulq %rsi, %rax
520 ; CHECK-NEXT: cmovoq %rdi, %rsi
521 %t = call {i64, i1} @llvm.smul.with.overflow.i64(i64 %v1, i64 %v2)
522 %obit = extractvalue {i64, i1} %t, 1
523 %ret = select i1 %obit, i64 %v1, i64 %v2
527 define i32 @umulo.select.i32(i32 %v1, i32 %v2) {
529 ; CHECK-LABEL: umulo.select.i32
531 ; CHECK-NEXT: cmovol %edi, %esi
532 %t = call {i32, i1} @llvm.umul.with.overflow.i32(i32 %v1, i32 %v2)
533 %obit = extractvalue {i32, i1} %t, 1
534 %ret = select i1 %obit, i32 %v1, i32 %v2
538 define i64 @umulo.select.i64(i64 %v1, i64 %v2) {
540 ; CHECK-LABEL: umulo.select.i64
542 ; CHECK-NEXT: cmovoq %rdi, %rsi
543 %t = call {i64, i1} @llvm.umul.with.overflow.i64(i64 %v1, i64 %v2)
544 %obit = extractvalue {i64, i1} %t, 1
545 %ret = select i1 %obit, i64 %v1, i64 %v2
551 ; Check the use of the overflow bit in combination with a branch instruction.
553 define zeroext i1 @saddo.br.i32(i32 %v1, i32 %v2) {
555 ; CHECK-LABEL: saddo.br.i32
556 ; CHECK: addl %esi, %edi
558 %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 %v2)
559 %val = extractvalue {i32, i1} %t, 0
560 %obit = extractvalue {i32, i1} %t, 1
561 br i1 %obit, label %overflow, label %continue, !prof !0
570 define zeroext i1 @saddo.br.i64(i64 %v1, i64 %v2) {
572 ; CHECK-LABEL: saddo.br.i64
573 ; CHECK: addq %rsi, %rdi
575 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 %v2)
576 %val = extractvalue {i64, i1} %t, 0
577 %obit = extractvalue {i64, i1} %t, 1
578 br i1 %obit, label %overflow, label %continue, !prof !0
587 define zeroext i1 @uaddo.br.i32(i32 %v1, i32 %v2) {
589 ; CHECK-LABEL: uaddo.br.i32
590 ; CHECK: addl %esi, %edi
592 %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 %v2)
593 %val = extractvalue {i32, i1} %t, 0
594 %obit = extractvalue {i32, i1} %t, 1
595 br i1 %obit, label %overflow, label %continue, !prof !0
604 define zeroext i1 @uaddo.br.i64(i64 %v1, i64 %v2) {
606 ; CHECK-LABEL: uaddo.br.i64
607 ; CHECK: addq %rsi, %rdi
609 %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %v1, i64 %v2)
610 %val = extractvalue {i64, i1} %t, 0
611 %obit = extractvalue {i64, i1} %t, 1
612 br i1 %obit, label %overflow, label %continue, !prof !0
621 define zeroext i1 @ssubo.br.i32(i32 %v1, i32 %v2) {
623 ; CHECK-LABEL: ssubo.br.i32
624 ; CHECK: cmpl %esi, %edi
626 %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %v1, i32 %v2)
627 %val = extractvalue {i32, i1} %t, 0
628 %obit = extractvalue {i32, i1} %t, 1
629 br i1 %obit, label %overflow, label %continue, !prof !0
638 define zeroext i1 @ssubo.br.i64(i64 %v1, i64 %v2) {
640 ; CHECK-LABEL: ssubo.br.i64
641 ; CHECK: cmpq %rsi, %rdi
643 %t = call {i64, i1} @llvm.ssub.with.overflow.i64(i64 %v1, i64 %v2)
644 %val = extractvalue {i64, i1} %t, 0
645 %obit = extractvalue {i64, i1} %t, 1
646 br i1 %obit, label %overflow, label %continue, !prof !0
655 define zeroext i1 @usubo.br.i32(i32 %v1, i32 %v2) {
657 ; CHECK-LABEL: usubo.br.i32
658 ; CHECK: cmpl %esi, %edi
660 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %v1, i32 %v2)
661 %val = extractvalue {i32, i1} %t, 0
662 %obit = extractvalue {i32, i1} %t, 1
663 br i1 %obit, label %overflow, label %continue, !prof !0
672 define zeroext i1 @usubo.br.i64(i64 %v1, i64 %v2) {
674 ; CHECK-LABEL: usubo.br.i64
675 ; CHECK: cmpq %rsi, %rdi
677 %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %v1, i64 %v2)
678 %val = extractvalue {i64, i1} %t, 0
679 %obit = extractvalue {i64, i1} %t, 1
680 br i1 %obit, label %overflow, label %continue, !prof !0
689 define zeroext i1 @smulo.br.i32(i32 %v1, i32 %v2) {
691 ; CHECK-LABEL: smulo.br.i32
692 ; CHECK: imull %esi, %edi
694 %t = call {i32, i1} @llvm.smul.with.overflow.i32(i32 %v1, i32 %v2)
695 %val = extractvalue {i32, i1} %t, 0
696 %obit = extractvalue {i32, i1} %t, 1
697 br i1 %obit, label %overflow, label %continue, !prof !0
706 define zeroext i1 @smulo.br.i64(i64 %v1, i64 %v2) {
708 ; CHECK-LABEL: smulo.br.i64
709 ; CHECK: imulq %rsi, %rdi
711 %t = call {i64, i1} @llvm.smul.with.overflow.i64(i64 %v1, i64 %v2)
712 %val = extractvalue {i64, i1} %t, 0
713 %obit = extractvalue {i64, i1} %t, 1
714 br i1 %obit, label %overflow, label %continue, !prof !0
723 define zeroext i1 @umulo.br.i32(i32 %v1, i32 %v2) {
725 ; CHECK-LABEL: umulo.br.i32
728 %t = call {i32, i1} @llvm.umul.with.overflow.i32(i32 %v1, i32 %v2)
729 %val = extractvalue {i32, i1} %t, 0
730 %obit = extractvalue {i32, i1} %t, 1
731 br i1 %obit, label %overflow, label %continue, !prof !0
740 define zeroext i1 @umulo.br.i64(i64 %v1, i64 %v2) {
742 ; CHECK-LABEL: umulo.br.i64
745 %t = call {i64, i1} @llvm.umul.with.overflow.i64(i64 %v1, i64 %v2)
746 %val = extractvalue {i64, i1} %t, 0
747 %obit = extractvalue {i64, i1} %t, 1
748 br i1 %obit, label %overflow, label %continue, !prof !0
757 declare {i8, i1} @llvm.sadd.with.overflow.i8 (i8, i8 ) nounwind readnone
758 declare {i16, i1} @llvm.sadd.with.overflow.i16(i16, i16) nounwind readnone
759 declare {i32, i1} @llvm.sadd.with.overflow.i32(i32, i32) nounwind readnone
760 declare {i64, i1} @llvm.sadd.with.overflow.i64(i64, i64) nounwind readnone
761 declare {i32, i1} @llvm.uadd.with.overflow.i32(i32, i32) nounwind readnone
762 declare {i64, i1} @llvm.uadd.with.overflow.i64(i64, i64) nounwind readnone
763 declare {i32, i1} @llvm.ssub.with.overflow.i32(i32, i32) nounwind readnone
764 declare {i64, i1} @llvm.ssub.with.overflow.i64(i64, i64) nounwind readnone
765 declare {i32, i1} @llvm.usub.with.overflow.i32(i32, i32) nounwind readnone
766 declare {i64, i1} @llvm.usub.with.overflow.i64(i64, i64) nounwind readnone
767 declare {i8, i1} @llvm.smul.with.overflow.i8 (i8, i8 ) nounwind readnone
768 declare {i16, i1} @llvm.smul.with.overflow.i16(i16, i16) nounwind readnone
769 declare {i32, i1} @llvm.smul.with.overflow.i32(i32, i32) nounwind readnone
770 declare {i64, i1} @llvm.smul.with.overflow.i64(i64, i64) nounwind readnone
771 declare {i8, i1} @llvm.umul.with.overflow.i8 (i8, i8 ) nounwind readnone
772 declare {i16, i1} @llvm.umul.with.overflow.i16(i16, i16) nounwind readnone
773 declare {i32, i1} @llvm.umul.with.overflow.i32(i32, i32) nounwind readnone
774 declare {i64, i1} @llvm.umul.with.overflow.i64(i64, i64) nounwind readnone
776 !0 = metadata !{metadata !"branch_weights", i32 0, i32 2147483647}