Skip to content

Commit 0af77da

Browse files
committed
[InstCombine] Add tests for folding equality test. NFC
1 parent 848cec1 commit 0af77da

File tree

1 file changed

+253
-0
lines changed

1 file changed

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

0 commit comments

Comments
 (0)