11; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2- ; RUN: opt < %s -passes=instsimplify -S | FileCheck %s
2+ ; RUN: opt < %s -passes=instcombine -S | FileCheck %s
33
44define i32 @select_and_icmp (i32 %x , i32 %y , i32 %z ) {
55; CHECK-LABEL: @select_and_icmp(
@@ -100,7 +100,6 @@ define <2 x i8> @select_and_icmp_alt_vec(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z)
100100 ret <2 x i8 > %D
101101}
102102
103-
104103define i32 @select_and_icmp_inv (i32 %x , i32 %y , i32 %z ) {
105104; CHECK-LABEL: @select_and_icmp_inv(
106105; CHECK-NEXT: ret i32 [[X:%.*]]
@@ -112,14 +111,12 @@ define i32 @select_and_icmp_inv(i32 %x, i32 %y, i32 %z) {
112111 ret i32 %D
113112}
114113
115- ; Negative tests
114+
115+ ; Below used to be negative tests in InstSimplify, but are no more negative cases here
116+
116117define i32 @select_and_icmp_pred_bad_1 (i32 %x , i32 %y , i32 %z ) {
117118; CHECK-LABEL: @select_and_icmp_pred_bad_1(
118- ; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
119- ; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
120- ; CHECK-NEXT: [[C:%.*]] = and i1 [[A]], [[B]]
121- ; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
122- ; CHECK-NEXT: ret i32 [[D]]
119+ ; CHECK-NEXT: ret i32 [[X]]
123120;
124121 %A = icmp eq i32 %x , %z
125122 %B = icmp ne i32 %y , %z
@@ -130,10 +127,8 @@ define i32 @select_and_icmp_pred_bad_1(i32 %x, i32 %y, i32 %z) {
130127
131128define i32 @select_and_icmp_pred_bad_2 (i32 %x , i32 %y , i32 %z ) {
132129; CHECK-LABEL: @select_and_icmp_pred_bad_2(
133- ; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
134- ; CHECK-NEXT: [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
135- ; CHECK-NEXT: [[C:%.*]] = and i1 [[A]], [[B]]
136- ; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
130+ ; CHECK-NEXT: [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z:%.*]]
131+ ; CHECK-NEXT: [[D:%.*]] = select i1 [[B]], i32 [[Z]], i32 [[X]]
137132; CHECK-NEXT: ret i32 [[D]]
138133;
139134 %A = icmp ne i32 %x , %z
@@ -145,10 +140,8 @@ define i32 @select_and_icmp_pred_bad_2(i32 %x, i32 %y, i32 %z) {
145140
146141define i32 @select_and_icmp_pred_bad_3 (i32 %x , i32 %y , i32 %z ) {
147142; CHECK-LABEL: @select_and_icmp_pred_bad_3(
148- ; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
149- ; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
150- ; CHECK-NEXT: [[C:%.*]] = and i1 [[A]], [[B]]
151- ; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
143+ ; CHECK-NEXT: [[B_NOT:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
144+ ; CHECK-NEXT: [[D:%.*]] = select i1 [[B_NOT]], i32 [[X]], i32 [[Z]]
152145; CHECK-NEXT: ret i32 [[D]]
153146;
154147 %A = icmp ne i32 %x , %z
@@ -160,10 +153,8 @@ define i32 @select_and_icmp_pred_bad_3(i32 %x, i32 %y, i32 %z) {
160153
161154define i32 @select_and_icmp_pred_bad_4 (i32 %x , i32 %y , i32 %z ) {
162155; CHECK-LABEL: @select_and_icmp_pred_bad_4(
163- ; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
164156; CHECK-NEXT: [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
165- ; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
166- ; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
157+ ; CHECK-NEXT: [[D:%.*]] = select i1 [[B]], i32 [[Z]], i32 [[X]]
167158; CHECK-NEXT: ret i32 [[D]]
168159;
169160 %A = icmp eq i32 %x , %z
@@ -173,6 +164,60 @@ define i32 @select_and_icmp_pred_bad_4(i32 %x, i32 %y, i32 %z) {
173164 ret i32 %D
174165}
175166
167+ define i32 @select_and_icmp_alt_bad_1 (i32 %x , i32 %y , i32 %z ) {
168+ ; CHECK-LABEL: @select_and_icmp_alt_bad_1(
169+ ; CHECK-NEXT: ret i32 [[Z]]
170+ ;
171+ %A = icmp eq i32 %x , %z
172+ %B = icmp ne i32 %y , %z
173+ %C = and i1 %A , %B
174+ %D = select i1 %C , i32 %x , i32 %z
175+ ret i32 %D
176+ }
177+
178+ define i32 @select_and_icmp_alt_bad_2 (i32 %x , i32 %y , i32 %z ) {
179+ ; CHECK-LABEL: @select_and_icmp_alt_bad_2(
180+ ; CHECK-NEXT: [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
181+ ; CHECK-NEXT: [[D:%.*]] = select i1 [[B]], i32 [[X]], i32 [[Z]]
182+ ; CHECK-NEXT: ret i32 [[D]]
183+ ;
184+ %A = icmp ne i32 %x , %z
185+ %B = icmp eq i32 %y , %z
186+ %C = and i1 %A , %B
187+ %D = select i1 %C , i32 %x , i32 %z
188+ ret i32 %D
189+ }
190+
191+
192+ define i32 @select_and_icmp_alt_bad_3 (i32 %x , i32 %y , i32 %z ) {
193+ ; CHECK-LABEL: @select_and_icmp_alt_bad_3(
194+ ; CHECK-NEXT: [[B_NOT:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
195+ ; CHECK-NEXT: [[D:%.*]] = select i1 [[B_NOT]], i32 [[Z]], i32 [[X]]
196+ ; CHECK-NEXT: ret i32 [[D]]
197+ ;
198+ %A = icmp ne i32 %x , %z
199+ %B = icmp ne i32 %y , %z
200+ %C = and i1 %A , %B
201+ %D = select i1 %C , i32 %x , i32 %z
202+ ret i32 %D
203+ }
204+
205+ define i32 @select_and_icmp_alt_bad_4 (i32 %x , i32 %y , i32 %z ) {
206+ ; CHECK-LABEL: @select_and_icmp_alt_bad_4(
207+ ; CHECK-NEXT: [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
208+ ; CHECK-NEXT: [[D:%.*]] = select i1 [[B]], i32 [[X]], i32 [[Z]]
209+ ; CHECK-NEXT: ret i32 [[D]]
210+ ;
211+ %A = icmp eq i32 %x , %z
212+ %B = icmp eq i32 %y , %z
213+ %C = or i1 %A , %B
214+ %D = select i1 %C , i32 %x , i32 %z
215+ ret i32 %D
216+ }
217+
218+
219+ ; Negative tests
220+
176221define i32 @select_and_icmp_bad_true_val (i32 %x , i32 %y , i32 %z , i32 %k ) {
177222; CHECK-LABEL: @select_and_icmp_bad_true_val(
178223; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
@@ -233,66 +278,6 @@ define i32 @select_and_icmp_bad_op_2(i32 %x, i32 %y, i32 %z, i32 %k) {
233278 ret i32 %D
234279}
235280
236- define i32 @select_and_icmp_alt_bad_1 (i32 %x , i32 %y , i32 %z ) {
237- ; CHECK-LABEL: @select_and_icmp_alt_bad_1(
238- ; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
239- ; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
240- ; CHECK-NEXT: [[C:%.*]] = and i1 [[A]], [[B]]
241- ; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[Z]]
242- ; CHECK-NEXT: ret i32 [[D]]
243- ;
244- %A = icmp eq i32 %x , %z
245- %B = icmp ne i32 %y , %z
246- %C = and i1 %A , %B
247- %D = select i1 %C , i32 %x , i32 %z
248- ret i32 %D
249- }
250-
251- define i32 @select_and_icmp_alt_bad_2 (i32 %x , i32 %y , i32 %z ) {
252- ; CHECK-LABEL: @select_and_icmp_alt_bad_2(
253- ; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
254- ; CHECK-NEXT: [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
255- ; CHECK-NEXT: [[C:%.*]] = and i1 [[A]], [[B]]
256- ; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[Z]]
257- ; CHECK-NEXT: ret i32 [[D]]
258- ;
259- %A = icmp ne i32 %x , %z
260- %B = icmp eq i32 %y , %z
261- %C = and i1 %A , %B
262- %D = select i1 %C , i32 %x , i32 %z
263- ret i32 %D
264- }
265-
266- define i32 @select_and_icmp_alt_bad_3 (i32 %x , i32 %y , i32 %z ) {
267- ; CHECK-LABEL: @select_and_icmp_alt_bad_3(
268- ; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
269- ; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
270- ; CHECK-NEXT: [[C:%.*]] = and i1 [[A]], [[B]]
271- ; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[Z]]
272- ; CHECK-NEXT: ret i32 [[D]]
273- ;
274- %A = icmp ne i32 %x , %z
275- %B = icmp ne i32 %y , %z
276- %C = and i1 %A , %B
277- %D = select i1 %C , i32 %x , i32 %z
278- ret i32 %D
279- }
280-
281- define i32 @select_and_icmp_alt_bad_4 (i32 %x , i32 %y , i32 %z ) {
282- ; CHECK-LABEL: @select_and_icmp_alt_bad_4(
283- ; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
284- ; CHECK-NEXT: [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
285- ; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
286- ; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[Z]]
287- ; CHECK-NEXT: ret i32 [[D]]
288- ;
289- %A = icmp eq i32 %x , %z
290- %B = icmp eq i32 %y , %z
291- %C = or i1 %A , %B
292- %D = select i1 %C , i32 %x , i32 %z
293- ret i32 %D
294- }
295-
296281define i32 @select_and_icmp_alt_bad_5 (i32 %x , i32 %y , i32 %z , i32 %k ) {
297282; CHECK-LABEL: @select_and_icmp_alt_bad_5(
298283; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], [[K:%.*]]
0 commit comments