xref: /llvm-project/llvm/test/Transforms/InstCombine/icmp-equality-test.ll (revision 09361953116770b646decf5820a9455ada2ba4fc)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3
4define i1 @icmp_equality_test(i64 %X, i64 %Y, i64 %Z) {
5; CHECK-LABEL: @icmp_equality_test(
6; CHECK-NEXT:  entry:
7; CHECK-NEXT:    [[XEQY:%.*]] = icmp eq i64 [[X:%.*]], [[Y:%.*]]
8; CHECK-NEXT:    ret i1 [[XEQY]]
9;
10entry:
11  %XeqZ = icmp eq i64 %X, %Z
12  %YeqZ = icmp eq i64 %Y, %Z
13  %XeqY = icmp eq i64 %X, %Y
14  %not.YeqZ = xor i1 %YeqZ, true
15  %and = select i1 %not.YeqZ, i1 %XeqY, i1 false
16  %equal = select i1 %XeqZ, i1 %YeqZ, i1 %and
17  ret i1 %equal
18}
19
20define i1 @icmp_equality_test_constant(i42 %X, i42 %Y) {
21; CHECK-LABEL: @icmp_equality_test_constant(
22; CHECK-NEXT:  entry:
23; CHECK-NEXT:    [[XEQY:%.*]] = icmp eq i42 [[X:%.*]], [[Y:%.*]]
24; CHECK-NEXT:    ret i1 [[XEQY]]
25;
26entry:
27  %XeqC = icmp eq i42 %X, -42
28  %YeqC = icmp eq i42 %Y, -42
29  %XeqY = icmp eq i42 %X, %Y
30  %not.YeqC = xor i1 %YeqC, true
31  %and = select i1 %not.YeqC, i1 %XeqY, i1 false
32  %equal = select i1 %XeqC, i1 %YeqC, i1 %and
33  ret i1 %equal
34}
35
36define i1 @icmp_equality_test_constant_samesign(i42 %X, i42 %Y) {
37; CHECK-LABEL: @icmp_equality_test_constant_samesign(
38; CHECK-NEXT:  entry:
39; CHECK-NEXT:    [[XEQY:%.*]] = icmp eq i42 [[X:%.*]], [[Y:%.*]]
40; CHECK-NEXT:    ret i1 [[XEQY]]
41;
42entry:
43  %XeqC = icmp eq i42 %X, -42
44  %YeqC = icmp eq i42 %Y, -42
45  %XeqY = icmp samesign eq i42 %X, %Y
46  %not.YeqC = xor i1 %YeqC, true
47  %and = select i1 %not.YeqC, i1 %XeqY, i1 false
48  %equal = select i1 %XeqC, i1 %YeqC, i1 %and
49  ret i1 %equal
50}
51
52define i1 @icmp_equality_test_swift_optional_pointers(i64 %X, i64 %Y) {
53; CHECK-LABEL: @icmp_equality_test_swift_optional_pointers(
54; CHECK-NEXT:  entry:
55; CHECK-NEXT:    [[XEQY:%.*]] = icmp eq i64 [[X:%.*]], [[Y:%.*]]
56; CHECK-NEXT:    ret i1 [[XEQY]]
57;
58entry:
59  %XeqC = icmp eq i64 %X, 0
60  %YeqC = icmp eq i64 %Y, 0
61  %either = select i1 %XeqC, i1 true, i1 %YeqC
62  %both = select i1 %XeqC, i1 %YeqC, i1 false
63  %XeqY = icmp eq i64 %X, %Y
64  %equal = select i1 %either, i1 %both, i1 %XeqY
65  ret i1 %equal
66}
67
68define <2 x i1> @icmp_equality_test_vector(<2 x i64> %X, <2 x i64> %Y) {
69; CHECK-LABEL: @icmp_equality_test_vector(
70; CHECK-NEXT:  entry:
71; CHECK-NEXT:    [[XEQY:%.*]] = icmp eq <2 x i64> [[X:%.*]], [[Y:%.*]]
72; CHECK-NEXT:    ret <2 x i1> [[XEQY]]
73;
74entry:
75  %XeqC = icmp eq <2 x i64> %X, <i64 123, i64 456>
76  %YeqC = icmp eq <2 x i64> %Y, <i64 123, i64 456>
77  %XeqY = icmp eq <2 x i64> %X, %Y
78  %not.YeqC = xor <2 x i1> %YeqC, <i1 true, i1 true>
79  %and = select <2 x i1> %not.YeqC, <2 x i1> %XeqY, <2 x i1> <i1 false, i1 false>
80  %equal = select <2 x i1> %XeqC, <2 x i1> %YeqC, <2 x i1> %and
81  ret <2 x i1> %equal
82}
83
84define i1 @icmp_equality_test_commute_icmp1(i64 %X, i64 %Y, i64 %Z) {
85; CHECK-LABEL: @icmp_equality_test_commute_icmp1(
86; CHECK-NEXT:  entry:
87; CHECK-NEXT:    [[XEQY:%.*]] = icmp eq i64 [[Y:%.*]], [[X:%.*]]
88; CHECK-NEXT:    ret i1 [[XEQY]]
89;
90entry:
91  %XeqZ = icmp eq i64 %Z, %X
92  %YeqZ = icmp eq i64 %Z, %Y
93  %XeqY = icmp eq i64 %Y, %X
94  %not.YeqZ = xor i1 %YeqZ, true
95  %and = select i1 %not.YeqZ, i1 %XeqY, i1 false
96  %equal = select i1 %XeqZ, i1 %YeqZ, i1 %and
97  ret i1 %equal
98}
99
100define i1 @icmp_equality_test_commute_icmp2(i64 %X, i64 %Y, i64 %Z) {
101; CHECK-LABEL: @icmp_equality_test_commute_icmp2(
102; CHECK-NEXT:    [[XEQY:%.*]] = icmp eq i64 [[Y:%.*]], [[X:%.*]]
103; CHECK-NEXT:    ret i1 [[XEQY]]
104;
105  %XeqZ = icmp eq i64 %Z, %X
106  %YeqZ = icmp eq i64 %Y, %Z
107  %XeqY = icmp eq i64 %Y, %X
108  %not.YeqZ = xor i1 %YeqZ, true
109  %and = select i1 %not.YeqZ, i1 %XeqY, i1 false
110  %equal = select i1 %XeqZ, i1 %YeqZ, i1 %and
111  ret i1 %equal
112}
113
114define i1 @icmp_equality_test_commute_select1(i64 %X, i64 %Y, i64 %Z) {
115; CHECK-LABEL: @icmp_equality_test_commute_select1(
116; CHECK-NEXT:  entry:
117; CHECK-NEXT:    [[XEQY:%.*]] = icmp eq i64 [[X:%.*]], [[Y:%.*]]
118; CHECK-NEXT:    ret i1 [[XEQY]]
119;
120entry:
121  %XeqZ = icmp eq i64 %X, %Z
122  %YeqZ = icmp eq i64 %Y, %Z
123  %XeqY = icmp eq i64 %X, %Y
124  %and = select i1 %YeqZ, i1 false, i1 %XeqY
125  %equal = select i1 %XeqZ, i1 %YeqZ, i1 %and
126  ret i1 %equal
127}
128
129define i1 @icmp_equality_test_commute_select2(i64 %X, i64 %Y, i64 %Z) {
130; CHECK-LABEL: @icmp_equality_test_commute_select2(
131; CHECK-NEXT:  entry:
132; CHECK-NEXT:    [[XEQY:%.*]] = icmp eq i64 [[X:%.*]], [[Y:%.*]]
133; CHECK-NEXT:    ret i1 [[XEQY]]
134;
135entry:
136  %XeqZ = icmp eq i64 %X, %Z
137  %YeqZ = icmp eq i64 %Y, %Z
138  %XeqY = icmp eq i64 %X, %Y
139  %not.XeqZ = xor i1 %XeqZ, true
140  %and = select i1 %YeqZ, i1 false, i1 %XeqY
141  %equal = select i1 %not.XeqZ, i1 %and, i1 %YeqZ
142  ret i1 %equal
143}
144
145; Negative tests below
146
147define i1 @icmp_equality_test_wrong_constant(i64 %X, i64 %Y) {
148; CHECK-LABEL: @icmp_equality_test_wrong_constant(
149; CHECK-NEXT:  entry:
150; CHECK-NEXT:    [[XEQC:%.*]] = icmp eq i64 [[X:%.*]], 0
151; CHECK-NEXT:    [[YEQC:%.*]] = icmp eq i64 [[Y:%.*]], 999
152; CHECK-NEXT:    [[XEQY:%.*]] = icmp eq i64 [[X]], [[Y]]
153; CHECK-NEXT:    [[NOT_YEQC:%.*]] = xor i1 [[YEQC]], true
154; CHECK-NEXT:    [[AND:%.*]] = select i1 [[NOT_YEQC]], i1 [[XEQY]], i1 false
155; CHECK-NEXT:    [[EQUAL:%.*]] = select i1 [[XEQC]], i1 [[YEQC]], i1 [[AND]]
156; CHECK-NEXT:    ret i1 [[EQUAL]]
157;
158entry:
159  %XeqC = icmp eq i64 %X, 0
160  %YeqC = icmp eq i64 %Y, 999
161  %XeqY = icmp eq i64 %X, %Y
162  %not.YeqC = xor i1 %YeqC, true
163  %and = select i1 %not.YeqC, i1 %XeqY, i1 false
164  %equal = select i1 %XeqC, i1 %YeqC, i1 %and
165  ret i1 %equal
166}
167
168define i1 @icmp_equality_test_missing_not(i64 %X, i64 %Y, i64 %Z) {
169; CHECK-LABEL: @icmp_equality_test_missing_not(
170; CHECK-NEXT:    [[XEQZ:%.*]] = icmp eq i64 [[X:%.*]], [[Z:%.*]]
171; CHECK-NEXT:    [[YEQZ:%.*]] = icmp eq i64 [[Y:%.*]], [[Z]]
172; CHECK-NEXT:    [[XEQY:%.*]] = icmp eq i64 [[X]], [[Y]]
173; CHECK-NEXT:    [[AND:%.*]] = select i1 [[YEQZ]], i1 [[XEQY]], i1 false
174; CHECK-NEXT:    [[EQUAL:%.*]] = select i1 [[XEQZ]], i1 [[YEQZ]], i1 [[AND]]
175; CHECK-NEXT:    ret i1 [[EQUAL]]
176;
177  %XeqZ = icmp eq i64 %X, %Z
178  %YeqZ = icmp eq i64 %Y, %Z
179  %XeqY = icmp eq i64 %X, %Y
180  %and = select i1 %YeqZ, i1 %XeqY, i1 false
181  %equal = select i1 %XeqZ, i1 %YeqZ, i1 %and
182  ret i1 %equal
183}
184
185define i1 @icmp_equality_test_wrong_and(i64 %X, i64 %Y, i64 %Z) {
186; CHECK-LABEL: @icmp_equality_test_wrong_and(
187; CHECK-NEXT:  entry:
188; CHECK-NEXT:    [[XEQZ:%.*]] = icmp eq i64 [[X:%.*]], [[Z:%.*]]
189; CHECK-NEXT:    [[YEQZ:%.*]] = icmp eq i64 [[Y:%.*]], [[Z]]
190; CHECK-NEXT:    [[XEQY:%.*]] = icmp eq i64 [[X]], [[Y]]
191; CHECK-NEXT:    [[AND:%.*]] = select i1 [[YEQZ]], i1 [[XEQY]], i1 false
192; CHECK-NEXT:    [[EQUAL:%.*]] = select i1 [[XEQZ]], i1 [[YEQZ]], i1 [[AND]]
193; CHECK-NEXT:    ret i1 [[EQUAL]]
194;
195entry:
196  %XeqZ = icmp eq i64 %X, %Z
197  %YeqZ = icmp eq i64 %Y, %Z
198  %XeqY = icmp eq i64 %X, %Y
199  %not.YeqZ = xor i1 %YeqZ, true
200  %and = select i1 %not.YeqZ, i1 false, i1 %XeqY
201  %equal = select i1 %XeqZ, i1 %YeqZ, i1 %and
202  ret i1 %equal
203}
204
205define i1 @icmp_equality_test_wrong_cmp(i64 %X, i64 %Y, i64 %Z) {
206; CHECK-LABEL: @icmp_equality_test_wrong_cmp(
207; CHECK-NEXT:  entry:
208; CHECK-NEXT:    [[XEQZ:%.*]] = icmp eq i64 [[X:%.*]], [[Z:%.*]]
209; CHECK-NEXT:    [[YEQZ:%.*]] = icmp eq i64 [[Y:%.*]], [[Z]]
210; CHECK-NEXT:    [[XEQY:%.*]] = icmp eq i64 [[X]], 999
211; CHECK-NEXT:    [[NOT_YEQZ:%.*]] = xor i1 [[YEQZ]], true
212; CHECK-NEXT:    [[AND:%.*]] = select i1 [[NOT_YEQZ]], i1 [[XEQY]], i1 false
213; CHECK-NEXT:    [[EQUAL:%.*]] = select i1 [[XEQZ]], i1 [[YEQZ]], i1 [[AND]]
214; CHECK-NEXT:    ret i1 [[EQUAL]]
215;
216entry:
217  %XeqZ = icmp eq i64 %X, %Z
218  %YeqZ = icmp eq i64 %Y, %Z
219  %XeqY = icmp eq i64 %X, 999
220  %not.YeqZ = xor i1 %YeqZ, true
221  %and = select i1 %not.YeqZ, i1 %XeqY, i1 false
222  %equal = select i1 %XeqZ, i1 %YeqZ, i1 %and
223  ret i1 %equal
224}
225
226define i1 @icmp_equality_test_wrong_equal(i64 %X, i64 %Y, i64 %Z) {
227; CHECK-LABEL: @icmp_equality_test_wrong_equal(
228; CHECK-NEXT:  entry:
229; CHECK-NEXT:    [[XEQZ:%.*]] = icmp eq i64 [[X:%.*]], [[Z:%.*]]
230; CHECK-NEXT:    [[YEQZ:%.*]] = icmp eq i64 [[Y:%.*]], [[Z]]
231; CHECK-NEXT:    [[XEQY:%.*]] = icmp eq i64 [[X]], [[Y]]
232; CHECK-NEXT:    [[NOT_YEQZ:%.*]] = xor i1 [[YEQZ]], true
233; CHECK-NEXT:    [[AND:%.*]] = select i1 [[NOT_YEQZ]], i1 [[XEQY]], i1 false
234; CHECK-NEXT:    [[EQUAL:%.*]] = select i1 [[XEQZ]], i1 [[AND]], i1 [[YEQZ]]
235; CHECK-NEXT:    ret i1 [[EQUAL]]
236;
237entry:
238  %XeqZ = icmp eq i64 %X, %Z
239  %YeqZ = icmp eq i64 %Y, %Z
240  %XeqY = icmp eq i64 %X, %Y
241  %not.YeqZ = xor i1 %YeqZ, true
242  %and = select i1 %not.YeqZ, i1 %XeqY, i1 false
243  %equal = select i1 %XeqZ, i1 %and, i1 %YeqZ
244  ret i1 %equal
245}
246