1
1
; 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
3
3
4
4
define i32 @select_and_icmp (i32 %x , i32 %y , i32 %z ) {
5
5
; 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)
100
100
ret <2 x i8 > %D
101
101
}
102
102
103
-
104
103
define i32 @select_and_icmp_inv (i32 %x , i32 %y , i32 %z ) {
105
104
; CHECK-LABEL: @select_and_icmp_inv(
106
105
; CHECK-NEXT: ret i32 [[X:%.*]]
@@ -112,14 +111,12 @@ define i32 @select_and_icmp_inv(i32 %x, i32 %y, i32 %z) {
112
111
ret i32 %D
113
112
}
114
113
115
- ; Negative tests
114
+
115
+ ; Below used to be negative tests in InstSimplify, but are no more negative cases here
116
+
116
117
define i32 @select_and_icmp_pred_bad_1 (i32 %x , i32 %y , i32 %z ) {
117
118
; 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]]
123
120
;
124
121
%A = icmp eq i32 %x , %z
125
122
%B = icmp ne i32 %y , %z
@@ -130,10 +127,8 @@ define i32 @select_and_icmp_pred_bad_1(i32 %x, i32 %y, i32 %z) {
130
127
131
128
define i32 @select_and_icmp_pred_bad_2 (i32 %x , i32 %y , i32 %z ) {
132
129
; 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]]
137
132
; CHECK-NEXT: ret i32 [[D]]
138
133
;
139
134
%A = icmp ne i32 %x , %z
@@ -145,10 +140,8 @@ define i32 @select_and_icmp_pred_bad_2(i32 %x, i32 %y, i32 %z) {
145
140
146
141
define i32 @select_and_icmp_pred_bad_3 (i32 %x , i32 %y , i32 %z ) {
147
142
; 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]]
152
145
; CHECK-NEXT: ret i32 [[D]]
153
146
;
154
147
%A = icmp ne i32 %x , %z
@@ -160,10 +153,8 @@ define i32 @select_and_icmp_pred_bad_3(i32 %x, i32 %y, i32 %z) {
160
153
161
154
define i32 @select_and_icmp_pred_bad_4 (i32 %x , i32 %y , i32 %z ) {
162
155
; CHECK-LABEL: @select_and_icmp_pred_bad_4(
163
- ; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
164
156
; 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]]
167
158
; CHECK-NEXT: ret i32 [[D]]
168
159
;
169
160
%A = icmp eq i32 %x , %z
@@ -173,6 +164,60 @@ define i32 @select_and_icmp_pred_bad_4(i32 %x, i32 %y, i32 %z) {
173
164
ret i32 %D
174
165
}
175
166
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
+
176
221
define i32 @select_and_icmp_bad_true_val (i32 %x , i32 %y , i32 %z , i32 %k ) {
177
222
; CHECK-LABEL: @select_and_icmp_bad_true_val(
178
223
; 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) {
233
278
ret i32 %D
234
279
}
235
280
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
-
296
281
define i32 @select_and_icmp_alt_bad_5 (i32 %x , i32 %y , i32 %z , i32 %k ) {
297
282
; CHECK-LABEL: @select_and_icmp_alt_bad_5(
298
283
; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], [[K:%.*]]
0 commit comments