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
70 ; SADDO reg, imm | imm, reg
71 ; FIXME: INC isn't supported in FastISel yet
72 define zeroext i1 @saddo.i64imm1(i64 %v1, i64* %res) {
74 ; DAG-LABEL: saddo.i64imm1
77 ; FAST-LABEL: saddo.i64imm1
80 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 1)
81 %val = extractvalue {i64, i1} %t, 0
82 %obit = extractvalue {i64, i1} %t, 1
83 store i64 %val, i64* %res
87 ; FIXME: DAG doesn't optimize immediates on the LHS.
88 define zeroext i1 @saddo.i64imm2(i64 %v1, i64* %res) {
90 ; DAG-LABEL: saddo.i64imm2
94 ; FAST-LABEL: saddo.i64imm2
97 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 1, i64 %v1)
98 %val = extractvalue {i64, i1} %t, 0
99 %obit = extractvalue {i64, i1} %t, 1
100 store i64 %val, i64* %res
104 ; Check boundary conditions for large immediates.
105 define zeroext i1 @saddo.i64imm3(i64 %v1, i64* %res) {
107 ; DAG-LABEL: saddo.i64imm3
108 ; DAG: addq $-2147483648, %rdi
110 ; FAST-LABEL: saddo.i64imm3
111 ; FAST: addq $-2147483648, %rdi
112 ; FAST-NEXT: seto %al
113 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 -2147483648)
114 %val = extractvalue {i64, i1} %t, 0
115 %obit = extractvalue {i64, i1} %t, 1
116 store i64 %val, i64* %res
120 define zeroext i1 @saddo.i64imm4(i64 %v1, i64* %res) {
122 ; DAG-LABEL: saddo.i64imm4
123 ; DAG: movabsq $-21474836489, %[[REG:[a-z]+]]
124 ; DAG-NEXT: addq %rdi, %[[REG]]
126 ; FAST-LABEL: saddo.i64imm4
127 ; FAST: movabsq $-21474836489, %[[REG:[a-z]+]]
128 ; FAST-NEXT: addq %rdi, %[[REG]]
130 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 -21474836489)
131 %val = extractvalue {i64, i1} %t, 0
132 %obit = extractvalue {i64, i1} %t, 1
133 store i64 %val, i64* %res
137 define zeroext i1 @saddo.i64imm5(i64 %v1, i64* %res) {
139 ; DAG-LABEL: saddo.i64imm5
140 ; DAG: addq $2147483647, %rdi
142 ; FAST-LABEL: saddo.i64imm5
143 ; FAST: addq $2147483647, %rdi
145 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 2147483647)
146 %val = extractvalue {i64, i1} %t, 0
147 %obit = extractvalue {i64, i1} %t, 1
148 store i64 %val, i64* %res
152 ; TODO: FastISel shouldn't use movabsq.
153 define zeroext i1 @saddo.i64imm6(i64 %v1, i64* %res) {
155 ; DAG-LABEL: saddo.i64imm6
156 ; DAG: movl $2147483648, %ecx
157 ; DAG: addq %rdi, %rcx
159 ; FAST-LABEL: saddo.i64imm6
160 ; FAST: movabsq $2147483648, %[[REG:[a-z]+]]
161 ; FAST: addq %rdi, %[[REG]]
163 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 2147483648)
164 %val = extractvalue {i64, i1} %t, 0
165 %obit = extractvalue {i64, i1} %t, 1
166 store i64 %val, i64* %res
171 define zeroext i1 @uaddo.i32(i32 %v1, i32 %v2, i32* %res) {
173 ; DAG-LABEL: uaddo.i32
174 ; DAG: addl %esi, %edi
176 ; FAST-LABEL: uaddo.i32
177 ; FAST: addl %esi, %edi
178 ; FAST-NEXT: setb %al
179 %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 %v2)
180 %val = extractvalue {i32, i1} %t, 0
181 %obit = extractvalue {i32, i1} %t, 1
182 store i32 %val, i32* %res
186 define zeroext i1 @uaddo.i64(i64 %v1, i64 %v2, i64* %res) {
188 ; DAG-LABEL: uaddo.i64
189 ; DAG: addq %rsi, %rdi
191 ; FAST-LABEL: uaddo.i64
192 ; FAST: addq %rsi, %rdi
193 ; FAST-NEXT: setb %al
194 %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %v1, i64 %v2)
195 %val = extractvalue {i64, i1} %t, 0
196 %obit = extractvalue {i64, i1} %t, 1
197 store i64 %val, i64* %res
202 define zeroext i1 @ssubo.i32(i32 %v1, i32 %v2, i32* %res) {
204 ; DAG-LABEL: ssubo.i32
205 ; DAG: subl %esi, %edi
207 ; FAST-LABEL: ssubo.i32
208 ; FAST: subl %esi, %edi
209 ; FAST-NEXT: seto %al
210 %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %v1, i32 %v2)
211 %val = extractvalue {i32, i1} %t, 0
212 %obit = extractvalue {i32, i1} %t, 1
213 store i32 %val, i32* %res
217 define zeroext i1 @ssubo.i64(i64 %v1, i64 %v2, i64* %res) {
219 ; DAG-LABEL: ssubo.i64
220 ; DAG: subq %rsi, %rdi
222 ; FAST-LABEL: ssubo.i64
223 ; FAST: subq %rsi, %rdi
224 ; FAST-NEXT: seto %al
225 %t = call {i64, i1} @llvm.ssub.with.overflow.i64(i64 %v1, i64 %v2)
226 %val = extractvalue {i64, i1} %t, 0
227 %obit = extractvalue {i64, i1} %t, 1
228 store i64 %val, i64* %res
233 define zeroext i1 @usubo.i32(i32 %v1, i32 %v2, i32* %res) {
235 ; DAG-LABEL: usubo.i32
236 ; DAG: subl %esi, %edi
238 ; FAST-LABEL: usubo.i32
239 ; FAST: subl %esi, %edi
240 ; FAST-NEXT: setb %al
241 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %v1, i32 %v2)
242 %val = extractvalue {i32, i1} %t, 0
243 %obit = extractvalue {i32, i1} %t, 1
244 store i32 %val, i32* %res
248 define zeroext i1 @usubo.i64(i64 %v1, i64 %v2, i64* %res) {
250 ; DAG-LABEL: usubo.i64
251 ; DAG: subq %rsi, %rdi
253 ; FAST-LABEL: usubo.i64
254 ; FAST: subq %rsi, %rdi
255 ; FAST-NEXT: setb %al
256 %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %v1, i64 %v2)
257 %val = extractvalue {i64, i1} %t, 0
258 %obit = extractvalue {i64, i1} %t, 1
259 store i64 %val, i64* %res
264 define zeroext i1 @smulo.i8(i8 %v1, i8 %v2, i8* %res) {
266 ; FAST-LABEL: smulo.i8
267 ; FAST: movb %dil, %al
268 ; FAST-NEXT: imulb %sil
269 ; FAST-NEXT: seto %cl
270 %t = call {i8, i1} @llvm.smul.with.overflow.i8(i8 %v1, i8 %v2)
271 %val = extractvalue {i8, i1} %t, 0
272 %obit = extractvalue {i8, i1} %t, 1
273 store i8 %val, i8* %res
277 define zeroext i1 @smulo.i16(i16 %v1, i16 %v2, i16* %res) {
279 ; DAG-LABEL: smulo.i16
280 ; DAG: imulw %si, %di
282 ; FAST-LABEL: smulo.i16
283 ; FAST: imulw %si, %di
284 ; FAST-NEXT: seto %al
285 %t = call {i16, i1} @llvm.smul.with.overflow.i16(i16 %v1, i16 %v2)
286 %val = extractvalue {i16, i1} %t, 0
287 %obit = extractvalue {i16, i1} %t, 1
288 store i16 %val, i16* %res
292 define zeroext i1 @smulo.i32(i32 %v1, i32 %v2, i32* %res) {
294 ; DAG-LABEL: smulo.i32
295 ; DAG: imull %esi, %edi
297 ; FAST-LABEL: smulo.i32
298 ; FAST: imull %esi, %edi
299 ; FAST-NEXT: seto %al
300 %t = call {i32, i1} @llvm.smul.with.overflow.i32(i32 %v1, i32 %v2)
301 %val = extractvalue {i32, i1} %t, 0
302 %obit = extractvalue {i32, i1} %t, 1
303 store i32 %val, i32* %res
307 define zeroext i1 @smulo.i64(i64 %v1, i64 %v2, i64* %res) {
309 ; DAG-LABEL: smulo.i64
310 ; DAG: imulq %rsi, %rdi
312 ; FAST-LABEL: smulo.i64
313 ; FAST: imulq %rsi, %rdi
314 ; FAST-NEXT: seto %al
315 %t = call {i64, i1} @llvm.smul.with.overflow.i64(i64 %v1, i64 %v2)
316 %val = extractvalue {i64, i1} %t, 0
317 %obit = extractvalue {i64, i1} %t, 1
318 store i64 %val, i64* %res
323 define zeroext i1 @umulo.i8(i8 %v1, i8 %v2, i8* %res) {
325 ; FAST-LABEL: umulo.i8
326 ; FAST: movb %dil, %al
327 ; FAST-NEXT: mulb %sil
328 ; FAST-NEXT: seto %cl
329 %t = call {i8, i1} @llvm.umul.with.overflow.i8(i8 %v1, i8 %v2)
330 %val = extractvalue {i8, i1} %t, 0
331 %obit = extractvalue {i8, i1} %t, 1
332 store i8 %val, i8* %res
336 define zeroext i1 @umulo.i16(i16 %v1, i16 %v2, i16* %res) {
338 ; DAG-LABEL: umulo.i16
341 ; FAST-LABEL: umulo.i16
344 %t = call {i16, i1} @llvm.umul.with.overflow.i16(i16 %v1, i16 %v2)
345 %val = extractvalue {i16, i1} %t, 0
346 %obit = extractvalue {i16, i1} %t, 1
347 store i16 %val, i16* %res
351 define zeroext i1 @umulo.i32(i32 %v1, i32 %v2, i32* %res) {
353 ; DAG-LABEL: umulo.i32
356 ; FAST-LABEL: umulo.i32
359 %t = call {i32, i1} @llvm.umul.with.overflow.i32(i32 %v1, i32 %v2)
360 %val = extractvalue {i32, i1} %t, 0
361 %obit = extractvalue {i32, i1} %t, 1
362 store i32 %val, i32* %res
366 define zeroext i1 @umulo.i64(i64 %v1, i64 %v2, i64* %res) {
368 ; DAG-LABEL: umulo.i64
371 ; FAST-LABEL: umulo.i64
374 %t = call {i64, i1} @llvm.umul.with.overflow.i64(i64 %v1, i64 %v2)
375 %val = extractvalue {i64, i1} %t, 0
376 %obit = extractvalue {i64, i1} %t, 1
377 store i64 %val, i64* %res
382 ; Check the use of the overflow bit in combination with a select instruction.
384 define i32 @saddo.select.i32(i32 %v1, i32 %v2) {
386 ; CHECK-LABEL: saddo.select.i32
387 ; CHECK: addl %esi, %eax
388 ; CHECK-NEXT: cmovol %edi, %esi
389 %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 %v2)
390 %obit = extractvalue {i32, i1} %t, 1
391 %ret = select i1 %obit, i32 %v1, i32 %v2
395 define i64 @saddo.select.i64(i64 %v1, i64 %v2) {
397 ; CHECK-LABEL: saddo.select.i64
398 ; CHECK: addq %rsi, %rax
399 ; CHECK-NEXT: cmovoq %rdi, %rsi
400 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 %v2)
401 %obit = extractvalue {i64, i1} %t, 1
402 %ret = select i1 %obit, i64 %v1, i64 %v2
406 define i32 @uaddo.select.i32(i32 %v1, i32 %v2) {
408 ; CHECK-LABEL: uaddo.select.i32
409 ; CHECK: addl %esi, %eax
410 ; CHECK-NEXT: cmovbl %edi, %esi
411 %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 %v2)
412 %obit = extractvalue {i32, i1} %t, 1
413 %ret = select i1 %obit, i32 %v1, i32 %v2
417 define i64 @uaddo.select.i64(i64 %v1, i64 %v2) {
419 ; CHECK-LABEL: uaddo.select.i64
420 ; CHECK: addq %rsi, %rax
421 ; CHECK-NEXT: cmovbq %rdi, %rsi
422 %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %v1, i64 %v2)
423 %obit = extractvalue {i64, i1} %t, 1
424 %ret = select i1 %obit, i64 %v1, i64 %v2
428 define i32 @ssubo.select.i32(i32 %v1, i32 %v2) {
430 ; CHECK-LABEL: ssubo.select.i32
431 ; CHECK: cmpl %esi, %edi
432 ; CHECK-NEXT: cmovol %edi, %esi
433 %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %v1, i32 %v2)
434 %obit = extractvalue {i32, i1} %t, 1
435 %ret = select i1 %obit, i32 %v1, i32 %v2
439 define i64 @ssubo.select.i64(i64 %v1, i64 %v2) {
441 ; CHECK-LABEL: ssubo.select.i64
442 ; CHECK: cmpq %rsi, %rdi
443 ; CHECK-NEXT: cmovoq %rdi, %rsi
444 %t = call {i64, i1} @llvm.ssub.with.overflow.i64(i64 %v1, i64 %v2)
445 %obit = extractvalue {i64, i1} %t, 1
446 %ret = select i1 %obit, i64 %v1, i64 %v2
450 define i32 @usubo.select.i32(i32 %v1, i32 %v2) {
452 ; CHECK-LABEL: usubo.select.i32
453 ; CHECK: cmpl %esi, %edi
454 ; CHECK-NEXT: cmovbl %edi, %esi
455 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %v1, i32 %v2)
456 %obit = extractvalue {i32, i1} %t, 1
457 %ret = select i1 %obit, i32 %v1, i32 %v2
461 define i64 @usubo.select.i64(i64 %v1, i64 %v2) {
463 ; CHECK-LABEL: usubo.select.i64
464 ; CHECK: cmpq %rsi, %rdi
465 ; CHECK-NEXT: cmovbq %rdi, %rsi
466 %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %v1, i64 %v2)
467 %obit = extractvalue {i64, i1} %t, 1
468 %ret = select i1 %obit, i64 %v1, i64 %v2
472 define i32 @smulo.select.i32(i32 %v1, i32 %v2) {
474 ; CHECK-LABEL: smulo.select.i32
475 ; CHECK: imull %esi, %eax
476 ; CHECK-NEXT: cmovol %edi, %esi
477 %t = call {i32, i1} @llvm.smul.with.overflow.i32(i32 %v1, i32 %v2)
478 %obit = extractvalue {i32, i1} %t, 1
479 %ret = select i1 %obit, i32 %v1, i32 %v2
483 define i64 @smulo.select.i64(i64 %v1, i64 %v2) {
485 ; CHECK-LABEL: smulo.select.i64
486 ; CHECK: imulq %rsi, %rax
487 ; CHECK-NEXT: cmovoq %rdi, %rsi
488 %t = call {i64, i1} @llvm.smul.with.overflow.i64(i64 %v1, i64 %v2)
489 %obit = extractvalue {i64, i1} %t, 1
490 %ret = select i1 %obit, i64 %v1, i64 %v2
494 define i32 @umulo.select.i32(i32 %v1, i32 %v2) {
496 ; CHECK-LABEL: umulo.select.i32
498 ; CHECK-NEXT: cmovol %edi, %esi
499 %t = call {i32, i1} @llvm.umul.with.overflow.i32(i32 %v1, i32 %v2)
500 %obit = extractvalue {i32, i1} %t, 1
501 %ret = select i1 %obit, i32 %v1, i32 %v2
505 define i64 @umulo.select.i64(i64 %v1, i64 %v2) {
507 ; CHECK-LABEL: umulo.select.i64
509 ; CHECK-NEXT: cmovoq %rdi, %rsi
510 %t = call {i64, i1} @llvm.umul.with.overflow.i64(i64 %v1, i64 %v2)
511 %obit = extractvalue {i64, i1} %t, 1
512 %ret = select i1 %obit, i64 %v1, i64 %v2
518 ; Check the use of the overflow bit in combination with a branch instruction.
520 define zeroext i1 @saddo.br.i32(i32 %v1, i32 %v2) {
522 ; CHECK-LABEL: saddo.br.i32
523 ; CHECK: addl %esi, %edi
525 %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 %v2)
526 %val = extractvalue {i32, i1} %t, 0
527 %obit = extractvalue {i32, i1} %t, 1
528 br i1 %obit, label %overflow, label %continue, !prof !0
537 define zeroext i1 @saddo.br.i64(i64 %v1, i64 %v2) {
539 ; CHECK-LABEL: saddo.br.i64
540 ; CHECK: addq %rsi, %rdi
542 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 %v2)
543 %val = extractvalue {i64, i1} %t, 0
544 %obit = extractvalue {i64, i1} %t, 1
545 br i1 %obit, label %overflow, label %continue, !prof !0
554 define zeroext i1 @uaddo.br.i32(i32 %v1, i32 %v2) {
556 ; CHECK-LABEL: uaddo.br.i32
557 ; CHECK: addl %esi, %edi
559 %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 %v2)
560 %val = extractvalue {i32, i1} %t, 0
561 %obit = extractvalue {i32, i1} %t, 1
562 br i1 %obit, label %overflow, label %continue, !prof !0
571 define zeroext i1 @uaddo.br.i64(i64 %v1, i64 %v2) {
573 ; CHECK-LABEL: uaddo.br.i64
574 ; CHECK: addq %rsi, %rdi
576 %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %v1, i64 %v2)
577 %val = extractvalue {i64, i1} %t, 0
578 %obit = extractvalue {i64, i1} %t, 1
579 br i1 %obit, label %overflow, label %continue, !prof !0
588 define zeroext i1 @ssubo.br.i32(i32 %v1, i32 %v2) {
590 ; CHECK-LABEL: ssubo.br.i32
591 ; CHECK: cmpl %esi, %edi
593 %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %v1, i32 %v2)
594 %val = extractvalue {i32, i1} %t, 0
595 %obit = extractvalue {i32, i1} %t, 1
596 br i1 %obit, label %overflow, label %continue, !prof !0
605 define zeroext i1 @ssubo.br.i64(i64 %v1, i64 %v2) {
607 ; CHECK-LABEL: ssubo.br.i64
608 ; CHECK: cmpq %rsi, %rdi
610 %t = call {i64, i1} @llvm.ssub.with.overflow.i64(i64 %v1, i64 %v2)
611 %val = extractvalue {i64, i1} %t, 0
612 %obit = extractvalue {i64, i1} %t, 1
613 br i1 %obit, label %overflow, label %continue, !prof !0
622 define zeroext i1 @usubo.br.i32(i32 %v1, i32 %v2) {
624 ; CHECK-LABEL: usubo.br.i32
625 ; CHECK: cmpl %esi, %edi
627 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %v1, i32 %v2)
628 %val = extractvalue {i32, i1} %t, 0
629 %obit = extractvalue {i32, i1} %t, 1
630 br i1 %obit, label %overflow, label %continue, !prof !0
639 define zeroext i1 @usubo.br.i64(i64 %v1, i64 %v2) {
641 ; CHECK-LABEL: usubo.br.i64
642 ; CHECK: cmpq %rsi, %rdi
644 %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %v1, i64 %v2)
645 %val = extractvalue {i64, i1} %t, 0
646 %obit = extractvalue {i64, i1} %t, 1
647 br i1 %obit, label %overflow, label %continue, !prof !0
656 define zeroext i1 @smulo.br.i32(i32 %v1, i32 %v2) {
658 ; CHECK-LABEL: smulo.br.i32
659 ; CHECK: imull %esi, %edi
661 %t = call {i32, i1} @llvm.smul.with.overflow.i32(i32 %v1, i32 %v2)
662 %val = extractvalue {i32, i1} %t, 0
663 %obit = extractvalue {i32, i1} %t, 1
664 br i1 %obit, label %overflow, label %continue, !prof !0
673 define zeroext i1 @smulo.br.i64(i64 %v1, i64 %v2) {
675 ; CHECK-LABEL: smulo.br.i64
676 ; CHECK: imulq %rsi, %rdi
678 %t = call {i64, i1} @llvm.smul.with.overflow.i64(i64 %v1, i64 %v2)
679 %val = extractvalue {i64, i1} %t, 0
680 %obit = extractvalue {i64, i1} %t, 1
681 br i1 %obit, label %overflow, label %continue, !prof !0
690 define zeroext i1 @umulo.br.i32(i32 %v1, i32 %v2) {
692 ; CHECK-LABEL: umulo.br.i32
695 %t = call {i32, i1} @llvm.umul.with.overflow.i32(i32 %v1, i32 %v2)
696 %val = extractvalue {i32, i1} %t, 0
697 %obit = extractvalue {i32, i1} %t, 1
698 br i1 %obit, label %overflow, label %continue, !prof !0
707 define zeroext i1 @umulo.br.i64(i64 %v1, i64 %v2) {
709 ; CHECK-LABEL: umulo.br.i64
712 %t = call {i64, i1} @llvm.umul.with.overflow.i64(i64 %v1, i64 %v2)
713 %val = extractvalue {i64, i1} %t, 0
714 %obit = extractvalue {i64, i1} %t, 1
715 br i1 %obit, label %overflow, label %continue, !prof !0
724 declare {i8, i1} @llvm.sadd.with.overflow.i8 (i8, i8 ) nounwind readnone
725 declare {i16, i1} @llvm.sadd.with.overflow.i16(i16, i16) nounwind readnone
726 declare {i32, i1} @llvm.sadd.with.overflow.i32(i32, i32) nounwind readnone
727 declare {i64, i1} @llvm.sadd.with.overflow.i64(i64, i64) nounwind readnone
728 declare {i32, i1} @llvm.uadd.with.overflow.i32(i32, i32) nounwind readnone
729 declare {i64, i1} @llvm.uadd.with.overflow.i64(i64, i64) nounwind readnone
730 declare {i32, i1} @llvm.ssub.with.overflow.i32(i32, i32) nounwind readnone
731 declare {i64, i1} @llvm.ssub.with.overflow.i64(i64, i64) nounwind readnone
732 declare {i32, i1} @llvm.usub.with.overflow.i32(i32, i32) nounwind readnone
733 declare {i64, i1} @llvm.usub.with.overflow.i64(i64, i64) nounwind readnone
734 declare {i8, i1} @llvm.smul.with.overflow.i8 (i8, i8 ) nounwind readnone
735 declare {i16, i1} @llvm.smul.with.overflow.i16(i16, i16) nounwind readnone
736 declare {i32, i1} @llvm.smul.with.overflow.i32(i32, i32) nounwind readnone
737 declare {i64, i1} @llvm.smul.with.overflow.i64(i64, i64) nounwind readnone
738 declare {i8, i1} @llvm.umul.with.overflow.i8 (i8, i8 ) nounwind readnone
739 declare {i16, i1} @llvm.umul.with.overflow.i16(i16, i16) nounwind readnone
740 declare {i32, i1} @llvm.umul.with.overflow.i32(i32, i32) nounwind readnone
741 declare {i64, i1} @llvm.umul.with.overflow.i64(i64, i64) nounwind readnone
743 !0 = metadata !{metadata !"branch_weights", i32 0, i32 2147483647}