Skip to content

Commit 8b16eec

Browse files
committed
Revert "[InstCombine] Canonicalize and(zext(A), B) into select A, B & 1, 0 (llvm#66740)"
This reverts commit a7f962c.
1 parent 40529f8 commit 8b16eec

File tree

6 files changed

+46
-45
lines changed

6 files changed

+46
-45
lines changed

llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2749,12 +2749,6 @@ Instruction *InstCombinerImpl::visitAnd(BinaryOperator &I) {
27492749
A->getType()->isIntOrIntVectorTy(1))
27502750
return SelectInst::Create(A, Constant::getNullValue(Ty), B);
27512751

2752-
// and(zext(A), B) -> A ? (B & 1) : 0
2753-
if (match(&I, m_c_And(m_OneUse(m_ZExt(m_Value(A))), m_Value(B))) &&
2754-
A->getType()->isIntOrIntVectorTy(1))
2755-
return SelectInst::Create(A, Builder.CreateAnd(B, ConstantInt::get(Ty, 1)),
2756-
Constant::getNullValue(Ty));
2757-
27582752
// (-1 + A) & B --> A ? 0 : B where A is 0/1.
27592753
if (match(&I, m_c_And(m_OneUse(m_Add(m_ZExtOrSelf(m_Value(A)), m_AllOnes())),
27602754
m_Value(B)))) {

llvm/test/Transforms/InstCombine/and-or-icmps.ll

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2780,9 +2780,9 @@ define i64 @icmp_slt_0_and_icmp_sgt_neg1_i64(i64 %x) {
27802780
define i64 @icmp_slt_0_and_icmp_sge_neg1_i64_fail(i64 %x) {
27812781
; CHECK-LABEL: @icmp_slt_0_and_icmp_sge_neg1_i64_fail(
27822782
; CHECK-NEXT: [[A:%.*]] = icmp sgt i64 [[X:%.*]], -2
2783+
; CHECK-NEXT: [[B:%.*]] = zext i1 [[A]] to i64
27832784
; CHECK-NEXT: [[C:%.*]] = lshr i64 [[X]], 62
2784-
; CHECK-NEXT: [[TMP1:%.*]] = and i64 [[C]], 1
2785-
; CHECK-NEXT: [[D:%.*]] = select i1 [[A]], i64 [[TMP1]], i64 0
2785+
; CHECK-NEXT: [[D:%.*]] = and i64 [[C]], [[B]]
27862786
; CHECK-NEXT: ret i64 [[D]]
27872787
;
27882788
%A = icmp sge i64 %x, -1
@@ -2882,8 +2882,9 @@ define i32 @icmp_slt_0_and_icmp_sge_neg2_i32_multiuse1(i32 %x) {
28822882
define i32 @icmp_slt_0_and_icmp_sge_neg2_i32_multiuse2(i32 %x) {
28832883
; CHECK-LABEL: @icmp_slt_0_and_icmp_sge_neg2_i32_multiuse2(
28842884
; CHECK-NEXT: [[A:%.*]] = icmp sgt i32 [[X:%.*]], -3
2885+
; CHECK-NEXT: [[B:%.*]] = zext i1 [[A]] to i32
28852886
; CHECK-NEXT: [[C:%.*]] = lshr i32 [[X]], 31
2886-
; CHECK-NEXT: [[D:%.*]] = select i1 [[A]], i32 [[C]], i32 0
2887+
; CHECK-NEXT: [[D:%.*]] = and i32 [[C]], [[B]]
28872888
; CHECK-NEXT: call void @use32(i32 [[C]])
28882889
; CHECK-NEXT: ret i32 [[D]]
28892890
;
@@ -2933,9 +2934,10 @@ define i32 @icmp_slt_0_or_icmp_eq_100_i32_multiuse_fail1(i32 %x) {
29332934

29342935
define i32 @icmp_x_slt_0_and_icmp_y_ne_neg2_i32_multiuse_fail2(i32 %x, i32 %y) {
29352936
; CHECK-LABEL: @icmp_x_slt_0_and_icmp_y_ne_neg2_i32_multiuse_fail2(
2936-
; CHECK-NEXT: [[A_NOT:%.*]] = icmp eq i32 [[X:%.*]], -2
2937+
; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], -2
2938+
; CHECK-NEXT: [[B:%.*]] = zext i1 [[A]] to i32
29372939
; CHECK-NEXT: [[C:%.*]] = lshr i32 [[Y:%.*]], 31
2938-
; CHECK-NEXT: [[D:%.*]] = select i1 [[A_NOT]], i32 0, i32 [[C]]
2940+
; CHECK-NEXT: [[D:%.*]] = and i32 [[C]], [[B]]
29392941
; CHECK-NEXT: call void @use32(i32 [[C]])
29402942
; CHECK-NEXT: ret i32 [[D]]
29412943
;

llvm/test/Transforms/InstCombine/and.ll

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2529,8 +2529,8 @@ define i64 @test_and_or_constexpr_infloop() {
25292529

25302530
define i32 @and_zext(i32 %a, i1 %b) {
25312531
; CHECK-LABEL: @and_zext(
2532-
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[A:%.*]], 1
2533-
; CHECK-NEXT: [[R:%.*]] = select i1 [[B:%.*]], i32 [[TMP1]], i32 0
2532+
; CHECK-NEXT: [[MASK:%.*]] = zext i1 [[B:%.*]] to i32
2533+
; CHECK-NEXT: [[R:%.*]] = and i32 [[MASK]], [[A:%.*]]
25342534
; CHECK-NEXT: ret i32 [[R]]
25352535
;
25362536
%mask = zext i1 %b to i32
@@ -2540,8 +2540,8 @@ define i32 @and_zext(i32 %a, i1 %b) {
25402540

25412541
define i32 @and_zext_commuted(i32 %a, i1 %b) {
25422542
; CHECK-LABEL: @and_zext_commuted(
2543-
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[A:%.*]], 1
2544-
; CHECK-NEXT: [[R:%.*]] = select i1 [[B:%.*]], i32 [[TMP1]], i32 0
2543+
; CHECK-NEXT: [[MASK:%.*]] = zext i1 [[B:%.*]] to i32
2544+
; CHECK-NEXT: [[R:%.*]] = and i32 [[MASK]], [[A:%.*]]
25452545
; CHECK-NEXT: ret i32 [[R]]
25462546
;
25472547
%mask = zext i1 %b to i32
@@ -2564,8 +2564,8 @@ define i32 @and_zext_multiuse(i32 %a, i1 %b) {
25642564

25652565
define <2 x i32> @and_zext_vec(<2 x i32> %a, <2 x i1> %b) {
25662566
; CHECK-LABEL: @and_zext_vec(
2567-
; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i32> [[A:%.*]], <i32 1, i32 1>
2568-
; CHECK-NEXT: [[R:%.*]] = select <2 x i1> [[B:%.*]], <2 x i32> [[TMP1]], <2 x i32> zeroinitializer
2567+
; CHECK-NEXT: [[MASK:%.*]] = zext <2 x i1> [[B:%.*]] to <2 x i32>
2568+
; CHECK-NEXT: [[R:%.*]] = and <2 x i32> [[MASK]], [[A:%.*]]
25692569
; CHECK-NEXT: ret <2 x i32> [[R]]
25702570
;
25712571
%mask = zext <2 x i1> %b to <2 x i32>
@@ -2576,7 +2576,10 @@ define <2 x i32> @and_zext_vec(<2 x i32> %a, <2 x i1> %b) {
25762576
; tests from PR66606
25772577
define i32 @and_zext_eq_even(i32 %a) {
25782578
; CHECK-LABEL: @and_zext_eq_even(
2579-
; CHECK-NEXT: ret i32 0
2579+
; CHECK-NEXT: [[COND:%.*]] = icmp eq i32 [[A:%.*]], 2
2580+
; CHECK-NEXT: [[NOT:%.*]] = zext i1 [[COND]] to i32
2581+
; CHECK-NEXT: [[R:%.*]] = and i32 [[NOT]], [[A]]
2582+
; CHECK-NEXT: ret i32 [[R]]
25802583
;
25812584
%cond = icmp eq i32 %a, 2
25822585
%not = zext i1 %cond to i32
@@ -2586,7 +2589,10 @@ define i32 @and_zext_eq_even(i32 %a) {
25862589

25872590
define i32 @and_zext_eq_even_commuted(i32 %a) {
25882591
; CHECK-LABEL: @and_zext_eq_even_commuted(
2589-
; CHECK-NEXT: ret i32 0
2592+
; CHECK-NEXT: [[COND:%.*]] = icmp eq i32 [[A:%.*]], 2
2593+
; CHECK-NEXT: [[NOT:%.*]] = zext i1 [[COND]] to i32
2594+
; CHECK-NEXT: [[R:%.*]] = and i32 [[NOT]], [[A]]
2595+
; CHECK-NEXT: ret i32 [[R]]
25902596
;
25912597
%cond = icmp eq i32 %a, 2
25922598
%not = zext i1 %cond to i32
@@ -2597,7 +2603,8 @@ define i32 @and_zext_eq_even_commuted(i32 %a) {
25972603
define i32 @and_zext_eq_odd(i32 %a) {
25982604
; CHECK-LABEL: @and_zext_eq_odd(
25992605
; CHECK-NEXT: [[COND:%.*]] = icmp eq i32 [[A:%.*]], 3
2600-
; CHECK-NEXT: [[R:%.*]] = zext i1 [[COND]] to i32
2606+
; CHECK-NEXT: [[NOT:%.*]] = zext i1 [[COND]] to i32
2607+
; CHECK-NEXT: [[R:%.*]] = and i32 [[NOT]], [[A]]
26012608
; CHECK-NEXT: ret i32 [[R]]
26022609
;
26032610
%cond = icmp eq i32 %a, 3
@@ -2609,7 +2616,8 @@ define i32 @and_zext_eq_odd(i32 %a) {
26092616
define i32 @and_zext_eq_odd_commuted(i32 %a) {
26102617
; CHECK-LABEL: @and_zext_eq_odd_commuted(
26112618
; CHECK-NEXT: [[COND:%.*]] = icmp eq i32 [[A:%.*]], 3
2612-
; CHECK-NEXT: [[R:%.*]] = zext i1 [[COND]] to i32
2619+
; CHECK-NEXT: [[NOT:%.*]] = zext i1 [[COND]] to i32
2620+
; CHECK-NEXT: [[R:%.*]] = and i32 [[NOT]], [[A]]
26132621
; CHECK-NEXT: ret i32 [[R]]
26142622
;
26152623
%cond = icmp eq i32 %a, 3
@@ -2623,7 +2631,10 @@ define i32 @and_zext_eq_zero(i32 %A, i32 %C) {
26232631
; CHECK-LABEL: @and_zext_eq_zero(
26242632
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[A:%.*]], 0
26252633
; CHECK-NEXT: [[TMP2:%.*]] = zext i1 [[TMP1]] to i32
2626-
; CHECK-NEXT: ret i32 [[TMP2]]
2634+
; CHECK-NEXT: [[TMP3:%.*]] = lshr i32 [[A]], [[C:%.*]]
2635+
; CHECK-NEXT: [[TMP4:%.*]] = xor i32 [[TMP3]], -1
2636+
; CHECK-NEXT: [[TMP5:%.*]] = and i32 [[TMP2]], [[TMP4]]
2637+
; CHECK-NEXT: ret i32 [[TMP5]]
26272638
;
26282639
%1 = icmp eq i32 %A, 0
26292640
%2 = zext i1 %1 to i32

llvm/test/Transforms/InstCombine/icmp.ll

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4585,9 +4585,9 @@ define i1 @redundant_sign_bit_count_ugt_31_30(i32 %x) {
45854585
define i1 @zext_bool_and_eq0(i1 %x, i8 %y) {
45864586
; CHECK-LABEL: @zext_bool_and_eq0(
45874587
; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[Y:%.*]], 1
4588-
; CHECK-NEXT: [[R1:%.*]] = icmp eq i8 [[TMP1]], 0
4589-
; CHECK-NEXT: [[NOT_X:%.*]] = xor i1 [[X:%.*]], true
4590-
; CHECK-NEXT: [[R:%.*]] = select i1 [[NOT_X]], i1 true, i1 [[R1]]
4588+
; CHECK-NEXT: [[TMP2:%.*]] = icmp ne i8 [[TMP1]], 0
4589+
; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP2]], [[X:%.*]]
4590+
; CHECK-NEXT: [[R:%.*]] = xor i1 [[TMP3]], true
45914591
; CHECK-NEXT: ret i1 [[R]]
45924592
;
45934593
%zx = zext i1 %x to i8
@@ -4598,10 +4598,9 @@ define i1 @zext_bool_and_eq0(i1 %x, i8 %y) {
45984598

45994599
define <2 x i1> @zext_bool_and_eq0_commute(<2 x i1> %x, <2 x i8> %p) {
46004600
; CHECK-LABEL: @zext_bool_and_eq0_commute(
4601-
; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i8> [[P:%.*]], <i8 1, i8 1>
4602-
; CHECK-NEXT: [[R1:%.*]] = icmp eq <2 x i8> [[TMP1]], zeroinitializer
4603-
; CHECK-NEXT: [[NOT_X:%.*]] = xor <2 x i1> [[X:%.*]], <i1 true, i1 true>
4604-
; CHECK-NEXT: [[R:%.*]] = select <2 x i1> [[NOT_X]], <2 x i1> <i1 true, i1 true>, <2 x i1> [[R1]]
4601+
; CHECK-NEXT: [[TMP1:%.*]] = trunc <2 x i8> [[P:%.*]] to <2 x i1>
4602+
; CHECK-NEXT: [[TMP2:%.*]] = and <2 x i1> [[TMP1]], [[X:%.*]]
4603+
; CHECK-NEXT: [[R:%.*]] = xor <2 x i1> [[TMP2]], <i1 true, i1 true>
46054604
; CHECK-NEXT: ret <2 x i1> [[R]]
46064605
;
46074606
%y = mul <2 x i8> %p, %p ; thwart complexity-based canonicalization
@@ -4614,8 +4613,8 @@ define <2 x i1> @zext_bool_and_eq0_commute(<2 x i1> %x, <2 x i8> %p) {
46144613
define i1 @zext_bool_and_ne0(i1 %x, i8 %y) {
46154614
; CHECK-LABEL: @zext_bool_and_ne0(
46164615
; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[Y:%.*]], 1
4617-
; CHECK-NEXT: [[R1:%.*]] = icmp ne i8 [[TMP1]], 0
4618-
; CHECK-NEXT: [[R:%.*]] = select i1 [[X:%.*]], i1 [[R1]], i1 false
4616+
; CHECK-NEXT: [[TMP2:%.*]] = icmp ne i8 [[TMP1]], 0
4617+
; CHECK-NEXT: [[R:%.*]] = and i1 [[TMP2]], [[X:%.*]]
46194618
; CHECK-NEXT: ret i1 [[R]]
46204619
;
46214620
%zx = zext i1 %x to i8
@@ -4627,9 +4626,9 @@ define i1 @zext_bool_and_ne0(i1 %x, i8 %y) {
46274626
define i1 @zext_bool_and_ne1(i1 %x, i8 %y) {
46284627
; CHECK-LABEL: @zext_bool_and_ne1(
46294628
; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[Y:%.*]], 1
4630-
; CHECK-NEXT: [[R1:%.*]] = icmp eq i8 [[TMP1]], 0
4631-
; CHECK-NEXT: [[NOT_X:%.*]] = xor i1 [[X:%.*]], true
4632-
; CHECK-NEXT: [[R:%.*]] = select i1 [[NOT_X]], i1 true, i1 [[R1]]
4629+
; CHECK-NEXT: [[TMP2:%.*]] = icmp ne i8 [[TMP1]], 0
4630+
; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP2]], [[X:%.*]]
4631+
; CHECK-NEXT: [[R:%.*]] = xor i1 [[TMP3]], true
46334632
; CHECK-NEXT: ret i1 [[R]]
46344633
;
46354634
%zx = zext i1 %x to i8
@@ -4640,8 +4639,8 @@ define i1 @zext_bool_and_ne1(i1 %x, i8 %y) {
46404639

46414640
define <2 x i1> @zext_bool_and_eq1(<2 x i1> %x, <2 x i8> %y) {
46424641
; CHECK-LABEL: @zext_bool_and_eq1(
4643-
; CHECK-NEXT: [[R1:%.*]] = trunc <2 x i8> [[Y:%.*]] to <2 x i1>
4644-
; CHECK-NEXT: [[R:%.*]] = select <2 x i1> [[X:%.*]], <2 x i1> [[R1]], <2 x i1> zeroinitializer
4642+
; CHECK-NEXT: [[TMP1:%.*]] = trunc <2 x i8> [[Y:%.*]] to <2 x i1>
4643+
; CHECK-NEXT: [[R:%.*]] = and <2 x i1> [[TMP1]], [[X:%.*]]
46454644
; CHECK-NEXT: ret <2 x i1> [[R]]
46464645
;
46474646
%zx = zext <2 x i1> %x to <2 x i8>
@@ -4686,8 +4685,8 @@ define i1 @zext_bool_and_eq0_use(i1 %x, i64 %y) {
46864685

46874686
define i1 @zext_bool_and_ne0_use(i1 %x, i64 %y) {
46884687
; CHECK-LABEL: @zext_bool_and_ne0_use(
4689-
; CHECK-NEXT: [[TMP1:%.*]] = and i64 [[Y:%.*]], 1
4690-
; CHECK-NEXT: [[A:%.*]] = select i1 [[X:%.*]], i64 [[TMP1]], i64 0
4688+
; CHECK-NEXT: [[ZX:%.*]] = zext i1 [[X:%.*]] to i64
4689+
; CHECK-NEXT: [[A:%.*]] = and i64 [[ZX]], [[Y:%.*]]
46914690
; CHECK-NEXT: call void @use_i64(i64 [[A]])
46924691
; CHECK-NEXT: [[R:%.*]] = icmp ne i64 [[A]], 0
46934692
; CHECK-NEXT: ret i1 [[R]]

llvm/test/Transforms/InstCombine/narrow.ll

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,8 @@ define i1 @searchArray2(i32 %hay, ptr %haystack) {
155155
; CHECK-NEXT: [[IDX:%.*]] = getelementptr i32, ptr [[HAYSTACK:%.*]], i64 [[INDVAR]]
156156
; CHECK-NEXT: [[LD:%.*]] = load i32, ptr [[IDX]], align 4
157157
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[LD]], [[HAY:%.*]]
158-
; CHECK-NEXT: [[AND]] = select i1 [[CMP1]], i8 [[FOUND]], i8 0
158+
; CHECK-NEXT: [[ZEXT:%.*]] = zext i1 [[CMP1]] to i8
159+
; CHECK-NEXT: [[AND]] = and i8 [[FOUND]], [[ZEXT]]
159160
; CHECK-NEXT: [[INDVAR_NEXT]] = add i64 [[INDVAR]], 1
160161
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i64 [[INDVAR_NEXT]], 1000
161162
; CHECK-NEXT: br i1 [[EXITCOND]], label [[EXIT:%.*]], label [[LOOP]]

llvm/test/Transforms/InstCombine/zext-or-icmp.ll

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -185,12 +185,6 @@ define i8 @PR49475_infloop(i32 %t0, i16 %insert, i64 %e, i8 %i162) {
185185
; CHECK-NEXT: [[TOBOOL23_NOT:%.*]] = xor i1 [[CMP]], true
186186
; CHECK-NEXT: call void @llvm.assume(i1 [[TOBOOL23_NOT]])
187187
; CHECK-NEXT: ret i8 [[INC]]
188-
;
189-
%b = icmp eq i32 %t0, 0
190-
%b2 = icmp eq i16 %insert, 0
191-
%t1 = or i1 %b, %b2
192-
%ext = zext i1 %t1 to i32
193-
%and = and i32 %t0, %ext
194188
%conv13 = zext i32 %and to i64
195189
%xor = xor i64 %conv13, 140
196190
%conv16 = sext i8 %i162 to i64

0 commit comments

Comments
 (0)