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=SDAG
3 ; RUN: llc -mtriple=x86_64-darwin-unknown -fast-isel -fast-isel-abort=1 < %s | FileCheck %s --check-prefix=FAST
4 ; RUN: llc -mtriple=x86_64-darwin-unknown -mcpu=knl < %s | FileCheck %s --check-prefix=KNL
7 ; Get the actual value of the overflow bit.
10 define zeroext i1 @saddoi8(i8 signext %v1, i8 signext %v2, i8* %res) {
11 ; SDAG-LABEL: saddoi8:
13 ; SDAG-NEXT: addb %sil, %dil
15 ; SDAG-NEXT: movb %dil, (%rdx)
18 ; FAST-LABEL: saddoi8:
20 ; FAST-NEXT: addb %sil, %dil
22 ; FAST-NEXT: movb %dil, (%rdx)
23 ; FAST-NEXT: andb $1, %al
24 ; FAST-NEXT: movzbl %al, %eax
29 ; KNL-NEXT: addb %sil, %dil
31 ; KNL-NEXT: movb %dil, (%rdx)
33 %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 %v1, i8 %v2)
34 %val = extractvalue {i8, i1} %t, 0
35 %obit = extractvalue {i8, i1} %t, 1
36 store i8 %val, i8* %res
40 define zeroext i1 @saddoi16(i16 %v1, i16 %v2, i16* %res) {
41 ; SDAG-LABEL: saddoi16:
43 ; SDAG-NEXT: addw %si, %di
45 ; SDAG-NEXT: movw %di, (%rdx)
48 ; FAST-LABEL: saddoi16:
50 ; FAST-NEXT: addw %si, %di
52 ; FAST-NEXT: movw %di, (%rdx)
53 ; FAST-NEXT: andb $1, %al
54 ; FAST-NEXT: movzbl %al, %eax
57 ; KNL-LABEL: saddoi16:
59 ; KNL-NEXT: addw %si, %di
61 ; KNL-NEXT: movw %di, (%rdx)
63 %t = call {i16, i1} @llvm.sadd.with.overflow.i16(i16 %v1, i16 %v2)
64 %val = extractvalue {i16, i1} %t, 0
65 %obit = extractvalue {i16, i1} %t, 1
66 store i16 %val, i16* %res
70 define zeroext i1 @saddoi32(i32 %v1, i32 %v2, i32* %res) {
71 ; SDAG-LABEL: saddoi32:
73 ; SDAG-NEXT: addl %esi, %edi
75 ; SDAG-NEXT: movl %edi, (%rdx)
78 ; FAST-LABEL: saddoi32:
80 ; FAST-NEXT: addl %esi, %edi
82 ; FAST-NEXT: movl %edi, (%rdx)
83 ; FAST-NEXT: andb $1, %al
84 ; FAST-NEXT: movzbl %al, %eax
87 ; KNL-LABEL: saddoi32:
89 ; KNL-NEXT: addl %esi, %edi
91 ; KNL-NEXT: movl %edi, (%rdx)
93 %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 %v2)
94 %val = extractvalue {i32, i1} %t, 0
95 %obit = extractvalue {i32, i1} %t, 1
96 store i32 %val, i32* %res
100 define zeroext i1 @saddoi64(i64 %v1, i64 %v2, i64* %res) {
101 ; SDAG-LABEL: saddoi64:
103 ; SDAG-NEXT: addq %rsi, %rdi
104 ; SDAG-NEXT: seto %al
105 ; SDAG-NEXT: movq %rdi, (%rdx)
108 ; FAST-LABEL: saddoi64:
110 ; FAST-NEXT: addq %rsi, %rdi
111 ; FAST-NEXT: seto %al
112 ; FAST-NEXT: movq %rdi, (%rdx)
113 ; FAST-NEXT: andb $1, %al
114 ; FAST-NEXT: movzbl %al, %eax
117 ; KNL-LABEL: saddoi64:
119 ; KNL-NEXT: addq %rsi, %rdi
121 ; KNL-NEXT: movq %rdi, (%rdx)
123 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 %v2)
124 %val = extractvalue {i64, i1} %t, 0
125 %obit = extractvalue {i64, i1} %t, 1
126 store i64 %val, i64* %res
131 define zeroext i1 @saddoinci8(i8 %v1, i8* %res) {
132 ; SDAG-LABEL: saddoinci8:
134 ; SDAG-NEXT: incb %dil
135 ; SDAG-NEXT: seto %al
136 ; SDAG-NEXT: movb %dil, (%rsi)
139 ; FAST-LABEL: saddoinci8:
141 ; FAST-NEXT: incb %dil
142 ; FAST-NEXT: seto %al
143 ; FAST-NEXT: movb %dil, (%rsi)
144 ; FAST-NEXT: andb $1, %al
145 ; FAST-NEXT: movzbl %al, %eax
148 ; KNL-LABEL: saddoinci8:
150 ; KNL-NEXT: incb %dil
152 ; KNL-NEXT: movb %dil, (%rsi)
154 %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 %v1, i8 1)
155 %val = extractvalue {i8, i1} %t, 0
156 %obit = extractvalue {i8, i1} %t, 1
157 store i8 %val, i8* %res
161 define zeroext i1 @saddoinci16(i16 %v1, i16* %res) {
162 ; SDAG-LABEL: saddoinci16:
164 ; SDAG-NEXT: incw %di
165 ; SDAG-NEXT: seto %al
166 ; SDAG-NEXT: movw %di, (%rsi)
169 ; FAST-LABEL: saddoinci16:
171 ; FAST-NEXT: incw %di
172 ; FAST-NEXT: seto %al
173 ; FAST-NEXT: movw %di, (%rsi)
174 ; FAST-NEXT: andb $1, %al
175 ; FAST-NEXT: movzbl %al, %eax
178 ; KNL-LABEL: saddoinci16:
182 ; KNL-NEXT: movw %di, (%rsi)
184 %t = call {i16, i1} @llvm.sadd.with.overflow.i16(i16 %v1, i16 1)
185 %val = extractvalue {i16, i1} %t, 0
186 %obit = extractvalue {i16, i1} %t, 1
187 store i16 %val, i16* %res
191 define zeroext i1 @saddoinci32(i32 %v1, i32* %res) {
192 ; SDAG-LABEL: saddoinci32:
194 ; SDAG-NEXT: incl %edi
195 ; SDAG-NEXT: seto %al
196 ; SDAG-NEXT: movl %edi, (%rsi)
199 ; FAST-LABEL: saddoinci32:
201 ; FAST-NEXT: incl %edi
202 ; FAST-NEXT: seto %al
203 ; FAST-NEXT: movl %edi, (%rsi)
204 ; FAST-NEXT: andb $1, %al
205 ; FAST-NEXT: movzbl %al, %eax
208 ; KNL-LABEL: saddoinci32:
210 ; KNL-NEXT: incl %edi
212 ; KNL-NEXT: movl %edi, (%rsi)
214 %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 1)
215 %val = extractvalue {i32, i1} %t, 0
216 %obit = extractvalue {i32, i1} %t, 1
217 store i32 %val, i32* %res
221 define zeroext i1 @saddoinci64(i64 %v1, i64* %res) {
222 ; SDAG-LABEL: saddoinci64:
224 ; SDAG-NEXT: incq %rdi
225 ; SDAG-NEXT: seto %al
226 ; SDAG-NEXT: movq %rdi, (%rsi)
229 ; FAST-LABEL: saddoinci64:
231 ; FAST-NEXT: incq %rdi
232 ; FAST-NEXT: seto %al
233 ; FAST-NEXT: movq %rdi, (%rsi)
234 ; FAST-NEXT: andb $1, %al
235 ; FAST-NEXT: movzbl %al, %eax
238 ; KNL-LABEL: saddoinci64:
240 ; KNL-NEXT: incq %rdi
242 ; KNL-NEXT: movq %rdi, (%rsi)
244 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 1)
245 %val = extractvalue {i64, i1} %t, 0
246 %obit = extractvalue {i64, i1} %t, 1
247 store i64 %val, i64* %res
251 ; SADDO reg, imm | imm, reg
252 ; FIXME: DAG doesn't optimize immediates on the LHS.
253 define zeroext i1 @saddoi64imm1(i64 %v1, i64* %res) {
254 ; SDAG-LABEL: saddoi64imm1:
256 ; SDAG-NEXT: movl $2, %ecx
257 ; SDAG-NEXT: addq %rdi, %rcx
258 ; SDAG-NEXT: seto %al
259 ; SDAG-NEXT: movq %rcx, (%rsi)
262 ; FAST-LABEL: saddoi64imm1:
264 ; FAST-NEXT: addq $2, %rdi
265 ; FAST-NEXT: seto %al
266 ; FAST-NEXT: movq %rdi, (%rsi)
267 ; FAST-NEXT: andb $1, %al
268 ; FAST-NEXT: movzbl %al, %eax
271 ; KNL-LABEL: saddoi64imm1:
273 ; KNL-NEXT: movl $2, %ecx
274 ; KNL-NEXT: addq %rdi, %rcx
276 ; KNL-NEXT: movq %rcx, (%rsi)
278 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 2, i64 %v1)
279 %val = extractvalue {i64, i1} %t, 0
280 %obit = extractvalue {i64, i1} %t, 1
281 store i64 %val, i64* %res
285 ; Check boundary conditions for large immediates.
286 define zeroext i1 @saddoi64imm2(i64 %v1, i64* %res) {
287 ; SDAG-LABEL: saddoi64imm2:
289 ; SDAG-NEXT: addq $-2147483648, %rdi ## imm = 0x80000000
290 ; SDAG-NEXT: seto %al
291 ; SDAG-NEXT: movq %rdi, (%rsi)
294 ; FAST-LABEL: saddoi64imm2:
296 ; FAST-NEXT: addq $-2147483648, %rdi ## imm = 0x80000000
297 ; FAST-NEXT: seto %al
298 ; FAST-NEXT: movq %rdi, (%rsi)
299 ; FAST-NEXT: andb $1, %al
300 ; FAST-NEXT: movzbl %al, %eax
303 ; KNL-LABEL: saddoi64imm2:
305 ; KNL-NEXT: addq $-2147483648, %rdi ## imm = 0x80000000
307 ; KNL-NEXT: movq %rdi, (%rsi)
309 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 -2147483648)
310 %val = extractvalue {i64, i1} %t, 0
311 %obit = extractvalue {i64, i1} %t, 1
312 store i64 %val, i64* %res
316 define zeroext i1 @saddoi64imm3(i64 %v1, i64* %res) {
317 ; SDAG-LABEL: saddoi64imm3:
319 ; SDAG-NEXT: movabsq $-21474836489, %rcx ## imm = 0xFFFFFFFAFFFFFFF7
320 ; SDAG-NEXT: addq %rdi, %rcx
321 ; SDAG-NEXT: seto %al
322 ; SDAG-NEXT: movq %rcx, (%rsi)
325 ; FAST-LABEL: saddoi64imm3:
327 ; FAST-NEXT: movabsq $-21474836489, %rax ## imm = 0xFFFFFFFAFFFFFFF7
328 ; FAST-NEXT: addq %rdi, %rax
329 ; FAST-NEXT: seto %cl
330 ; FAST-NEXT: movq %rax, (%rsi)
331 ; FAST-NEXT: andb $1, %cl
332 ; FAST-NEXT: movzbl %cl, %eax
335 ; KNL-LABEL: saddoi64imm3:
337 ; KNL-NEXT: movabsq $-21474836489, %rcx ## imm = 0xFFFFFFFAFFFFFFF7
338 ; KNL-NEXT: addq %rdi, %rcx
340 ; KNL-NEXT: movq %rcx, (%rsi)
342 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 -21474836489)
343 %val = extractvalue {i64, i1} %t, 0
344 %obit = extractvalue {i64, i1} %t, 1
345 store i64 %val, i64* %res
349 define zeroext i1 @saddoi64imm4(i64 %v1, i64* %res) {
350 ; SDAG-LABEL: saddoi64imm4:
352 ; SDAG-NEXT: addq $2147483647, %rdi ## imm = 0x7FFFFFFF
353 ; SDAG-NEXT: seto %al
354 ; SDAG-NEXT: movq %rdi, (%rsi)
357 ; FAST-LABEL: saddoi64imm4:
359 ; FAST-NEXT: addq $2147483647, %rdi ## imm = 0x7FFFFFFF
360 ; FAST-NEXT: seto %al
361 ; FAST-NEXT: movq %rdi, (%rsi)
362 ; FAST-NEXT: andb $1, %al
363 ; FAST-NEXT: movzbl %al, %eax
366 ; KNL-LABEL: saddoi64imm4:
368 ; KNL-NEXT: addq $2147483647, %rdi ## imm = 0x7FFFFFFF
370 ; KNL-NEXT: movq %rdi, (%rsi)
372 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 2147483647)
373 %val = extractvalue {i64, i1} %t, 0
374 %obit = extractvalue {i64, i1} %t, 1
375 store i64 %val, i64* %res
379 define zeroext i1 @saddoi64imm5(i64 %v1, i64* %res) {
380 ; SDAG-LABEL: saddoi64imm5:
382 ; SDAG-NEXT: movl $2147483648, %ecx ## imm = 0x80000000
383 ; SDAG-NEXT: addq %rdi, %rcx
384 ; SDAG-NEXT: seto %al
385 ; SDAG-NEXT: movq %rcx, (%rsi)
388 ; FAST-LABEL: saddoi64imm5:
390 ; FAST-NEXT: movl $2147483648, %eax ## imm = 0x80000000
391 ; FAST-NEXT: addq %rdi, %rax
392 ; FAST-NEXT: seto %cl
393 ; FAST-NEXT: movq %rax, (%rsi)
394 ; FAST-NEXT: andb $1, %cl
395 ; FAST-NEXT: movzbl %cl, %eax
398 ; KNL-LABEL: saddoi64imm5:
400 ; KNL-NEXT: movl $2147483648, %ecx ## imm = 0x80000000
401 ; KNL-NEXT: addq %rdi, %rcx
403 ; KNL-NEXT: movq %rcx, (%rsi)
405 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 2147483648)
406 %val = extractvalue {i64, i1} %t, 0
407 %obit = extractvalue {i64, i1} %t, 1
408 store i64 %val, i64* %res
413 define zeroext i1 @uaddoi32(i32 %v1, i32 %v2, i32* %res) {
414 ; SDAG-LABEL: uaddoi32:
416 ; SDAG-NEXT: addl %esi, %edi
417 ; SDAG-NEXT: setb %al
418 ; SDAG-NEXT: movl %edi, (%rdx)
421 ; FAST-LABEL: uaddoi32:
423 ; FAST-NEXT: addl %esi, %edi
424 ; FAST-NEXT: setb %al
425 ; FAST-NEXT: movl %edi, (%rdx)
426 ; FAST-NEXT: andb $1, %al
427 ; FAST-NEXT: movzbl %al, %eax
430 ; KNL-LABEL: uaddoi32:
432 ; KNL-NEXT: addl %esi, %edi
434 ; KNL-NEXT: movl %edi, (%rdx)
436 %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 %v2)
437 %val = extractvalue {i32, i1} %t, 0
438 %obit = extractvalue {i32, i1} %t, 1
439 store i32 %val, i32* %res
443 define zeroext i1 @uaddoi64(i64 %v1, i64 %v2, i64* %res) {
444 ; SDAG-LABEL: uaddoi64:
446 ; SDAG-NEXT: addq %rsi, %rdi
447 ; SDAG-NEXT: setb %al
448 ; SDAG-NEXT: movq %rdi, (%rdx)
451 ; FAST-LABEL: uaddoi64:
453 ; FAST-NEXT: addq %rsi, %rdi
454 ; FAST-NEXT: setb %al
455 ; FAST-NEXT: movq %rdi, (%rdx)
456 ; FAST-NEXT: andb $1, %al
457 ; FAST-NEXT: movzbl %al, %eax
460 ; KNL-LABEL: uaddoi64:
462 ; KNL-NEXT: addq %rsi, %rdi
464 ; KNL-NEXT: movq %rdi, (%rdx)
466 %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %v1, i64 %v2)
467 %val = extractvalue {i64, i1} %t, 0
468 %obit = extractvalue {i64, i1} %t, 1
469 store i64 %val, i64* %res
473 ; UADDO reg, 1 | NOT INC
474 define zeroext i1 @uaddoinci8(i8 %v1, i8* %res) {
475 ; SDAG-LABEL: uaddoinci8:
477 ; SDAG-NEXT: addb $1, %dil
478 ; SDAG-NEXT: setb %al
479 ; SDAG-NEXT: movb %dil, (%rsi)
482 ; FAST-LABEL: uaddoinci8:
484 ; FAST-NEXT: addb $1, %dil
485 ; FAST-NEXT: setb %al
486 ; FAST-NEXT: movb %dil, (%rsi)
487 ; FAST-NEXT: andb $1, %al
488 ; FAST-NEXT: movzbl %al, %eax
491 ; KNL-LABEL: uaddoinci8:
493 ; KNL-NEXT: addb $1, %dil
495 ; KNL-NEXT: movb %dil, (%rsi)
497 %t = call {i8, i1} @llvm.uadd.with.overflow.i8(i8 %v1, i8 1)
498 %val = extractvalue {i8, i1} %t, 0
499 %obit = extractvalue {i8, i1} %t, 1
500 store i8 %val, i8* %res
504 define zeroext i1 @uaddoinci16(i16 %v1, i16* %res) {
505 ; SDAG-LABEL: uaddoinci16:
507 ; SDAG-NEXT: addw $1, %di
508 ; SDAG-NEXT: setb %al
509 ; SDAG-NEXT: movw %di, (%rsi)
512 ; FAST-LABEL: uaddoinci16:
514 ; FAST-NEXT: addw $1, %di
515 ; FAST-NEXT: setb %al
516 ; FAST-NEXT: movw %di, (%rsi)
517 ; FAST-NEXT: andb $1, %al
518 ; FAST-NEXT: movzbl %al, %eax
521 ; KNL-LABEL: uaddoinci16:
523 ; KNL-NEXT: addw $1, %di
525 ; KNL-NEXT: movw %di, (%rsi)
527 %t = call {i16, i1} @llvm.uadd.with.overflow.i16(i16 %v1, i16 1)
528 %val = extractvalue {i16, i1} %t, 0
529 %obit = extractvalue {i16, i1} %t, 1
530 store i16 %val, i16* %res
534 define zeroext i1 @uaddoinci32(i32 %v1, i32* %res) {
535 ; SDAG-LABEL: uaddoinci32:
537 ; SDAG-NEXT: addl $1, %edi
538 ; SDAG-NEXT: setb %al
539 ; SDAG-NEXT: movl %edi, (%rsi)
542 ; FAST-LABEL: uaddoinci32:
544 ; FAST-NEXT: addl $1, %edi
545 ; FAST-NEXT: setb %al
546 ; FAST-NEXT: movl %edi, (%rsi)
547 ; FAST-NEXT: andb $1, %al
548 ; FAST-NEXT: movzbl %al, %eax
551 ; KNL-LABEL: uaddoinci32:
553 ; KNL-NEXT: addl $1, %edi
555 ; KNL-NEXT: movl %edi, (%rsi)
557 %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 1)
558 %val = extractvalue {i32, i1} %t, 0
559 %obit = extractvalue {i32, i1} %t, 1
560 store i32 %val, i32* %res
564 define zeroext i1 @uaddoinci64(i64 %v1, i64* %res) {
565 ; SDAG-LABEL: uaddoinci64:
567 ; SDAG-NEXT: addq $1, %rdi
568 ; SDAG-NEXT: setb %al
569 ; SDAG-NEXT: movq %rdi, (%rsi)
572 ; FAST-LABEL: uaddoinci64:
574 ; FAST-NEXT: addq $1, %rdi
575 ; FAST-NEXT: setb %al
576 ; FAST-NEXT: movq %rdi, (%rsi)
577 ; FAST-NEXT: andb $1, %al
578 ; FAST-NEXT: movzbl %al, %eax
581 ; KNL-LABEL: uaddoinci64:
583 ; KNL-NEXT: addq $1, %rdi
585 ; KNL-NEXT: movq %rdi, (%rsi)
587 %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %v1, i64 1)
588 %val = extractvalue {i64, i1} %t, 0
589 %obit = extractvalue {i64, i1} %t, 1
590 store i64 %val, i64* %res
595 define zeroext i1 @ssuboi32(i32 %v1, i32 %v2, i32* %res) {
596 ; SDAG-LABEL: ssuboi32:
598 ; SDAG-NEXT: subl %esi, %edi
599 ; SDAG-NEXT: seto %al
600 ; SDAG-NEXT: movl %edi, (%rdx)
603 ; FAST-LABEL: ssuboi32:
605 ; FAST-NEXT: subl %esi, %edi
606 ; FAST-NEXT: seto %al
607 ; FAST-NEXT: movl %edi, (%rdx)
608 ; FAST-NEXT: andb $1, %al
609 ; FAST-NEXT: movzbl %al, %eax
612 ; KNL-LABEL: ssuboi32:
614 ; KNL-NEXT: subl %esi, %edi
616 ; KNL-NEXT: movl %edi, (%rdx)
618 %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %v1, i32 %v2)
619 %val = extractvalue {i32, i1} %t, 0
620 %obit = extractvalue {i32, i1} %t, 1
621 store i32 %val, i32* %res
625 define zeroext i1 @ssuboi64(i64 %v1, i64 %v2, i64* %res) {
626 ; SDAG-LABEL: ssuboi64:
628 ; SDAG-NEXT: subq %rsi, %rdi
629 ; SDAG-NEXT: seto %al
630 ; SDAG-NEXT: movq %rdi, (%rdx)
633 ; FAST-LABEL: ssuboi64:
635 ; FAST-NEXT: subq %rsi, %rdi
636 ; FAST-NEXT: seto %al
637 ; FAST-NEXT: movq %rdi, (%rdx)
638 ; FAST-NEXT: andb $1, %al
639 ; FAST-NEXT: movzbl %al, %eax
642 ; KNL-LABEL: ssuboi64:
644 ; KNL-NEXT: subq %rsi, %rdi
646 ; KNL-NEXT: movq %rdi, (%rdx)
648 %t = call {i64, i1} @llvm.ssub.with.overflow.i64(i64 %v1, i64 %v2)
649 %val = extractvalue {i64, i1} %t, 0
650 %obit = extractvalue {i64, i1} %t, 1
651 store i64 %val, i64* %res
656 define zeroext i1 @usuboi32(i32 %v1, i32 %v2, i32* %res) {
657 ; SDAG-LABEL: usuboi32:
659 ; SDAG-NEXT: subl %esi, %edi
660 ; SDAG-NEXT: setb %al
661 ; SDAG-NEXT: movl %edi, (%rdx)
664 ; FAST-LABEL: usuboi32:
666 ; FAST-NEXT: subl %esi, %edi
667 ; FAST-NEXT: setb %al
668 ; FAST-NEXT: movl %edi, (%rdx)
669 ; FAST-NEXT: andb $1, %al
670 ; FAST-NEXT: movzbl %al, %eax
673 ; KNL-LABEL: usuboi32:
675 ; KNL-NEXT: subl %esi, %edi
677 ; KNL-NEXT: movl %edi, (%rdx)
679 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %v1, i32 %v2)
680 %val = extractvalue {i32, i1} %t, 0
681 %obit = extractvalue {i32, i1} %t, 1
682 store i32 %val, i32* %res
686 define zeroext i1 @usuboi64(i64 %v1, i64 %v2, i64* %res) {
687 ; SDAG-LABEL: usuboi64:
689 ; SDAG-NEXT: subq %rsi, %rdi
690 ; SDAG-NEXT: setb %al
691 ; SDAG-NEXT: movq %rdi, (%rdx)
694 ; FAST-LABEL: usuboi64:
696 ; FAST-NEXT: subq %rsi, %rdi
697 ; FAST-NEXT: setb %al
698 ; FAST-NEXT: movq %rdi, (%rdx)
699 ; FAST-NEXT: andb $1, %al
700 ; FAST-NEXT: movzbl %al, %eax
703 ; KNL-LABEL: usuboi64:
705 ; KNL-NEXT: subq %rsi, %rdi
707 ; KNL-NEXT: movq %rdi, (%rdx)
709 %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %v1, i64 %v2)
710 %val = extractvalue {i64, i1} %t, 0
711 %obit = extractvalue {i64, i1} %t, 1
712 store i64 %val, i64* %res
717 ; Check the use of the overflow bit in combination with a select instruction.
719 define i32 @saddoselecti32(i32 %v1, i32 %v2) {
720 ; SDAG-LABEL: saddoselecti32:
722 ; SDAG-NEXT: movl %edi, %eax
723 ; SDAG-NEXT: addl %esi, %eax
724 ; SDAG-NEXT: cmovol %edi, %esi
725 ; SDAG-NEXT: movl %esi, %eax
728 ; FAST-LABEL: saddoselecti32:
730 ; FAST-NEXT: movl %edi, %eax
731 ; FAST-NEXT: addl %esi, %eax
732 ; FAST-NEXT: cmovol %edi, %esi
733 ; FAST-NEXT: movl %esi, %eax
736 ; KNL-LABEL: saddoselecti32:
738 ; KNL-NEXT: movl %edi, %eax
739 ; KNL-NEXT: addl %esi, %eax
740 ; KNL-NEXT: cmovol %edi, %esi
741 ; KNL-NEXT: movl %esi, %eax
743 %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 %v2)
744 %obit = extractvalue {i32, i1} %t, 1
745 %ret = select i1 %obit, i32 %v1, i32 %v2
749 define i64 @saddoselecti64(i64 %v1, i64 %v2) {
750 ; SDAG-LABEL: saddoselecti64:
752 ; SDAG-NEXT: movq %rdi, %rax
753 ; SDAG-NEXT: addq %rsi, %rax
754 ; SDAG-NEXT: cmovoq %rdi, %rsi
755 ; SDAG-NEXT: movq %rsi, %rax
758 ; FAST-LABEL: saddoselecti64:
760 ; FAST-NEXT: movq %rdi, %rax
761 ; FAST-NEXT: addq %rsi, %rax
762 ; FAST-NEXT: cmovoq %rdi, %rsi
763 ; FAST-NEXT: movq %rsi, %rax
766 ; KNL-LABEL: saddoselecti64:
768 ; KNL-NEXT: movq %rdi, %rax
769 ; KNL-NEXT: addq %rsi, %rax
770 ; KNL-NEXT: cmovoq %rdi, %rsi
771 ; KNL-NEXT: movq %rsi, %rax
773 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 %v2)
774 %obit = extractvalue {i64, i1} %t, 1
775 %ret = select i1 %obit, i64 %v1, i64 %v2
779 define i32 @uaddoselecti32(i32 %v1, i32 %v2) {
780 ; SDAG-LABEL: uaddoselecti32:
782 ; SDAG-NEXT: movl %edi, %eax
783 ; SDAG-NEXT: addl %esi, %eax
784 ; SDAG-NEXT: cmovbl %edi, %esi
785 ; SDAG-NEXT: movl %esi, %eax
788 ; FAST-LABEL: uaddoselecti32:
790 ; FAST-NEXT: movl %edi, %eax
791 ; FAST-NEXT: addl %esi, %eax
792 ; FAST-NEXT: cmovbl %edi, %esi
793 ; FAST-NEXT: movl %esi, %eax
796 ; KNL-LABEL: uaddoselecti32:
798 ; KNL-NEXT: movl %edi, %eax
799 ; KNL-NEXT: addl %esi, %eax
800 ; KNL-NEXT: cmovbl %edi, %esi
801 ; KNL-NEXT: movl %esi, %eax
803 %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 %v2)
804 %obit = extractvalue {i32, i1} %t, 1
805 %ret = select i1 %obit, i32 %v1, i32 %v2
809 define i64 @uaddoselecti64(i64 %v1, i64 %v2) {
810 ; SDAG-LABEL: uaddoselecti64:
812 ; SDAG-NEXT: movq %rdi, %rax
813 ; SDAG-NEXT: addq %rsi, %rax
814 ; SDAG-NEXT: cmovbq %rdi, %rsi
815 ; SDAG-NEXT: movq %rsi, %rax
818 ; FAST-LABEL: uaddoselecti64:
820 ; FAST-NEXT: movq %rdi, %rax
821 ; FAST-NEXT: addq %rsi, %rax
822 ; FAST-NEXT: cmovbq %rdi, %rsi
823 ; FAST-NEXT: movq %rsi, %rax
826 ; KNL-LABEL: uaddoselecti64:
828 ; KNL-NEXT: movq %rdi, %rax
829 ; KNL-NEXT: addq %rsi, %rax
830 ; KNL-NEXT: cmovbq %rdi, %rsi
831 ; KNL-NEXT: movq %rsi, %rax
833 %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %v1, i64 %v2)
834 %obit = extractvalue {i64, i1} %t, 1
835 %ret = select i1 %obit, i64 %v1, i64 %v2
839 define i32 @ssuboselecti32(i32 %v1, i32 %v2) {
840 ; SDAG-LABEL: ssuboselecti32:
842 ; SDAG-NEXT: cmpl %esi, %edi
843 ; SDAG-NEXT: cmovol %edi, %esi
844 ; SDAG-NEXT: movl %esi, %eax
847 ; FAST-LABEL: ssuboselecti32:
849 ; FAST-NEXT: cmpl %esi, %edi
850 ; FAST-NEXT: cmovol %edi, %esi
851 ; FAST-NEXT: movl %esi, %eax
854 ; KNL-LABEL: ssuboselecti32:
856 ; KNL-NEXT: cmpl %esi, %edi
857 ; KNL-NEXT: cmovol %edi, %esi
858 ; KNL-NEXT: movl %esi, %eax
860 %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %v1, i32 %v2)
861 %obit = extractvalue {i32, i1} %t, 1
862 %ret = select i1 %obit, i32 %v1, i32 %v2
866 define i64 @ssuboselecti64(i64 %v1, i64 %v2) {
867 ; SDAG-LABEL: ssuboselecti64:
869 ; SDAG-NEXT: cmpq %rsi, %rdi
870 ; SDAG-NEXT: cmovoq %rdi, %rsi
871 ; SDAG-NEXT: movq %rsi, %rax
874 ; FAST-LABEL: ssuboselecti64:
876 ; FAST-NEXT: cmpq %rsi, %rdi
877 ; FAST-NEXT: cmovoq %rdi, %rsi
878 ; FAST-NEXT: movq %rsi, %rax
881 ; KNL-LABEL: ssuboselecti64:
883 ; KNL-NEXT: cmpq %rsi, %rdi
884 ; KNL-NEXT: cmovoq %rdi, %rsi
885 ; KNL-NEXT: movq %rsi, %rax
887 %t = call {i64, i1} @llvm.ssub.with.overflow.i64(i64 %v1, i64 %v2)
888 %obit = extractvalue {i64, i1} %t, 1
889 %ret = select i1 %obit, i64 %v1, i64 %v2
893 define i32 @usuboselecti32(i32 %v1, i32 %v2) {
894 ; SDAG-LABEL: usuboselecti32:
896 ; SDAG-NEXT: cmpl %esi, %edi
897 ; SDAG-NEXT: cmovbl %edi, %esi
898 ; SDAG-NEXT: movl %esi, %eax
901 ; FAST-LABEL: usuboselecti32:
903 ; FAST-NEXT: cmpl %esi, %edi
904 ; FAST-NEXT: cmovbl %edi, %esi
905 ; FAST-NEXT: movl %esi, %eax
908 ; KNL-LABEL: usuboselecti32:
910 ; KNL-NEXT: cmpl %esi, %edi
911 ; KNL-NEXT: cmovbl %edi, %esi
912 ; KNL-NEXT: movl %esi, %eax
914 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %v1, i32 %v2)
915 %obit = extractvalue {i32, i1} %t, 1
916 %ret = select i1 %obit, i32 %v1, i32 %v2
920 define i64 @usuboselecti64(i64 %v1, i64 %v2) {
921 ; SDAG-LABEL: usuboselecti64:
923 ; SDAG-NEXT: cmpq %rsi, %rdi
924 ; SDAG-NEXT: cmovbq %rdi, %rsi
925 ; SDAG-NEXT: movq %rsi, %rax
928 ; FAST-LABEL: usuboselecti64:
930 ; FAST-NEXT: cmpq %rsi, %rdi
931 ; FAST-NEXT: cmovbq %rdi, %rsi
932 ; FAST-NEXT: movq %rsi, %rax
935 ; KNL-LABEL: usuboselecti64:
937 ; KNL-NEXT: cmpq %rsi, %rdi
938 ; KNL-NEXT: cmovbq %rdi, %rsi
939 ; KNL-NEXT: movq %rsi, %rax
941 %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %v1, i64 %v2)
942 %obit = extractvalue {i64, i1} %t, 1
943 %ret = select i1 %obit, i64 %v1, i64 %v2
948 ; Check the use of the overflow bit in combination with a branch instruction.
950 define zeroext i1 @saddobri32(i32 %v1, i32 %v2) {
951 ; SDAG-LABEL: saddobri32:
953 ; SDAG-NEXT: addl %esi, %edi
954 ; SDAG-NEXT: jo LBB31_1
955 ; SDAG-NEXT: ## BB#2: ## %continue
956 ; SDAG-NEXT: movb $1, %al
958 ; SDAG-NEXT: LBB31_1: ## %overflow
959 ; SDAG-NEXT: xorl %eax, %eax
962 ; FAST-LABEL: saddobri32:
964 ; FAST-NEXT: addl %esi, %edi
965 ; FAST-NEXT: jo LBB31_1
966 ; FAST-NEXT: ## BB#2: ## %continue
967 ; FAST-NEXT: movb $1, %al
968 ; FAST-NEXT: andb $1, %al
969 ; FAST-NEXT: movzbl %al, %eax
971 ; FAST-NEXT: LBB31_1: ## %overflow
972 ; FAST-NEXT: xorl %eax, %eax
973 ; FAST-NEXT: andb $1, %al
974 ; FAST-NEXT: movzbl %al, %eax
977 ; KNL-LABEL: saddobri32:
979 ; KNL-NEXT: addl %esi, %edi
980 ; KNL-NEXT: jo LBB31_1
981 ; KNL-NEXT: ## BB#2: ## %continue
982 ; KNL-NEXT: movb $1, %al
984 ; KNL-NEXT: LBB31_1: ## %overflow
985 ; KNL-NEXT: xorl %eax, %eax
987 %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 %v2)
988 %val = extractvalue {i32, i1} %t, 0
989 %obit = extractvalue {i32, i1} %t, 1
990 br i1 %obit, label %overflow, label %continue, !prof !0
999 define zeroext i1 @saddobri64(i64 %v1, i64 %v2) {
1000 ; SDAG-LABEL: saddobri64:
1002 ; SDAG-NEXT: addq %rsi, %rdi
1003 ; SDAG-NEXT: jo LBB32_1
1004 ; SDAG-NEXT: ## BB#2: ## %continue
1005 ; SDAG-NEXT: movb $1, %al
1007 ; SDAG-NEXT: LBB32_1: ## %overflow
1008 ; SDAG-NEXT: xorl %eax, %eax
1011 ; FAST-LABEL: saddobri64:
1013 ; FAST-NEXT: addq %rsi, %rdi
1014 ; FAST-NEXT: jo LBB32_1
1015 ; FAST-NEXT: ## BB#2: ## %continue
1016 ; FAST-NEXT: movb $1, %al
1017 ; FAST-NEXT: andb $1, %al
1018 ; FAST-NEXT: movzbl %al, %eax
1020 ; FAST-NEXT: LBB32_1: ## %overflow
1021 ; FAST-NEXT: xorl %eax, %eax
1022 ; FAST-NEXT: andb $1, %al
1023 ; FAST-NEXT: movzbl %al, %eax
1026 ; KNL-LABEL: saddobri64:
1028 ; KNL-NEXT: addq %rsi, %rdi
1029 ; KNL-NEXT: jo LBB32_1
1030 ; KNL-NEXT: ## BB#2: ## %continue
1031 ; KNL-NEXT: movb $1, %al
1033 ; KNL-NEXT: LBB32_1: ## %overflow
1034 ; KNL-NEXT: xorl %eax, %eax
1036 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 %v2)
1037 %val = extractvalue {i64, i1} %t, 0
1038 %obit = extractvalue {i64, i1} %t, 1
1039 br i1 %obit, label %overflow, label %continue, !prof !0
1048 define zeroext i1 @uaddobri32(i32 %v1, i32 %v2) {
1049 ; SDAG-LABEL: uaddobri32:
1051 ; SDAG-NEXT: addl %esi, %edi
1052 ; SDAG-NEXT: jb LBB33_1
1053 ; SDAG-NEXT: ## BB#2: ## %continue
1054 ; SDAG-NEXT: movb $1, %al
1056 ; SDAG-NEXT: LBB33_1: ## %overflow
1057 ; SDAG-NEXT: xorl %eax, %eax
1060 ; FAST-LABEL: uaddobri32:
1062 ; FAST-NEXT: addl %esi, %edi
1063 ; FAST-NEXT: jb LBB33_1
1064 ; FAST-NEXT: ## BB#2: ## %continue
1065 ; FAST-NEXT: movb $1, %al
1066 ; FAST-NEXT: andb $1, %al
1067 ; FAST-NEXT: movzbl %al, %eax
1069 ; FAST-NEXT: LBB33_1: ## %overflow
1070 ; FAST-NEXT: xorl %eax, %eax
1071 ; FAST-NEXT: andb $1, %al
1072 ; FAST-NEXT: movzbl %al, %eax
1075 ; KNL-LABEL: uaddobri32:
1077 ; KNL-NEXT: addl %esi, %edi
1078 ; KNL-NEXT: jb LBB33_1
1079 ; KNL-NEXT: ## BB#2: ## %continue
1080 ; KNL-NEXT: movb $1, %al
1082 ; KNL-NEXT: LBB33_1: ## %overflow
1083 ; KNL-NEXT: xorl %eax, %eax
1085 %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 %v2)
1086 %val = extractvalue {i32, i1} %t, 0
1087 %obit = extractvalue {i32, i1} %t, 1
1088 br i1 %obit, label %overflow, label %continue, !prof !0
1097 define zeroext i1 @uaddobri64(i64 %v1, i64 %v2) {
1098 ; SDAG-LABEL: uaddobri64:
1100 ; SDAG-NEXT: addq %rsi, %rdi
1101 ; SDAG-NEXT: jb LBB34_1
1102 ; SDAG-NEXT: ## BB#2: ## %continue
1103 ; SDAG-NEXT: movb $1, %al
1105 ; SDAG-NEXT: LBB34_1: ## %overflow
1106 ; SDAG-NEXT: xorl %eax, %eax
1109 ; FAST-LABEL: uaddobri64:
1111 ; FAST-NEXT: addq %rsi, %rdi
1112 ; FAST-NEXT: jb LBB34_1
1113 ; FAST-NEXT: ## BB#2: ## %continue
1114 ; FAST-NEXT: movb $1, %al
1115 ; FAST-NEXT: andb $1, %al
1116 ; FAST-NEXT: movzbl %al, %eax
1118 ; FAST-NEXT: LBB34_1: ## %overflow
1119 ; FAST-NEXT: xorl %eax, %eax
1120 ; FAST-NEXT: andb $1, %al
1121 ; FAST-NEXT: movzbl %al, %eax
1124 ; KNL-LABEL: uaddobri64:
1126 ; KNL-NEXT: addq %rsi, %rdi
1127 ; KNL-NEXT: jb LBB34_1
1128 ; KNL-NEXT: ## BB#2: ## %continue
1129 ; KNL-NEXT: movb $1, %al
1131 ; KNL-NEXT: LBB34_1: ## %overflow
1132 ; KNL-NEXT: xorl %eax, %eax
1134 %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %v1, i64 %v2)
1135 %val = extractvalue {i64, i1} %t, 0
1136 %obit = extractvalue {i64, i1} %t, 1
1137 br i1 %obit, label %overflow, label %continue, !prof !0
1146 define zeroext i1 @ssubobri32(i32 %v1, i32 %v2) {
1147 ; SDAG-LABEL: ssubobri32:
1149 ; SDAG-NEXT: cmpl %esi, %edi
1150 ; SDAG-NEXT: jo LBB35_1
1151 ; SDAG-NEXT: ## BB#2: ## %continue
1152 ; SDAG-NEXT: movb $1, %al
1154 ; SDAG-NEXT: LBB35_1: ## %overflow
1155 ; SDAG-NEXT: xorl %eax, %eax
1158 ; FAST-LABEL: ssubobri32:
1160 ; FAST-NEXT: cmpl %esi, %edi
1161 ; FAST-NEXT: jo LBB35_1
1162 ; FAST-NEXT: ## BB#2: ## %continue
1163 ; FAST-NEXT: movb $1, %al
1164 ; FAST-NEXT: andb $1, %al
1165 ; FAST-NEXT: movzbl %al, %eax
1167 ; FAST-NEXT: LBB35_1: ## %overflow
1168 ; FAST-NEXT: xorl %eax, %eax
1169 ; FAST-NEXT: andb $1, %al
1170 ; FAST-NEXT: movzbl %al, %eax
1173 ; KNL-LABEL: ssubobri32:
1175 ; KNL-NEXT: cmpl %esi, %edi
1176 ; KNL-NEXT: jo LBB35_1
1177 ; KNL-NEXT: ## BB#2: ## %continue
1178 ; KNL-NEXT: movb $1, %al
1180 ; KNL-NEXT: LBB35_1: ## %overflow
1181 ; KNL-NEXT: xorl %eax, %eax
1183 %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %v1, i32 %v2)
1184 %val = extractvalue {i32, i1} %t, 0
1185 %obit = extractvalue {i32, i1} %t, 1
1186 br i1 %obit, label %overflow, label %continue, !prof !0
1195 define zeroext i1 @ssubobri64(i64 %v1, i64 %v2) {
1196 ; SDAG-LABEL: ssubobri64:
1198 ; SDAG-NEXT: cmpq %rsi, %rdi
1199 ; SDAG-NEXT: jo LBB36_1
1200 ; SDAG-NEXT: ## BB#2: ## %continue
1201 ; SDAG-NEXT: movb $1, %al
1203 ; SDAG-NEXT: LBB36_1: ## %overflow
1204 ; SDAG-NEXT: xorl %eax, %eax
1207 ; FAST-LABEL: ssubobri64:
1209 ; FAST-NEXT: cmpq %rsi, %rdi
1210 ; FAST-NEXT: jo LBB36_1
1211 ; FAST-NEXT: ## BB#2: ## %continue
1212 ; FAST-NEXT: movb $1, %al
1213 ; FAST-NEXT: andb $1, %al
1214 ; FAST-NEXT: movzbl %al, %eax
1216 ; FAST-NEXT: LBB36_1: ## %overflow
1217 ; FAST-NEXT: xorl %eax, %eax
1218 ; FAST-NEXT: andb $1, %al
1219 ; FAST-NEXT: movzbl %al, %eax
1222 ; KNL-LABEL: ssubobri64:
1224 ; KNL-NEXT: cmpq %rsi, %rdi
1225 ; KNL-NEXT: jo LBB36_1
1226 ; KNL-NEXT: ## BB#2: ## %continue
1227 ; KNL-NEXT: movb $1, %al
1229 ; KNL-NEXT: LBB36_1: ## %overflow
1230 ; KNL-NEXT: xorl %eax, %eax
1232 %t = call {i64, i1} @llvm.ssub.with.overflow.i64(i64 %v1, i64 %v2)
1233 %val = extractvalue {i64, i1} %t, 0
1234 %obit = extractvalue {i64, i1} %t, 1
1235 br i1 %obit, label %overflow, label %continue, !prof !0
1244 define zeroext i1 @usubobri32(i32 %v1, i32 %v2) {
1245 ; SDAG-LABEL: usubobri32:
1247 ; SDAG-NEXT: cmpl %esi, %edi
1248 ; SDAG-NEXT: jb LBB37_1
1249 ; SDAG-NEXT: ## BB#2: ## %continue
1250 ; SDAG-NEXT: movb $1, %al
1252 ; SDAG-NEXT: LBB37_1: ## %overflow
1253 ; SDAG-NEXT: xorl %eax, %eax
1256 ; FAST-LABEL: usubobri32:
1258 ; FAST-NEXT: cmpl %esi, %edi
1259 ; FAST-NEXT: jb LBB37_1
1260 ; FAST-NEXT: ## BB#2: ## %continue
1261 ; FAST-NEXT: movb $1, %al
1262 ; FAST-NEXT: andb $1, %al
1263 ; FAST-NEXT: movzbl %al, %eax
1265 ; FAST-NEXT: LBB37_1: ## %overflow
1266 ; FAST-NEXT: xorl %eax, %eax
1267 ; FAST-NEXT: andb $1, %al
1268 ; FAST-NEXT: movzbl %al, %eax
1271 ; KNL-LABEL: usubobri32:
1273 ; KNL-NEXT: cmpl %esi, %edi
1274 ; KNL-NEXT: jb LBB37_1
1275 ; KNL-NEXT: ## BB#2: ## %continue
1276 ; KNL-NEXT: movb $1, %al
1278 ; KNL-NEXT: LBB37_1: ## %overflow
1279 ; KNL-NEXT: xorl %eax, %eax
1281 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %v1, i32 %v2)
1282 %val = extractvalue {i32, i1} %t, 0
1283 %obit = extractvalue {i32, i1} %t, 1
1284 br i1 %obit, label %overflow, label %continue, !prof !0
1293 define zeroext i1 @usubobri64(i64 %v1, i64 %v2) {
1294 ; SDAG-LABEL: usubobri64:
1296 ; SDAG-NEXT: cmpq %rsi, %rdi
1297 ; SDAG-NEXT: jb LBB38_1
1298 ; SDAG-NEXT: ## BB#2: ## %continue
1299 ; SDAG-NEXT: movb $1, %al
1301 ; SDAG-NEXT: LBB38_1: ## %overflow
1302 ; SDAG-NEXT: xorl %eax, %eax
1305 ; FAST-LABEL: usubobri64:
1307 ; FAST-NEXT: cmpq %rsi, %rdi
1308 ; FAST-NEXT: jb LBB38_1
1309 ; FAST-NEXT: ## BB#2: ## %continue
1310 ; FAST-NEXT: movb $1, %al
1311 ; FAST-NEXT: andb $1, %al
1312 ; FAST-NEXT: movzbl %al, %eax
1314 ; FAST-NEXT: LBB38_1: ## %overflow
1315 ; FAST-NEXT: xorl %eax, %eax
1316 ; FAST-NEXT: andb $1, %al
1317 ; FAST-NEXT: movzbl %al, %eax
1320 ; KNL-LABEL: usubobri64:
1322 ; KNL-NEXT: cmpq %rsi, %rdi
1323 ; KNL-NEXT: jb LBB38_1
1324 ; KNL-NEXT: ## BB#2: ## %continue
1325 ; KNL-NEXT: movb $1, %al
1327 ; KNL-NEXT: LBB38_1: ## %overflow
1328 ; KNL-NEXT: xorl %eax, %eax
1330 %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %v1, i64 %v2)
1331 %val = extractvalue {i64, i1} %t, 0
1332 %obit = extractvalue {i64, i1} %t, 1
1333 br i1 %obit, label %overflow, label %continue, !prof !0
1342 define {i64, i1} @uaddoovf(i64 %a, i64 %b) {
1343 ; SDAG-LABEL: uaddoovf:
1345 ; SDAG-NEXT: movzbl %dil, %ecx
1346 ; SDAG-NEXT: movzbl %sil, %eax
1347 ; SDAG-NEXT: addq %rcx, %rax
1348 ; SDAG-NEXT: xorl %edx, %edx
1351 ; FAST-LABEL: uaddoovf:
1353 ; FAST-NEXT: movzbl %dil, %ecx
1354 ; FAST-NEXT: movzbl %sil, %eax
1355 ; FAST-NEXT: addq %rcx, %rax
1356 ; FAST-NEXT: xorl %edx, %edx
1359 ; KNL-LABEL: uaddoovf:
1361 ; KNL-NEXT: movzbl %dil, %ecx
1362 ; KNL-NEXT: movzbl %sil, %eax
1363 ; KNL-NEXT: addq %rcx, %rax
1364 ; KNL-NEXT: xorl %edx, %edx
1366 %1 = and i64 %a, 255
1367 %2 = and i64 %b, 255
1368 %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %1, i64 %2)
1372 define {i64, i1} @usuboovf(i64 %a, i64 %b) {
1373 ; SDAG-LABEL: usuboovf:
1375 ; SDAG-NEXT: notq %rsi
1376 ; SDAG-NEXT: xorl %edx, %edx
1377 ; SDAG-NEXT: movq %rsi, %rax
1380 ; FAST-LABEL: usuboovf:
1382 ; FAST-NEXT: notq %rsi
1383 ; FAST-NEXT: xorl %edx, %edx
1384 ; FAST-NEXT: movq %rsi, %rax
1387 ; KNL-LABEL: usuboovf:
1389 ; KNL-NEXT: notq %rsi
1390 ; KNL-NEXT: xorl %edx, %edx
1391 ; KNL-NEXT: movq %rsi, %rax
1393 %t0 = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %a, i64 %a)
1394 %v0 = extractvalue {i64, i1} %t0, 0
1395 %o0 = extractvalue {i64, i1} %t0, 1
1396 %t1 = call {i64, i1} @llvm.usub.with.overflow.i64(i64 -1, i64 %b)
1397 %v1 = extractvalue {i64, i1} %t1, 0
1398 %o1 = extractvalue {i64, i1} %t1, 1
1399 %oo = or i1 %o0, %o1
1400 %t2 = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %v1, i64 %v0)
1401 %v2 = extractvalue {i64, i1} %t2, 0
1402 %o2 = extractvalue {i64, i1} %t2, 1
1403 %ooo = or i1 %oo, %o2
1404 %t = insertvalue {i64, i1} %t2, i1 %ooo, 1
1408 declare {i8, i1} @llvm.sadd.with.overflow.i8 (i8, i8 ) nounwind readnone
1409 declare {i16, i1} @llvm.sadd.with.overflow.i16(i16, i16) nounwind readnone
1410 declare {i32, i1} @llvm.sadd.with.overflow.i32(i32, i32) nounwind readnone
1411 declare {i64, i1} @llvm.sadd.with.overflow.i64(i64, i64) nounwind readnone
1412 declare {i8, i1} @llvm.uadd.with.overflow.i8 (i8, i8 ) nounwind readnone
1413 declare {i16, i1} @llvm.uadd.with.overflow.i16(i16, i16) nounwind readnone
1414 declare {i32, i1} @llvm.uadd.with.overflow.i32(i32, i32) nounwind readnone
1415 declare {i64, i1} @llvm.uadd.with.overflow.i64(i64, i64) nounwind readnone
1416 declare {i32, i1} @llvm.ssub.with.overflow.i32(i32, i32) nounwind readnone
1417 declare {i64, i1} @llvm.ssub.with.overflow.i64(i64, i64) nounwind readnone
1418 declare {i32, i1} @llvm.usub.with.overflow.i32(i32, i32) nounwind readnone
1419 declare {i64, i1} @llvm.usub.with.overflow.i64(i64, i64) nounwind readnone
1421 !0 = !{!"branch_weights", i32 0, i32 2147483647}