@@ -262,10 +262,7 @@ define i1 @umin_seq_comparison(i8 %x, i8 %y) {
262
262
263
263
define i1 @select_constants_and_icmp_eq0 (i1 %x , i1 %y ) {
264
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
265
+ ; CHECK-NEXT: [[CMP:%.*]] = xor i1 [[X:%.*]], [[Y:%.*]]
269
266
; CHECK-NEXT: ret i1 [[CMP]]
270
267
;
271
268
%s1 = select i1 %x , i8 2 , i8 1
@@ -275,6 +272,8 @@ define i1 @select_constants_and_icmp_eq0(i1 %x, i1 %y) {
275
272
ret i1 %cmp
276
273
}
277
274
275
+ ; extra uses on all intermediates are ok
276
+
278
277
define i1 @select_constants_and_icmp_eq0_uses (i1 %x , i1 %y ) {
279
278
; CHECK-LABEL: @select_constants_and_icmp_eq0_uses(
280
279
; CHECK-NEXT: [[S1:%.*]] = select i1 [[X:%.*]], i8 2, i8 1
@@ -283,7 +282,7 @@ define i1 @select_constants_and_icmp_eq0_uses(i1 %x, i1 %y) {
283
282
; CHECK-NEXT: call void @use(i8 [[S2]])
284
283
; CHECK-NEXT: [[AND:%.*]] = and i8 [[S1]], [[S2]]
285
284
; CHECK-NEXT: call void @use(i8 [[AND]])
286
- ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[AND ]], 0
285
+ ; CHECK-NEXT: [[CMP:%.*]] = xor i1 [[X ]], [[Y]]
287
286
; CHECK-NEXT: ret i1 [[CMP]]
288
287
;
289
288
%s1 = select i1 %x , i8 2 , i8 1
@@ -296,12 +295,11 @@ define i1 @select_constants_and_icmp_eq0_uses(i1 %x, i1 %y) {
296
295
ret i1 %cmp
297
296
}
298
297
298
+ ; vector splat constants are ok
299
+
299
300
define <2 x i1 > @select_constants_and_icmp_eq0_vec_splat (<2 x i1 > %x , <2 x i1 > %y ) {
300
301
; 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
302
+ ; CHECK-NEXT: [[CMP:%.*]] = xor <2 x i1> [[X:%.*]], [[Y:%.*]]
305
303
; CHECK-NEXT: ret <2 x i1> [[CMP]]
306
304
;
307
305
%s1 = select <2 x i1 > %x , <2 x i9 > <i9 3 , i9 3 >, <2 x i9 > <i9 48 , i9 48 >
@@ -311,6 +309,8 @@ define <2 x i1> @select_constants_and_icmp_eq0_vec_splat(<2 x i1> %x, <2 x i1> %
311
309
ret <2 x i1 > %cmp
312
310
}
313
311
312
+ ; common bit set - simplified via known bits
313
+
314
314
define i1 @select_constants_and_icmp_eq0_common_bit (i1 %x , i1 %y ) {
315
315
; CHECK-LABEL: @select_constants_and_icmp_eq0_common_bit(
316
316
; CHECK-NEXT: ret i1 false
@@ -322,6 +322,8 @@ define i1 @select_constants_and_icmp_eq0_common_bit(i1 %x, i1 %y) {
322
322
ret i1 %cmp
323
323
}
324
324
325
+ ; negative test - need matching constants
326
+
325
327
define i1 @select_constants_and_icmp_eq0_no_common_op1 (i1 %x , i1 %y ) {
326
328
; CHECK-LABEL: @select_constants_and_icmp_eq0_no_common_op1(
327
329
; CHECK-NEXT: [[S1:%.*]] = select i1 [[X:%.*]], i8 16, i8 3
@@ -337,6 +339,8 @@ define i1 @select_constants_and_icmp_eq0_no_common_op1(i1 %x, i1 %y) {
337
339
ret i1 %cmp
338
340
}
339
341
342
+ ; negative test - need matching constants
343
+
340
344
define i1 @select_constants_and_icmp_eq0_no_common_op2 (i1 %x , i1 %y ) {
341
345
; CHECK-LABEL: @select_constants_and_icmp_eq0_no_common_op2(
342
346
; CHECK-NEXT: [[S1:%.*]] = select i1 [[X:%.*]], i8 16, i8 3
@@ -352,6 +356,8 @@ define i1 @select_constants_and_icmp_eq0_no_common_op2(i1 %x, i1 %y) {
352
356
ret i1 %cmp
353
357
}
354
358
359
+ ; reduces via FoldOpInstSelect, but this could be a simple 'or'
360
+
355
361
define i1 @select_constants_and_icmp_eq0_zero_tval (i1 %x , i1 %y ) {
356
362
; CHECK-LABEL: @select_constants_and_icmp_eq0_zero_tval(
357
363
; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[X:%.*]], i1 true, i1 [[Y:%.*]]
@@ -364,6 +370,8 @@ define i1 @select_constants_and_icmp_eq0_zero_tval(i1 %x, i1 %y) {
364
370
ret i1 %cmp
365
371
}
366
372
373
+ ; reduces via FoldOpInstSelect, but this could be a simple 'not-of-and'
374
+
367
375
define i1 @select_constants_and_icmp_eq0_zero_fval (i1 %x , i1 %y ) {
368
376
; CHECK-LABEL: @select_constants_and_icmp_eq0_zero_fval(
369
377
; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[X:%.*]], i1 [[Y:%.*]], i1 false
@@ -377,6 +385,8 @@ define i1 @select_constants_and_icmp_eq0_zero_fval(i1 %x, i1 %y) {
377
385
ret i1 %cmp
378
386
}
379
387
388
+ ; TODO: x & y
389
+
380
390
define i1 @select_constants_and_icmp_eq_tval (i1 %x , i1 %y ) {
381
391
; CHECK-LABEL: @select_constants_and_icmp_eq_tval(
382
392
; CHECK-NEXT: [[S1:%.*]] = select i1 [[X:%.*]], i8 6, i8 1
@@ -392,6 +402,8 @@ define i1 @select_constants_and_icmp_eq_tval(i1 %x, i1 %y) {
392
402
ret i1 %cmp
393
403
}
394
404
405
+ ; TODO: ~(x | y)
406
+
395
407
define i1 @select_constants_and_icmp_eq_fval (i1 %x , i1 %y ) {
396
408
; CHECK-LABEL: @select_constants_and_icmp_eq_fval(
397
409
; CHECK-NEXT: [[S1:%.*]] = select i1 [[X:%.*]], i8 12, i8 3
0 commit comments