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_or_icmp (i32 %x , i32 %y , i32 %z ) {
55; CHECK-LABEL: @select_or_icmp(
@@ -111,13 +111,13 @@ define i32 @select_or_icmp_inv(i32 %x, i32 %y, i32 %z) {
111111 ret i32 %D
112112}
113113
114- ; Negative tests
114+
115+ ; Below used to be negative tests in InstSimplify, but are no more negative cases here
116+
115117define i32 @select_and_icmp_pred_bad_1 (i32 %x , i32 %y , i32 %z ) {
116118; CHECK-LABEL: @select_and_icmp_pred_bad_1(
117- ; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
118- ; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
119- ; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
120- ; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
119+ ; CHECK-NEXT: [[B_NOT:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
120+ ; CHECK-NEXT: [[D:%.*]] = select i1 [[B_NOT]], i32 [[X]], i32 [[Z]]
121121; CHECK-NEXT: ret i32 [[D]]
122122;
123123 %A = icmp eq i32 %x , %z
@@ -129,11 +129,7 @@ define i32 @select_and_icmp_pred_bad_1(i32 %x, i32 %y, i32 %z) {
129129
130130define i32 @select_and_icmp_pred_bad_2 (i32 %x , i32 %y , i32 %z ) {
131131; CHECK-LABEL: @select_and_icmp_pred_bad_2(
132- ; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
133- ; CHECK-NEXT: [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
134- ; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
135- ; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
136- ; CHECK-NEXT: ret i32 [[D]]
132+ ; CHECK-NEXT: ret i32 [[Z]]
137133;
138134 %A = icmp ne i32 %x , %z
139135 %B = icmp eq i32 %y , %z
@@ -144,10 +140,8 @@ define i32 @select_and_icmp_pred_bad_2(i32 %x, i32 %y, i32 %z) {
144140
145141define i32 @select_and_icmp_pred_bad_3 (i32 %x , i32 %y , i32 %z ) {
146142; CHECK-LABEL: @select_and_icmp_pred_bad_3(
147- ; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
148143; CHECK-NEXT: [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
149- ; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
150- ; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
144+ ; CHECK-NEXT: [[D:%.*]] = select i1 [[B]], i32 [[Z]], i32 [[X]]
151145; CHECK-NEXT: ret i32 [[D]]
152146;
153147 %A = icmp eq i32 %x , %z
@@ -159,10 +153,8 @@ define i32 @select_and_icmp_pred_bad_3(i32 %x, i32 %y, i32 %z) {
159153
160154define i32 @select_and_icmp_pred_bad_4 (i32 %x , i32 %y , i32 %z ) {
161155; CHECK-LABEL: @select_and_icmp_pred_bad_4(
162- ; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
163- ; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
164- ; CHECK-NEXT: [[C:%.*]] = and i1 [[A]], [[B]]
165- ; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
156+ ; CHECK-NEXT: [[B_NOT:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
157+ ; CHECK-NEXT: [[D:%.*]] = select i1 [[B_NOT]], i32 [[X]], i32 [[Z]]
166158; CHECK-NEXT: ret i32 [[D]]
167159;
168160 %A = icmp ne i32 %x , %z
@@ -172,6 +164,59 @@ define i32 @select_and_icmp_pred_bad_4(i32 %x, i32 %y, i32 %z) {
172164 ret i32 %D
173165}
174166
167+ define i32 @select_or_icmp_alt_bad_1 (i32 %x , i32 %y , i32 %z ) {
168+ ; CHECK-LABEL: @select_or_icmp_alt_bad_1(
169+ ; CHECK-NEXT: [[B_NOT:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
170+ ; CHECK-NEXT: [[D:%.*]] = select i1 [[B_NOT]], i32 [[Z]], i32 [[X]]
171+ ; CHECK-NEXT: ret i32 [[D]]
172+ ;
173+ %A = icmp eq i32 %x , %z
174+ %B = icmp ne i32 %y , %z
175+ %C = or i1 %A , %B
176+ %D = select i1 %C , i32 %x , i32 %z
177+ ret i32 %D
178+ }
179+
180+ define i32 @select_or_icmp_alt_bad_2 (i32 %x , i32 %y , i32 %z ) {
181+ ; CHECK-LABEL: @select_or_icmp_alt_bad_2(
182+ ; CHECK-NEXT: ret i32 [[X]]
183+ ;
184+ %A = icmp ne i32 %x , %z
185+ %B = icmp eq i32 %y , %z
186+ %C = or i1 %A , %B
187+ %D = select i1 %C , i32 %x , i32 %z
188+ ret i32 %D
189+ }
190+
191+ define i32 @select_or_icmp_alt_bad_3 (i32 %x , i32 %y , i32 %z ) {
192+ ; CHECK-LABEL: @select_or_icmp_alt_bad_3(
193+ ; CHECK-NEXT: [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
194+ ; CHECK-NEXT: [[D:%.*]] = select i1 [[B]], i32 [[X]], i32 [[Z]]
195+ ; CHECK-NEXT: ret i32 [[D]]
196+ ;
197+ %A = icmp eq i32 %x , %z
198+ %B = icmp eq i32 %y , %z
199+ %C = or i1 %A , %B
200+ %D = select i1 %C , i32 %x , i32 %z
201+ ret i32 %D
202+ }
203+
204+ define i32 @select_or_icmp_alt_bad_4 (i32 %x , i32 %y , i32 %z ) {
205+ ; CHECK-LABEL: @select_or_icmp_alt_bad_4(
206+ ; CHECK-NEXT: [[B_NOT:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
207+ ; CHECK-NEXT: [[D:%.*]] = select i1 [[B_NOT]], i32 [[Z]], i32 [[X]]
208+ ; CHECK-NEXT: ret i32 [[D]]
209+ ;
210+ %A = icmp ne i32 %x , %z
211+ %B = icmp ne i32 %y , %z
212+ %C = and i1 %A , %B
213+ %D = select i1 %C , i32 %x , i32 %z
214+ ret i32 %D
215+ }
216+
217+
218+ ; Negative tests
219+
175220define i32 @select_or_icmp_bad_true_val (i32 %x , i32 %y , i32 %z , i32 %k ) {
176221; CHECK-LABEL: @select_or_icmp_bad_true_val(
177222; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
@@ -217,7 +262,6 @@ define i32 @select_or_icmp_bad_op(i32 %x, i32 %y, i32 %z, i32 %k) {
217262 ret i32 %D
218263}
219264
220-
221265define i32 @select_or_icmp_bad_op_2 (i32 %x , i32 %y , i32 %z , i32 %k ) {
222266; CHECK-LABEL: @select_or_icmp_bad_op_2(
223267; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[K:%.*]]
@@ -233,66 +277,6 @@ define i32 @select_or_icmp_bad_op_2(i32 %x, i32 %y, i32 %z, i32 %k) {
233277 ret i32 %D
234278}
235279
236- define i32 @select_or_icmp_alt_bad_1 (i32 %x , i32 %y , i32 %z ) {
237- ; CHECK-LABEL: @select_or_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:%.*]] = or 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 = or i1 %A , %B
247- %D = select i1 %C , i32 %x , i32 %z
248- ret i32 %D
249- }
250-
251- define i32 @select_or_icmp_alt_bad_2 (i32 %x , i32 %y , i32 %z ) {
252- ; CHECK-LABEL: @select_or_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:%.*]] = or 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 = or i1 %A , %B
262- %D = select i1 %C , i32 %x , i32 %z
263- ret i32 %D
264- }
265-
266- define i32 @select_or_icmp_alt_bad_3 (i32 %x , i32 %y , i32 %z ) {
267- ; CHECK-LABEL: @select_or_icmp_alt_bad_3(
268- ; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
269- ; CHECK-NEXT: [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
270- ; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
271- ; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[Z]]
272- ; CHECK-NEXT: ret i32 [[D]]
273- ;
274- %A = icmp eq i32 %x , %z
275- %B = icmp eq i32 %y , %z
276- %C = or i1 %A , %B
277- %D = select i1 %C , i32 %x , i32 %z
278- ret i32 %D
279- }
280-
281- define i32 @select_or_icmp_alt_bad_4 (i32 %x , i32 %y , i32 %z ) {
282- ; CHECK-LABEL: @select_or_icmp_alt_bad_4(
283- ; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
284- ; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
285- ; CHECK-NEXT: [[C:%.*]] = and i1 [[A]], [[B]]
286- ; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[Z]]
287- ; CHECK-NEXT: ret i32 [[D]]
288- ;
289- %A = icmp ne i32 %x , %z
290- %B = icmp ne i32 %y , %z
291- %C = and i1 %A , %B
292- %D = select i1 %C , i32 %x , i32 %z
293- ret i32 %D
294- }
295-
296280define i32 @select_or_icmp_alt_bad_5 (i32 %x , i32 %y , i32 %z , i32 %k ) {
297281; CHECK-LABEL: @select_or_icmp_alt_bad_5(
298282; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[K:%.*]]
0 commit comments