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