xref: /llvm-project/llvm/test/CodeGen/X86/overflow-intrinsic-setcc-fold.ll (revision 25528d6de70e98683722e28655d8568d5f09b5c7)
1bb16282fSAmara Emerson; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2bb16282fSAmara Emerson; RUN: llc < %s -mtriple=x86_64-apple-darwin -verify-machineinstrs | FileCheck %s --check-prefix=CHECK
3bb16282fSAmara Emerson
4bb16282fSAmara Emersondefine i1 @saddo_not_i32(i32 %v1, i32 %v2) {
5bb16282fSAmara Emerson; CHECK-LABEL: saddo_not_i32:
6*25528d6dSFrancis Visoiu Mistrih; CHECK:       ## %bb.0: ## %entry
7bb16282fSAmara Emerson; CHECK-NEXT:    addl %esi, %edi
87d6c55f8SAmara Emerson; CHECK-NEXT:    setno %al
9bb16282fSAmara Emerson; CHECK-NEXT:    retq
10bb16282fSAmara Emersonentry:
11bb16282fSAmara Emerson  %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 %v2)
12bb16282fSAmara Emerson  %obit = extractvalue {i32, i1} %t, 1
13bb16282fSAmara Emerson  %ret = xor i1 %obit, true
14bb16282fSAmara Emerson  ret i1 %ret
15bb16282fSAmara Emerson}
16bb16282fSAmara Emerson
17bb16282fSAmara Emersondefine i1 @saddo_not_i64(i64 %v1, i64 %v2) {
18bb16282fSAmara Emerson; CHECK-LABEL: saddo_not_i64:
19*25528d6dSFrancis Visoiu Mistrih; CHECK:       ## %bb.0: ## %entry
20bb16282fSAmara Emerson; CHECK-NEXT:    addq %rsi, %rdi
217d6c55f8SAmara Emerson; CHECK-NEXT:    setno %al
22bb16282fSAmara Emerson; CHECK-NEXT:    retq
23bb16282fSAmara Emersonentry:
24bb16282fSAmara Emerson  %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 %v2)
25bb16282fSAmara Emerson  %obit = extractvalue {i64, i1} %t, 1
26bb16282fSAmara Emerson  %ret = xor i1 %obit, true
27bb16282fSAmara Emerson  ret i1 %ret
28bb16282fSAmara Emerson}
29bb16282fSAmara Emerson
30bb16282fSAmara Emersondefine i1 @uaddo_not_i32(i32 %v1, i32 %v2) {
31bb16282fSAmara Emerson; CHECK-LABEL: uaddo_not_i32:
32*25528d6dSFrancis Visoiu Mistrih; CHECK:       ## %bb.0: ## %entry
33bb16282fSAmara Emerson; CHECK-NEXT:    addl %esi, %edi
347d6c55f8SAmara Emerson; CHECK-NEXT:    setae %al
35bb16282fSAmara Emerson; CHECK-NEXT:    retq
36bb16282fSAmara Emersonentry:
37bb16282fSAmara Emerson  %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 %v2)
38bb16282fSAmara Emerson  %obit = extractvalue {i32, i1} %t, 1
39bb16282fSAmara Emerson  %ret = xor i1 %obit, true
40bb16282fSAmara Emerson  ret i1 %ret
41bb16282fSAmara Emerson}
42bb16282fSAmara Emerson
43bb16282fSAmara Emersondefine i1 @uaddo_not_i64(i64 %v1, i64 %v2) {
44bb16282fSAmara Emerson; CHECK-LABEL: uaddo_not_i64:
45*25528d6dSFrancis Visoiu Mistrih; CHECK:       ## %bb.0: ## %entry
46bb16282fSAmara Emerson; CHECK-NEXT:    addq %rsi, %rdi
477d6c55f8SAmara Emerson; CHECK-NEXT:    setae %al
48bb16282fSAmara Emerson; CHECK-NEXT:    retq
49bb16282fSAmara Emersonentry:
50bb16282fSAmara Emerson  %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %v1, i64 %v2)
51bb16282fSAmara Emerson  %obit = extractvalue {i64, i1} %t, 1
52bb16282fSAmara Emerson  %ret = xor i1 %obit, true
53bb16282fSAmara Emerson  ret i1 %ret
54bb16282fSAmara Emerson}
55bb16282fSAmara Emerson
56bb16282fSAmara Emersondefine i1 @ssubo_not_i32(i32 %v1, i32 %v2) {
57bb16282fSAmara Emerson; CHECK-LABEL: ssubo_not_i32:
58*25528d6dSFrancis Visoiu Mistrih; CHECK:       ## %bb.0: ## %entry
59bb16282fSAmara Emerson; CHECK-NEXT:    cmpl %esi, %edi
607d6c55f8SAmara Emerson; CHECK-NEXT:    setno %al
61bb16282fSAmara Emerson; CHECK-NEXT:    retq
62bb16282fSAmara Emersonentry:
63bb16282fSAmara Emerson  %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %v1, i32 %v2)
64bb16282fSAmara Emerson  %obit = extractvalue {i32, i1} %t, 1
65bb16282fSAmara Emerson  %ret = xor i1 %obit, true
66bb16282fSAmara Emerson  ret i1 %ret
67bb16282fSAmara Emerson}
68bb16282fSAmara Emerson
69bb16282fSAmara Emersondefine i1 @ssub_not_i64(i64 %v1, i64 %v2) {
70bb16282fSAmara Emerson; CHECK-LABEL: ssub_not_i64:
71*25528d6dSFrancis Visoiu Mistrih; CHECK:       ## %bb.0: ## %entry
72bb16282fSAmara Emerson; CHECK-NEXT:    cmpq %rsi, %rdi
737d6c55f8SAmara Emerson; CHECK-NEXT:    setno %al
74bb16282fSAmara Emerson; CHECK-NEXT:    retq
75bb16282fSAmara Emersonentry:
76bb16282fSAmara Emerson  %t = call {i64, i1} @llvm.ssub.with.overflow.i64(i64 %v1, i64 %v2)
77bb16282fSAmara Emerson  %obit = extractvalue {i64, i1} %t, 1
78bb16282fSAmara Emerson  %ret = xor i1 %obit, true
79bb16282fSAmara Emerson  ret i1 %ret
80bb16282fSAmara Emerson}
81bb16282fSAmara Emerson
82bb16282fSAmara Emersondefine i1 @usubo_not_i32(i32 %v1, i32 %v2) {
83bb16282fSAmara Emerson; CHECK-LABEL: usubo_not_i32:
84*25528d6dSFrancis Visoiu Mistrih; CHECK:       ## %bb.0: ## %entry
85bb16282fSAmara Emerson; CHECK-NEXT:    cmpl %esi, %edi
867d6c55f8SAmara Emerson; CHECK-NEXT:    setae %al
87bb16282fSAmara Emerson; CHECK-NEXT:    retq
88bb16282fSAmara Emersonentry:
89bb16282fSAmara Emerson  %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %v1, i32 %v2)
90bb16282fSAmara Emerson  %obit = extractvalue {i32, i1} %t, 1
91bb16282fSAmara Emerson  %ret = xor i1 %obit, true
92bb16282fSAmara Emerson  ret i1 %ret
93bb16282fSAmara Emerson}
94bb16282fSAmara Emerson
95bb16282fSAmara Emersondefine i1 @usubo_not_i64(i64 %v1, i64 %v2) {
96bb16282fSAmara Emerson; CHECK-LABEL: usubo_not_i64:
97*25528d6dSFrancis Visoiu Mistrih; CHECK:       ## %bb.0: ## %entry
98bb16282fSAmara Emerson; CHECK-NEXT:    cmpq %rsi, %rdi
997d6c55f8SAmara Emerson; CHECK-NEXT:    setae %al
100bb16282fSAmara Emerson; CHECK-NEXT:    retq
101bb16282fSAmara Emersonentry:
102bb16282fSAmara Emerson  %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %v1, i64 %v2)
103bb16282fSAmara Emerson  %obit = extractvalue {i64, i1} %t, 1
104bb16282fSAmara Emerson  %ret = xor i1 %obit, true
105bb16282fSAmara Emerson  ret i1 %ret
106bb16282fSAmara Emerson}
107bb16282fSAmara Emerson
108bb16282fSAmara Emersondefine i1 @smulo_not_i32(i32 %v1, i32 %v2) {
109bb16282fSAmara Emerson; CHECK-LABEL: smulo_not_i32:
110*25528d6dSFrancis Visoiu Mistrih; CHECK:       ## %bb.0: ## %entry
111bb16282fSAmara Emerson; CHECK-NEXT:    imull %esi, %edi
1127d6c55f8SAmara Emerson; CHECK-NEXT:    setno %al
113bb16282fSAmara Emerson; CHECK-NEXT:    retq
114bb16282fSAmara Emersonentry:
115bb16282fSAmara Emerson  %t = call {i32, i1} @llvm.smul.with.overflow.i32(i32 %v1, i32 %v2)
116bb16282fSAmara Emerson  %obit = extractvalue {i32, i1} %t, 1
117bb16282fSAmara Emerson  %ret = xor i1 %obit, true
118bb16282fSAmara Emerson  ret i1 %ret
119bb16282fSAmara Emerson}
120bb16282fSAmara Emerson
121bb16282fSAmara Emersondefine i1 @smulo_not_i64(i64 %v1, i64 %v2) {
122bb16282fSAmara Emerson; CHECK-LABEL: smulo_not_i64:
123*25528d6dSFrancis Visoiu Mistrih; CHECK:       ## %bb.0: ## %entry
124bb16282fSAmara Emerson; CHECK-NEXT:    imulq %rsi, %rdi
1257d6c55f8SAmara Emerson; CHECK-NEXT:    setno %al
126bb16282fSAmara Emerson; CHECK-NEXT:    retq
127bb16282fSAmara Emersonentry:
128bb16282fSAmara Emerson  %t = call {i64, i1} @llvm.smul.with.overflow.i64(i64 %v1, i64 %v2)
129bb16282fSAmara Emerson  %obit = extractvalue {i64, i1} %t, 1
130bb16282fSAmara Emerson  %ret = xor i1 %obit, true
131bb16282fSAmara Emerson  ret i1 %ret
132bb16282fSAmara Emerson}
133bb16282fSAmara Emerson
134bb16282fSAmara Emersondefine i1 @umulo_not_i32(i32 %v1, i32 %v2) {
135bb16282fSAmara Emerson; CHECK-LABEL: umulo_not_i32:
136*25528d6dSFrancis Visoiu Mistrih; CHECK:       ## %bb.0: ## %entry
137bb16282fSAmara Emerson; CHECK-NEXT:    movl %edi, %eax
138bb16282fSAmara Emerson; CHECK-NEXT:    mull %esi
1397d6c55f8SAmara Emerson; CHECK-NEXT:    setno %al
140bb16282fSAmara Emerson; CHECK-NEXT:    retq
141bb16282fSAmara Emersonentry:
142bb16282fSAmara Emerson  %t = call {i32, i1} @llvm.umul.with.overflow.i32(i32 %v1, i32 %v2)
143bb16282fSAmara Emerson  %obit = extractvalue {i32, i1} %t, 1
144bb16282fSAmara Emerson  %ret = xor i1 %obit, true
145bb16282fSAmara Emerson  ret i1 %ret
146bb16282fSAmara Emerson}
147bb16282fSAmara Emerson
148bb16282fSAmara Emersondefine i1 @umulo_not_i64(i64 %v1, i64 %v2) {
149bb16282fSAmara Emerson; CHECK-LABEL: umulo_not_i64:
150*25528d6dSFrancis Visoiu Mistrih; CHECK:       ## %bb.0: ## %entry
151bb16282fSAmara Emerson; CHECK-NEXT:    movq %rdi, %rax
152bb16282fSAmara Emerson; CHECK-NEXT:    mulq %rsi
1537d6c55f8SAmara Emerson; CHECK-NEXT:    setno %al
154bb16282fSAmara Emerson; CHECK-NEXT:    retq
155bb16282fSAmara Emersonentry:
156bb16282fSAmara Emerson  %t = call {i64, i1} @llvm.umul.with.overflow.i64(i64 %v1, i64 %v2)
157bb16282fSAmara Emerson  %obit = extractvalue {i64, i1} %t, 1
158bb16282fSAmara Emerson  %ret = xor i1 %obit, true
159bb16282fSAmara Emerson  ret i1 %ret
160bb16282fSAmara Emerson}
161bb16282fSAmara Emerson
162bb16282fSAmara Emersondeclare {i32, i1} @llvm.sadd.with.overflow.i32(i32, i32) nounwind readnone
163bb16282fSAmara Emersondeclare {i64, i1} @llvm.sadd.with.overflow.i64(i64, i64) nounwind readnone
164bb16282fSAmara Emersondeclare {i32, i1} @llvm.uadd.with.overflow.i32(i32, i32) nounwind readnone
165bb16282fSAmara Emersondeclare {i64, i1} @llvm.uadd.with.overflow.i64(i64, i64) nounwind readnone
166bb16282fSAmara Emersondeclare {i32, i1} @llvm.ssub.with.overflow.i32(i32, i32) nounwind readnone
167bb16282fSAmara Emersondeclare {i64, i1} @llvm.ssub.with.overflow.i64(i64, i64) nounwind readnone
168bb16282fSAmara Emersondeclare {i32, i1} @llvm.usub.with.overflow.i32(i32, i32) nounwind readnone
169bb16282fSAmara Emersondeclare {i64, i1} @llvm.usub.with.overflow.i64(i64, i64) nounwind readnone
170bb16282fSAmara Emersondeclare {i32, i1} @llvm.smul.with.overflow.i32(i32, i32) nounwind readnone
171bb16282fSAmara Emersondeclare {i64, i1} @llvm.smul.with.overflow.i64(i64, i64) nounwind readnone
172bb16282fSAmara Emersondeclare {i32, i1} @llvm.umul.with.overflow.i32(i32, i32) nounwind readnone
173bb16282fSAmara Emersondeclare {i64, i1} @llvm.umul.with.overflow.i64(i64, i64) nounwind readnone
174bb16282fSAmara Emerson
175