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
234 ; UADDO reg, 1 | NOT INC
235 define zeroext i1 @uaddo.inc.i8(i8 %v1, i8* %res) {
237 ; CHECK-LABEL: uaddo.inc.i8
238 ; CHECK-NOT: incb %dil
239 %t = call {i8, i1} @llvm.uadd.with.overflow.i8(i8 %v1, i8 1)
240 %val = extractvalue {i8, i1} %t, 0
241 %obit = extractvalue {i8, i1} %t, 1
242 store i8 %val, i8* %res
246 define zeroext i1 @uaddo.inc.i16(i16 %v1, i16* %res) {
248 ; CHECK-LABEL: uaddo.inc.i16
249 ; CHECK-NOT: incw %di
250 %t = call {i16, i1} @llvm.uadd.with.overflow.i16(i16 %v1, i16 1)
251 %val = extractvalue {i16, i1} %t, 0
252 %obit = extractvalue {i16, i1} %t, 1
253 store i16 %val, i16* %res
257 define zeroext i1 @uaddo.inc.i32(i32 %v1, i32* %res) {
259 ; CHECK-LABEL: uaddo.inc.i32
260 ; CHECK-NOT: incl %edi
261 %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 1)
262 %val = extractvalue {i32, i1} %t, 0
263 %obit = extractvalue {i32, i1} %t, 1
264 store i32 %val, i32* %res
268 define zeroext i1 @uaddo.inc.i64(i64 %v1, i64* %res) {
270 ; CHECK-LABEL: uaddo.inc.i64
271 ; CHECK-NOT: incq %rdi
272 %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %v1, i64 1)
273 %val = extractvalue {i64, i1} %t, 0
274 %obit = extractvalue {i64, i1} %t, 1
275 store i64 %val, i64* %res
280 define zeroext i1 @ssubo.i32(i32 %v1, i32 %v2, i32* %res) {
282 ; DAG-LABEL: ssubo.i32
283 ; DAG: subl %esi, %edi
285 ; FAST-LABEL: ssubo.i32
286 ; FAST: subl %esi, %edi
287 ; FAST-NEXT: seto %al
288 %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %v1, i32 %v2)
289 %val = extractvalue {i32, i1} %t, 0
290 %obit = extractvalue {i32, i1} %t, 1
291 store i32 %val, i32* %res
295 define zeroext i1 @ssubo.i64(i64 %v1, i64 %v2, i64* %res) {
297 ; DAG-LABEL: ssubo.i64
298 ; DAG: subq %rsi, %rdi
300 ; FAST-LABEL: ssubo.i64
301 ; FAST: subq %rsi, %rdi
302 ; FAST-NEXT: seto %al
303 %t = call {i64, i1} @llvm.ssub.with.overflow.i64(i64 %v1, i64 %v2)
304 %val = extractvalue {i64, i1} %t, 0
305 %obit = extractvalue {i64, i1} %t, 1
306 store i64 %val, i64* %res
311 define zeroext i1 @usubo.i32(i32 %v1, i32 %v2, i32* %res) {
313 ; DAG-LABEL: usubo.i32
314 ; DAG: subl %esi, %edi
316 ; FAST-LABEL: usubo.i32
317 ; FAST: subl %esi, %edi
318 ; FAST-NEXT: setb %al
319 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %v1, i32 %v2)
320 %val = extractvalue {i32, i1} %t, 0
321 %obit = extractvalue {i32, i1} %t, 1
322 store i32 %val, i32* %res
326 define zeroext i1 @usubo.i64(i64 %v1, i64 %v2, i64* %res) {
328 ; DAG-LABEL: usubo.i64
329 ; DAG: subq %rsi, %rdi
331 ; FAST-LABEL: usubo.i64
332 ; FAST: subq %rsi, %rdi
333 ; FAST-NEXT: setb %al
334 %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %v1, i64 %v2)
335 %val = extractvalue {i64, i1} %t, 0
336 %obit = extractvalue {i64, i1} %t, 1
337 store i64 %val, i64* %res
342 define zeroext i1 @smulo.i8(i8 %v1, i8 %v2, i8* %res) {
344 ; FAST-LABEL: smulo.i8
345 ; FAST: movb %dil, %al
346 ; FAST-NEXT: imulb %sil
347 ; FAST-NEXT: seto %cl
348 %t = call {i8, i1} @llvm.smul.with.overflow.i8(i8 %v1, i8 %v2)
349 %val = extractvalue {i8, i1} %t, 0
350 %obit = extractvalue {i8, i1} %t, 1
351 store i8 %val, i8* %res
355 define zeroext i1 @smulo.i16(i16 %v1, i16 %v2, i16* %res) {
357 ; DAG-LABEL: smulo.i16
358 ; DAG: imulw %si, %di
360 ; FAST-LABEL: smulo.i16
361 ; FAST: imulw %si, %di
362 ; FAST-NEXT: seto %al
363 %t = call {i16, i1} @llvm.smul.with.overflow.i16(i16 %v1, i16 %v2)
364 %val = extractvalue {i16, i1} %t, 0
365 %obit = extractvalue {i16, i1} %t, 1
366 store i16 %val, i16* %res
370 define zeroext i1 @smulo.i32(i32 %v1, i32 %v2, i32* %res) {
372 ; DAG-LABEL: smulo.i32
373 ; DAG: imull %esi, %edi
375 ; FAST-LABEL: smulo.i32
376 ; FAST: imull %esi, %edi
377 ; FAST-NEXT: seto %al
378 %t = call {i32, i1} @llvm.smul.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 @smulo.i64(i64 %v1, i64 %v2, i64* %res) {
387 ; DAG-LABEL: smulo.i64
388 ; DAG: imulq %rsi, %rdi
390 ; FAST-LABEL: smulo.i64
391 ; FAST: imulq %rsi, %rdi
392 ; FAST-NEXT: seto %al
393 %t = call {i64, i1} @llvm.smul.with.overflow.i64(i64 %v1, i64 %v2)
394 %val = extractvalue {i64, i1} %t, 0
395 %obit = extractvalue {i64, i1} %t, 1
396 store i64 %val, i64* %res
401 define zeroext i1 @umulo.i8(i8 %v1, i8 %v2, i8* %res) {
403 ; FAST-LABEL: umulo.i8
404 ; FAST: movb %dil, %al
405 ; FAST-NEXT: mulb %sil
406 ; FAST-NEXT: seto %cl
407 %t = call {i8, i1} @llvm.umul.with.overflow.i8(i8 %v1, i8 %v2)
408 %val = extractvalue {i8, i1} %t, 0
409 %obit = extractvalue {i8, i1} %t, 1
410 store i8 %val, i8* %res
414 define zeroext i1 @umulo.i16(i16 %v1, i16 %v2, i16* %res) {
416 ; DAG-LABEL: umulo.i16
419 ; FAST-LABEL: umulo.i16
422 %t = call {i16, i1} @llvm.umul.with.overflow.i16(i16 %v1, i16 %v2)
423 %val = extractvalue {i16, i1} %t, 0
424 %obit = extractvalue {i16, i1} %t, 1
425 store i16 %val, i16* %res
429 define zeroext i1 @umulo.i32(i32 %v1, i32 %v2, i32* %res) {
431 ; DAG-LABEL: umulo.i32
434 ; FAST-LABEL: umulo.i32
437 %t = call {i32, i1} @llvm.umul.with.overflow.i32(i32 %v1, i32 %v2)
438 %val = extractvalue {i32, i1} %t, 0
439 %obit = extractvalue {i32, i1} %t, 1
440 store i32 %val, i32* %res
444 define zeroext i1 @umulo.i64(i64 %v1, i64 %v2, i64* %res) {
446 ; DAG-LABEL: umulo.i64
449 ; FAST-LABEL: umulo.i64
452 %t = call {i64, i1} @llvm.umul.with.overflow.i64(i64 %v1, i64 %v2)
453 %val = extractvalue {i64, i1} %t, 0
454 %obit = extractvalue {i64, i1} %t, 1
455 store i64 %val, i64* %res
460 ; Check the use of the overflow bit in combination with a select instruction.
462 define i32 @saddo.select.i32(i32 %v1, i32 %v2) {
464 ; CHECK-LABEL: saddo.select.i32
465 ; CHECK: addl %esi, %eax
466 ; CHECK-NEXT: cmovol %edi, %esi
467 %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 %v2)
468 %obit = extractvalue {i32, i1} %t, 1
469 %ret = select i1 %obit, i32 %v1, i32 %v2
473 define i64 @saddo.select.i64(i64 %v1, i64 %v2) {
475 ; CHECK-LABEL: saddo.select.i64
476 ; CHECK: addq %rsi, %rax
477 ; CHECK-NEXT: cmovoq %rdi, %rsi
478 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 %v2)
479 %obit = extractvalue {i64, i1} %t, 1
480 %ret = select i1 %obit, i64 %v1, i64 %v2
484 define i32 @uaddo.select.i32(i32 %v1, i32 %v2) {
486 ; CHECK-LABEL: uaddo.select.i32
487 ; CHECK: addl %esi, %eax
488 ; CHECK-NEXT: cmovbl %edi, %esi
489 %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 %v2)
490 %obit = extractvalue {i32, i1} %t, 1
491 %ret = select i1 %obit, i32 %v1, i32 %v2
495 define i64 @uaddo.select.i64(i64 %v1, i64 %v2) {
497 ; CHECK-LABEL: uaddo.select.i64
498 ; CHECK: addq %rsi, %rax
499 ; CHECK-NEXT: cmovbq %rdi, %rsi
500 %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %v1, i64 %v2)
501 %obit = extractvalue {i64, i1} %t, 1
502 %ret = select i1 %obit, i64 %v1, i64 %v2
506 define i32 @ssubo.select.i32(i32 %v1, i32 %v2) {
508 ; CHECK-LABEL: ssubo.select.i32
509 ; CHECK: cmpl %esi, %edi
510 ; CHECK-NEXT: cmovol %edi, %esi
511 %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %v1, i32 %v2)
512 %obit = extractvalue {i32, i1} %t, 1
513 %ret = select i1 %obit, i32 %v1, i32 %v2
517 define i64 @ssubo.select.i64(i64 %v1, i64 %v2) {
519 ; CHECK-LABEL: ssubo.select.i64
520 ; CHECK: cmpq %rsi, %rdi
521 ; CHECK-NEXT: cmovoq %rdi, %rsi
522 %t = call {i64, i1} @llvm.ssub.with.overflow.i64(i64 %v1, i64 %v2)
523 %obit = extractvalue {i64, i1} %t, 1
524 %ret = select i1 %obit, i64 %v1, i64 %v2
528 define i32 @usubo.select.i32(i32 %v1, i32 %v2) {
530 ; CHECK-LABEL: usubo.select.i32
531 ; CHECK: cmpl %esi, %edi
532 ; CHECK-NEXT: cmovbl %edi, %esi
533 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %v1, i32 %v2)
534 %obit = extractvalue {i32, i1} %t, 1
535 %ret = select i1 %obit, i32 %v1, i32 %v2
539 define i64 @usubo.select.i64(i64 %v1, i64 %v2) {
541 ; CHECK-LABEL: usubo.select.i64
542 ; CHECK: cmpq %rsi, %rdi
543 ; CHECK-NEXT: cmovbq %rdi, %rsi
544 %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %v1, i64 %v2)
545 %obit = extractvalue {i64, i1} %t, 1
546 %ret = select i1 %obit, i64 %v1, i64 %v2
550 define i32 @smulo.select.i32(i32 %v1, i32 %v2) {
552 ; CHECK-LABEL: smulo.select.i32
553 ; CHECK: imull %esi, %eax
554 ; CHECK-NEXT: cmovol %edi, %esi
555 %t = call {i32, i1} @llvm.smul.with.overflow.i32(i32 %v1, i32 %v2)
556 %obit = extractvalue {i32, i1} %t, 1
557 %ret = select i1 %obit, i32 %v1, i32 %v2
561 define i64 @smulo.select.i64(i64 %v1, i64 %v2) {
563 ; CHECK-LABEL: smulo.select.i64
564 ; CHECK: imulq %rsi, %rax
565 ; CHECK-NEXT: cmovoq %rdi, %rsi
566 %t = call {i64, i1} @llvm.smul.with.overflow.i64(i64 %v1, i64 %v2)
567 %obit = extractvalue {i64, i1} %t, 1
568 %ret = select i1 %obit, i64 %v1, i64 %v2
572 define i32 @umulo.select.i32(i32 %v1, i32 %v2) {
574 ; CHECK-LABEL: umulo.select.i32
576 ; CHECK-NEXT: cmovol %edi, %esi
577 %t = call {i32, i1} @llvm.umul.with.overflow.i32(i32 %v1, i32 %v2)
578 %obit = extractvalue {i32, i1} %t, 1
579 %ret = select i1 %obit, i32 %v1, i32 %v2
583 define i64 @umulo.select.i64(i64 %v1, i64 %v2) {
585 ; CHECK-LABEL: umulo.select.i64
587 ; CHECK-NEXT: cmovoq %rdi, %rsi
588 %t = call {i64, i1} @llvm.umul.with.overflow.i64(i64 %v1, i64 %v2)
589 %obit = extractvalue {i64, i1} %t, 1
590 %ret = select i1 %obit, i64 %v1, i64 %v2
596 ; Check the use of the overflow bit in combination with a branch instruction.
598 define zeroext i1 @saddo.br.i32(i32 %v1, i32 %v2) {
600 ; CHECK-LABEL: saddo.br.i32
601 ; CHECK: addl %esi, %edi
603 %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 %v2)
604 %val = extractvalue {i32, i1} %t, 0
605 %obit = extractvalue {i32, i1} %t, 1
606 br i1 %obit, label %overflow, label %continue, !prof !0
615 define zeroext i1 @saddo.br.i64(i64 %v1, i64 %v2) {
617 ; CHECK-LABEL: saddo.br.i64
618 ; CHECK: addq %rsi, %rdi
620 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 %v2)
621 %val = extractvalue {i64, i1} %t, 0
622 %obit = extractvalue {i64, i1} %t, 1
623 br i1 %obit, label %overflow, label %continue, !prof !0
632 define zeroext i1 @uaddo.br.i32(i32 %v1, i32 %v2) {
634 ; CHECK-LABEL: uaddo.br.i32
635 ; CHECK: addl %esi, %edi
637 %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 %v2)
638 %val = extractvalue {i32, i1} %t, 0
639 %obit = extractvalue {i32, i1} %t, 1
640 br i1 %obit, label %overflow, label %continue, !prof !0
649 define zeroext i1 @uaddo.br.i64(i64 %v1, i64 %v2) {
651 ; CHECK-LABEL: uaddo.br.i64
652 ; CHECK: addq %rsi, %rdi
654 %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %v1, i64 %v2)
655 %val = extractvalue {i64, i1} %t, 0
656 %obit = extractvalue {i64, i1} %t, 1
657 br i1 %obit, label %overflow, label %continue, !prof !0
666 define zeroext i1 @ssubo.br.i32(i32 %v1, i32 %v2) {
668 ; CHECK-LABEL: ssubo.br.i32
669 ; CHECK: cmpl %esi, %edi
671 %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %v1, i32 %v2)
672 %val = extractvalue {i32, i1} %t, 0
673 %obit = extractvalue {i32, i1} %t, 1
674 br i1 %obit, label %overflow, label %continue, !prof !0
683 define zeroext i1 @ssubo.br.i64(i64 %v1, i64 %v2) {
685 ; CHECK-LABEL: ssubo.br.i64
686 ; CHECK: cmpq %rsi, %rdi
688 %t = call {i64, i1} @llvm.ssub.with.overflow.i64(i64 %v1, i64 %v2)
689 %val = extractvalue {i64, i1} %t, 0
690 %obit = extractvalue {i64, i1} %t, 1
691 br i1 %obit, label %overflow, label %continue, !prof !0
700 define zeroext i1 @usubo.br.i32(i32 %v1, i32 %v2) {
702 ; CHECK-LABEL: usubo.br.i32
703 ; CHECK: cmpl %esi, %edi
705 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %v1, i32 %v2)
706 %val = extractvalue {i32, i1} %t, 0
707 %obit = extractvalue {i32, i1} %t, 1
708 br i1 %obit, label %overflow, label %continue, !prof !0
717 define zeroext i1 @usubo.br.i64(i64 %v1, i64 %v2) {
719 ; CHECK-LABEL: usubo.br.i64
720 ; CHECK: cmpq %rsi, %rdi
722 %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %v1, i64 %v2)
723 %val = extractvalue {i64, i1} %t, 0
724 %obit = extractvalue {i64, i1} %t, 1
725 br i1 %obit, label %overflow, label %continue, !prof !0
734 define zeroext i1 @smulo.br.i32(i32 %v1, i32 %v2) {
736 ; CHECK-LABEL: smulo.br.i32
737 ; CHECK: imull %esi, %edi
739 %t = call {i32, i1} @llvm.smul.with.overflow.i32(i32 %v1, i32 %v2)
740 %val = extractvalue {i32, i1} %t, 0
741 %obit = extractvalue {i32, i1} %t, 1
742 br i1 %obit, label %overflow, label %continue, !prof !0
751 define zeroext i1 @smulo.br.i64(i64 %v1, i64 %v2) {
753 ; CHECK-LABEL: smulo.br.i64
754 ; CHECK: imulq %rsi, %rdi
756 %t = call {i64, i1} @llvm.smul.with.overflow.i64(i64 %v1, i64 %v2)
757 %val = extractvalue {i64, i1} %t, 0
758 %obit = extractvalue {i64, i1} %t, 1
759 br i1 %obit, label %overflow, label %continue, !prof !0
768 define zeroext i1 @umulo.br.i32(i32 %v1, i32 %v2) {
770 ; CHECK-LABEL: umulo.br.i32
773 %t = call {i32, i1} @llvm.umul.with.overflow.i32(i32 %v1, i32 %v2)
774 %val = extractvalue {i32, i1} %t, 0
775 %obit = extractvalue {i32, i1} %t, 1
776 br i1 %obit, label %overflow, label %continue, !prof !0
785 define zeroext i1 @umulo.br.i64(i64 %v1, i64 %v2) {
787 ; CHECK-LABEL: umulo.br.i64
790 %t = call {i64, i1} @llvm.umul.with.overflow.i64(i64 %v1, i64 %v2)
791 %val = extractvalue {i64, i1} %t, 0
792 %obit = extractvalue {i64, i1} %t, 1
793 br i1 %obit, label %overflow, label %continue, !prof !0
802 declare {i8, i1} @llvm.sadd.with.overflow.i8 (i8, i8 ) nounwind readnone
803 declare {i16, i1} @llvm.sadd.with.overflow.i16(i16, i16) nounwind readnone
804 declare {i32, i1} @llvm.sadd.with.overflow.i32(i32, i32) nounwind readnone
805 declare {i64, i1} @llvm.sadd.with.overflow.i64(i64, i64) nounwind readnone
806 declare {i8, i1} @llvm.uadd.with.overflow.i8 (i8, i8 ) nounwind readnone
807 declare {i16, i1} @llvm.uadd.with.overflow.i16(i16, i16) nounwind readnone
808 declare {i32, i1} @llvm.uadd.with.overflow.i32(i32, i32) nounwind readnone
809 declare {i64, i1} @llvm.uadd.with.overflow.i64(i64, i64) nounwind readnone
810 declare {i32, i1} @llvm.ssub.with.overflow.i32(i32, i32) nounwind readnone
811 declare {i64, i1} @llvm.ssub.with.overflow.i64(i64, i64) nounwind readnone
812 declare {i32, i1} @llvm.usub.with.overflow.i32(i32, i32) nounwind readnone
813 declare {i64, i1} @llvm.usub.with.overflow.i64(i64, i64) nounwind readnone
814 declare {i8, i1} @llvm.smul.with.overflow.i8 (i8, i8 ) nounwind readnone
815 declare {i16, i1} @llvm.smul.with.overflow.i16(i16, i16) nounwind readnone
816 declare {i32, i1} @llvm.smul.with.overflow.i32(i32, i32) nounwind readnone
817 declare {i64, i1} @llvm.smul.with.overflow.i64(i64, i64) nounwind readnone
818 declare {i8, i1} @llvm.umul.with.overflow.i8 (i8, i8 ) nounwind readnone
819 declare {i16, i1} @llvm.umul.with.overflow.i16(i16, i16) nounwind readnone
820 declare {i32, i1} @llvm.umul.with.overflow.i32(i32, i32) nounwind readnone
821 declare {i64, i1} @llvm.umul.with.overflow.i64(i64, i64) nounwind readnone
823 !0 = metadata !{metadata !"branch_weights", i32 0, i32 2147483647}