@@ -192,8 +192,8 @@ define i1 @icmp_select_implied_cond_ne(i8 %x, i8 %y) {
192
192
define i1 @icmp_select_implied_cond_swapped_select (i8 %x , i8 %y ) {
193
193
; CHECK-LABEL: @icmp_select_implied_cond_swapped_select(
194
194
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X:%.*]], 0
195
- ; CHECK-NEXT: [[CMP21 :%.*]] = icmp eq i8 [[Y:%.*]], 0
196
- ; CHECK-NEXT: [[CMP2:%.*]] = select i1 [[CMP1]], i1 [[CMP21 ]], i1 false
195
+ ; CHECK-NEXT: [[TMP1 :%.*]] = icmp eq i8 [[Y:%.*]], 0
196
+ ; CHECK-NEXT: [[CMP2:%.*]] = select i1 [[CMP1]], i1 [[TMP1 ]], i1 false
197
197
; CHECK-NEXT: ret i1 [[CMP2]]
198
198
;
199
199
%cmp1 = icmp eq i8 %x , 0
@@ -259,3 +259,150 @@ define i1 @umin_seq_comparison(i8 %x, i8 %y) {
259
259
%cmp2 = icmp eq i8 %sel , %x
260
260
ret i1 %cmp2
261
261
}
262
+
263
+ define i1 @select_constants_and_icmp_eq0 (i1 %x , i1 %y ) {
264
+ ; CHECK-LABEL: @select_constants_and_icmp_eq0(
265
+ ; CHECK-NEXT: [[S1:%.*]] = select i1 [[X:%.*]], i8 2, i8 1
266
+ ; CHECK-NEXT: [[S2:%.*]] = select i1 [[Y:%.*]], i8 2, i8 1
267
+ ; CHECK-NEXT: [[AND:%.*]] = and i8 [[S1]], [[S2]]
268
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[AND]], 0
269
+ ; CHECK-NEXT: ret i1 [[CMP]]
270
+ ;
271
+ %s1 = select i1 %x , i8 2 , i8 1
272
+ %s2 = select i1 %y , i8 2 , i8 1
273
+ %and = and i8 %s1 , %s2
274
+ %cmp = icmp eq i8 %and , 0
275
+ ret i1 %cmp
276
+ }
277
+
278
+ define i1 @select_constants_and_icmp_eq0_uses (i1 %x , i1 %y ) {
279
+ ; CHECK-LABEL: @select_constants_and_icmp_eq0_uses(
280
+ ; CHECK-NEXT: [[S1:%.*]] = select i1 [[X:%.*]], i8 2, i8 1
281
+ ; CHECK-NEXT: call void @use(i8 [[S1]])
282
+ ; CHECK-NEXT: [[S2:%.*]] = select i1 [[Y:%.*]], i8 2, i8 1
283
+ ; CHECK-NEXT: call void @use(i8 [[S2]])
284
+ ; CHECK-NEXT: [[AND:%.*]] = and i8 [[S1]], [[S2]]
285
+ ; CHECK-NEXT: call void @use(i8 [[AND]])
286
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[AND]], 0
287
+ ; CHECK-NEXT: ret i1 [[CMP]]
288
+ ;
289
+ %s1 = select i1 %x , i8 2 , i8 1
290
+ call void @use (i8 %s1 )
291
+ %s2 = select i1 %y , i8 2 , i8 1
292
+ call void @use (i8 %s2 )
293
+ %and = and i8 %s1 , %s2
294
+ call void @use (i8 %and )
295
+ %cmp = icmp eq i8 %and , 0
296
+ ret i1 %cmp
297
+ }
298
+
299
+ define <2 x i1 > @select_constants_and_icmp_eq0_vec_splat (<2 x i1 > %x , <2 x i1 > %y ) {
300
+ ; CHECK-LABEL: @select_constants_and_icmp_eq0_vec_splat(
301
+ ; CHECK-NEXT: [[S1:%.*]] = select <2 x i1> [[X:%.*]], <2 x i9> <i9 3, i9 3>, <2 x i9> <i9 48, i9 48>
302
+ ; CHECK-NEXT: [[S2:%.*]] = select <2 x i1> [[Y:%.*]], <2 x i9> <i9 3, i9 3>, <2 x i9> <i9 48, i9 48>
303
+ ; CHECK-NEXT: [[AND:%.*]] = and <2 x i9> [[S1]], [[S2]]
304
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i9> [[AND]], zeroinitializer
305
+ ; CHECK-NEXT: ret <2 x i1> [[CMP]]
306
+ ;
307
+ %s1 = select <2 x i1 > %x , <2 x i9 > <i9 3 , i9 3 >, <2 x i9 > <i9 48 , i9 48 >
308
+ %s2 = select <2 x i1 > %y , <2 x i9 > <i9 3 , i9 3 >, <2 x i9 > <i9 48 , i9 48 >
309
+ %and = and <2 x i9 > %s1 , %s2
310
+ %cmp = icmp eq <2 x i9 > %and , zeroinitializer
311
+ ret <2 x i1 > %cmp
312
+ }
313
+
314
+ define i1 @select_constants_and_icmp_eq0_common_bit (i1 %x , i1 %y ) {
315
+ ; CHECK-LABEL: @select_constants_and_icmp_eq0_common_bit(
316
+ ; CHECK-NEXT: ret i1 false
317
+ ;
318
+ %s1 = select i1 %x , i8 2 , i8 3
319
+ %s2 = select i1 %y , i8 2 , i8 3
320
+ %and = and i8 %s1 , %s2
321
+ %cmp = icmp eq i8 %and , 0
322
+ ret i1 %cmp
323
+ }
324
+
325
+ define i1 @select_constants_and_icmp_eq0_no_common_op1 (i1 %x , i1 %y ) {
326
+ ; CHECK-LABEL: @select_constants_and_icmp_eq0_no_common_op1(
327
+ ; CHECK-NEXT: [[S1:%.*]] = select i1 [[X:%.*]], i8 16, i8 3
328
+ ; CHECK-NEXT: [[S2:%.*]] = select i1 [[Y:%.*]], i8 24, i8 3
329
+ ; CHECK-NEXT: [[AND:%.*]] = and i8 [[S1]], [[S2]]
330
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[AND]], 0
331
+ ; CHECK-NEXT: ret i1 [[CMP]]
332
+ ;
333
+ %s1 = select i1 %x , i8 16 , i8 3
334
+ %s2 = select i1 %y , i8 24 , i8 3
335
+ %and = and i8 %s1 , %s2
336
+ %cmp = icmp eq i8 %and , 0
337
+ ret i1 %cmp
338
+ }
339
+
340
+ define i1 @select_constants_and_icmp_eq0_no_common_op2 (i1 %x , i1 %y ) {
341
+ ; CHECK-LABEL: @select_constants_and_icmp_eq0_no_common_op2(
342
+ ; CHECK-NEXT: [[S1:%.*]] = select i1 [[X:%.*]], i8 16, i8 3
343
+ ; CHECK-NEXT: [[S2:%.*]] = select i1 [[Y:%.*]], i8 16, i8 7
344
+ ; CHECK-NEXT: [[AND:%.*]] = and i8 [[S1]], [[S2]]
345
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[AND]], 0
346
+ ; CHECK-NEXT: ret i1 [[CMP]]
347
+ ;
348
+ %s1 = select i1 %x , i8 16 , i8 3
349
+ %s2 = select i1 %y , i8 16 , i8 7
350
+ %and = and i8 %s1 , %s2
351
+ %cmp = icmp eq i8 %and , 0
352
+ ret i1 %cmp
353
+ }
354
+
355
+ define i1 @select_constants_and_icmp_eq0_zero_tval (i1 %x , i1 %y ) {
356
+ ; CHECK-LABEL: @select_constants_and_icmp_eq0_zero_tval(
357
+ ; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[X:%.*]], i1 true, i1 [[Y:%.*]]
358
+ ; CHECK-NEXT: ret i1 [[TMP1]]
359
+ ;
360
+ %s1 = select i1 %x , i8 0 , i8 12
361
+ %s2 = select i1 %y , i8 0 , i8 12
362
+ %and = and i8 %s1 , %s2
363
+ %cmp = icmp eq i8 %and , 0
364
+ ret i1 %cmp
365
+ }
366
+
367
+ define i1 @select_constants_and_icmp_eq0_zero_fval (i1 %x , i1 %y ) {
368
+ ; CHECK-LABEL: @select_constants_and_icmp_eq0_zero_fval(
369
+ ; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[X:%.*]], i1 [[Y:%.*]], i1 false
370
+ ; CHECK-NEXT: [[NOT_:%.*]] = xor i1 [[TMP1]], true
371
+ ; CHECK-NEXT: ret i1 [[NOT_]]
372
+ ;
373
+ %s1 = select i1 %x , i8 12 , i8 0
374
+ %s2 = select i1 %y , i8 12 , i8 0
375
+ %and = and i8 %s1 , %s2
376
+ %cmp = icmp eq i8 %and , 0
377
+ ret i1 %cmp
378
+ }
379
+
380
+ define i1 @select_constants_and_icmp_eq_tval (i1 %x , i1 %y ) {
381
+ ; CHECK-LABEL: @select_constants_and_icmp_eq_tval(
382
+ ; CHECK-NEXT: [[S1:%.*]] = select i1 [[X:%.*]], i8 6, i8 1
383
+ ; CHECK-NEXT: [[S2:%.*]] = select i1 [[Y:%.*]], i8 6, i8 1
384
+ ; CHECK-NEXT: [[AND:%.*]] = and i8 [[S1]], [[S2]]
385
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[AND]], 6
386
+ ; CHECK-NEXT: ret i1 [[CMP]]
387
+ ;
388
+ %s1 = select i1 %x , i8 6 , i8 1
389
+ %s2 = select i1 %y , i8 6 , i8 1
390
+ %and = and i8 %s1 , %s2
391
+ %cmp = icmp eq i8 %and , 6
392
+ ret i1 %cmp
393
+ }
394
+
395
+ define i1 @select_constants_and_icmp_eq_fval (i1 %x , i1 %y ) {
396
+ ; CHECK-LABEL: @select_constants_and_icmp_eq_fval(
397
+ ; CHECK-NEXT: [[S1:%.*]] = select i1 [[X:%.*]], i8 12, i8 3
398
+ ; CHECK-NEXT: [[S2:%.*]] = select i1 [[Y:%.*]], i8 12, i8 3
399
+ ; CHECK-NEXT: [[AND:%.*]] = and i8 [[S1]], [[S2]]
400
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[AND]], 3
401
+ ; CHECK-NEXT: ret i1 [[CMP]]
402
+ ;
403
+ %s1 = select i1 %x , i8 12 , i8 3
404
+ %s2 = select i1 %y , i8 12 , i8 3
405
+ %and = and i8 %s1 , %s2
406
+ %cmp = icmp eq i8 %and , 3
407
+ ret i1 %cmp
408
+ }
0 commit comments