Skip to content

Commit e2de1ad

Browse files
committed
Revert "[InstCombine] Remove the canonicalization of trunc to i1 (llvm#84628)"
This reverts commit 56b3222.
1 parent c8481f2 commit e2de1ad

File tree

13 files changed

+228
-160
lines changed

13 files changed

+228
-160
lines changed

llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -736,18 +736,19 @@ Instruction *InstCombinerImpl::visitTrunc(TruncInst &Trunc) {
736736

737737
if (DestWidth == 1) {
738738
Value *Zero = Constant::getNullValue(SrcTy);
739-
740-
Value *X;
741-
const APInt *C1;
742-
Constant *C2;
743-
if (match(Src, m_OneUse(m_Shr(m_Shl(m_Power2(C1), m_Value(X)),
744-
m_ImmConstant(C2))))) {
745-
// trunc ((C1 << X) >> C2) to i1 --> X == (C2-cttz(C1)), where C1 is pow2
746-
Constant *Log2C1 = ConstantInt::get(SrcTy, C1->exactLogBase2());
747-
Constant *CmpC = ConstantExpr::getSub(C2, Log2C1);
748-
return new ICmpInst(ICmpInst::ICMP_EQ, X, CmpC);
739+
if (DestTy->isIntegerTy()) {
740+
// Canonicalize trunc x to i1 -> icmp ne (and x, 1), 0 (scalar only).
741+
// TODO: We canonicalize to more instructions here because we are probably
742+
// lacking equivalent analysis for trunc relative to icmp. There may also
743+
// be codegen concerns. If those trunc limitations were removed, we could
744+
// remove this transform.
745+
Value *And = Builder.CreateAnd(Src, ConstantInt::get(SrcTy, 1));
746+
return new ICmpInst(ICmpInst::ICMP_NE, And, Zero);
749747
}
750748

749+
// For vectors, we do not canonicalize all truncs to icmp, so optimize
750+
// patterns that would be covered within visitICmpInst.
751+
Value *X;
751752
Constant *C;
752753
if (match(Src, m_OneUse(m_LShr(m_Value(X), m_ImmConstant(C))))) {
753754
// trunc (lshr X, C) to i1 --> icmp ne (and X, C'), 0

llvm/test/Transforms/InstCombine/X86/x86-avx512-inseltpoison.ll

Lines changed: 84 additions & 56 deletions
Large diffs are not rendered by default.

llvm/test/Transforms/InstCombine/X86/x86-avx512.ll

Lines changed: 84 additions & 56 deletions
Large diffs are not rendered by default.

llvm/test/Transforms/InstCombine/apint-shl-trunc.ll

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33

44
define i1 @test0(i39 %X, i39 %A) {
55
; CHECK-LABEL: @test0(
6-
; CHECK-NEXT: [[B:%.*]] = lshr i39 [[X:%.*]], [[A:%.*]]
7-
; CHECK-NEXT: [[D:%.*]] = trunc i39 [[B]] to i1
6+
; CHECK-NEXT: [[TMP1:%.*]] = shl nuw i39 1, [[A:%.*]]
7+
; CHECK-NEXT: [[TMP2:%.*]] = and i39 [[TMP1]], [[X:%.*]]
8+
; CHECK-NEXT: [[D:%.*]] = icmp ne i39 [[TMP2]], 0
89
; CHECK-NEXT: ret i1 [[D]]
910
;
1011
%B = lshr i39 %X, %A
@@ -14,8 +15,9 @@ define i1 @test0(i39 %X, i39 %A) {
1415

1516
define i1 @test1(i799 %X, i799 %A) {
1617
; CHECK-LABEL: @test1(
17-
; CHECK-NEXT: [[B:%.*]] = lshr i799 [[X:%.*]], [[A:%.*]]
18-
; CHECK-NEXT: [[D:%.*]] = trunc i799 [[B]] to i1
18+
; CHECK-NEXT: [[TMP1:%.*]] = shl nuw i799 1, [[A:%.*]]
19+
; CHECK-NEXT: [[TMP2:%.*]] = and i799 [[TMP1]], [[X:%.*]]
20+
; CHECK-NEXT: [[D:%.*]] = icmp ne i799 [[TMP2]], 0
1921
; CHECK-NEXT: ret i1 [[D]]
2022
;
2123
%B = lshr i799 %X, %A

llvm/test/Transforms/InstCombine/cast.ll

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1397,7 +1397,8 @@ define float @sitofp_zext(i16 %a) {
13971397
define i1 @PR23309(i32 %A, i32 %B) {
13981398
; ALL-LABEL: @PR23309(
13991399
; ALL-NEXT: [[SUB:%.*]] = sub i32 [[A:%.*]], [[B:%.*]]
1400-
; ALL-NEXT: [[TRUNC:%.*]] = trunc i32 [[SUB]] to i1
1400+
; ALL-NEXT: [[TMP1:%.*]] = and i32 [[SUB]], 1
1401+
; ALL-NEXT: [[TRUNC:%.*]] = icmp ne i32 [[TMP1]], 0
14011402
; ALL-NEXT: ret i1 [[TRUNC]]
14021403
;
14031404
%add = add i32 %A, -4
@@ -1409,7 +1410,8 @@ define i1 @PR23309(i32 %A, i32 %B) {
14091410
define i1 @PR23309v2(i32 %A, i32 %B) {
14101411
; ALL-LABEL: @PR23309v2(
14111412
; ALL-NEXT: [[SUB:%.*]] = add i32 [[A:%.*]], [[B:%.*]]
1412-
; ALL-NEXT: [[TRUNC:%.*]] = trunc i32 [[SUB]] to i1
1413+
; ALL-NEXT: [[TMP1:%.*]] = and i32 [[SUB]], 1
1414+
; ALL-NEXT: [[TRUNC:%.*]] = icmp ne i32 [[TMP1]], 0
14131415
; ALL-NEXT: ret i1 [[TRUNC]]
14141416
;
14151417
%add = add i32 %A, -4

llvm/test/Transforms/InstCombine/catchswitch-phi.ll

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@ define void @test0(i1 %c1) personality ptr @__gxx_wasm_personality_v0 {
2424
; CHECK: bb1:
2525
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[TMP0]], i32 4
2626
; CHECK-NEXT: invoke void @foo()
27-
; CHECK-NEXT: to label [[BB3:%.*]] unwind label [[BB4:%.*]]
27+
; CHECK-NEXT: to label [[BB3:%.*]] unwind label [[BB4:%.*]]
2828
; CHECK: bb2:
2929
; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i8, ptr [[TMP0]], i32 4
3030
; CHECK-NEXT: invoke void @foo()
31-
; CHECK-NEXT: to label [[BB3]] unwind label [[BB4]]
31+
; CHECK-NEXT: to label [[BB3]] unwind label [[BB4]]
3232
; CHECK: bb3:
3333
; CHECK-NEXT: unreachable
3434
; CHECK: bb4:
@@ -37,7 +37,7 @@ define void @test0(i1 %c1) personality ptr @__gxx_wasm_personality_v0 {
3737
; CHECK: bb5:
3838
; CHECK-NEXT: [[TMP5:%.*]] = catchpad within [[TMP4]] [ptr null]
3939
; CHECK-NEXT: invoke void @foo() [ "funclet"(token [[TMP5]]) ]
40-
; CHECK-NEXT: to label [[BB6:%.*]] unwind label [[BB7]]
40+
; CHECK-NEXT: to label [[BB6:%.*]] unwind label [[BB7]]
4141
; CHECK: bb6:
4242
; CHECK-NEXT: unreachable
4343
; CHECK: bb7:
@@ -89,10 +89,10 @@ define void @test1() personality ptr @__gxx_wasm_personality_v0 {
8989
; CHECK-LABEL: @test1(
9090
; CHECK-NEXT: entry:
9191
; CHECK-NEXT: invoke void @foo()
92-
; CHECK-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[CATCH_DISPATCH1:%.*]]
92+
; CHECK-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[CATCH_DISPATCH1:%.*]]
9393
; CHECK: invoke.cont:
9494
; CHECK-NEXT: [[CALL:%.*]] = invoke i32 @baz()
95-
; CHECK-NEXT: to label [[INVOKE_CONT1:%.*]] unwind label [[CATCH_DISPATCH:%.*]]
95+
; CHECK-NEXT: to label [[INVOKE_CONT1:%.*]] unwind label [[CATCH_DISPATCH:%.*]]
9696
; CHECK: invoke.cont1:
9797
; CHECK-NEXT: [[TOBOOL_NOT:%.*]] = icmp eq i32 [[CALL]], 0
9898
; CHECK-NEXT: br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
@@ -101,7 +101,7 @@ define void @test1() personality ptr @__gxx_wasm_personality_v0 {
101101
; CHECK: if.end:
102102
; CHECK-NEXT: [[AP_0:%.*]] = phi i8 [ 1, [[IF_THEN]] ], [ 0, [[INVOKE_CONT1]] ]
103103
; CHECK-NEXT: invoke void @foo()
104-
; CHECK-NEXT: to label [[INVOKE_CONT2:%.*]] unwind label [[CATCH_DISPATCH]]
104+
; CHECK-NEXT: to label [[INVOKE_CONT2:%.*]] unwind label [[CATCH_DISPATCH]]
105105
; CHECK: invoke.cont2:
106106
; CHECK-NEXT: br label [[TRY_CONT:%.*]]
107107
; CHECK: catch.dispatch:
@@ -114,16 +114,17 @@ define void @test1() personality ptr @__gxx_wasm_personality_v0 {
114114
; CHECK-NEXT: catchret from [[TMP1]] to label [[TRY_CONT]]
115115
; CHECK: rethrow:
116116
; CHECK-NEXT: invoke void @llvm.wasm.rethrow() #[[ATTR0:[0-9]+]] [ "funclet"(token [[TMP1]]) ]
117-
; CHECK-NEXT: to label [[UNREACHABLE:%.*]] unwind label [[CATCH_DISPATCH1]]
117+
; CHECK-NEXT: to label [[UNREACHABLE:%.*]] unwind label [[CATCH_DISPATCH1]]
118118
; CHECK: catch.dispatch1:
119119
; CHECK-NEXT: [[AP_2:%.*]] = phi i8 [ [[AP_1]], [[CATCH_DISPATCH]] ], [ [[AP_1]], [[RETHROW]] ], [ 0, [[ENTRY:%.*]] ]
120120
; CHECK-NEXT: [[TMP2:%.*]] = catchswitch within none [label %catch.start1] unwind to caller
121121
; CHECK: catch.start1:
122122
; CHECK-NEXT: [[TMP3:%.*]] = catchpad within [[TMP2]] [ptr null]
123-
; CHECK-NEXT: [[TOBOOL1_NOT:%.*]] = trunc i8 [[AP_2]] to i1
123+
; CHECK-NEXT: [[TMP0:%.*]] = and i8 [[AP_2]], 1
124+
; CHECK-NEXT: [[TOBOOL1_NOT:%.*]] = icmp eq i8 [[TMP0]], 0
124125
; CHECK-NEXT: br i1 [[TOBOOL1_NOT]], label [[IF_END1:%.*]], label [[IF_THEN1:%.*]]
125126
; CHECK: if.then1:
126-
; CHECK-NEXT: br label [[IF_THEN1]]
127+
; CHECK-NEXT: br label [[IF_END1]]
127128
; CHECK: if.end1:
128129
; CHECK-NEXT: catchret from [[TMP3]] to label [[TRY_CONT]]
129130
; CHECK: try.cont:

llvm/test/Transforms/InstCombine/icmp-mul-and.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -267,10 +267,10 @@ define i1 @pr51551_neg1(i32 %x, i32 %y) {
267267

268268
define i1 @pr51551_neg2(i32 %x, i32 %y) {
269269
; CHECK-LABEL: @pr51551_neg2(
270-
; CHECK-NEXT: [[TMP1:%.*]] = trunc i32 [[Y:%.*]] to i1
270+
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[Y:%.*]], 1
271+
; CHECK-NEXT: [[DOTNOT:%.*]] = icmp eq i32 [[TMP1]], 0
271272
; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[X:%.*]], 7
272273
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[TMP2]], 0
273-
; CHECK-NEXT: [[DOTNOT:%.*]] = xor i1 [[TMP1]], true
274274
; CHECK-NEXT: [[CMP:%.*]] = select i1 [[DOTNOT]], i1 true, i1 [[CMP1]]
275275
; CHECK-NEXT: ret i1 [[CMP]]
276276
;

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,12 +128,12 @@ define i1 @PR46561(i1 %a, i1 %x, i1 %y, i8 %z) {
128128
; CHECK-NEXT: br i1 [[A:%.*]], label [[COND_TRUE:%.*]], label [[END:%.*]]
129129
; CHECK: cond.true:
130130
; CHECK-NEXT: [[MULBOOL:%.*]] = and i1 [[X:%.*]], [[Y:%.*]]
131-
; CHECK-NEXT: [[TMP1:%.*]] = trunc i8 [[Z:%.*]] to i1
131+
; CHECK-NEXT: [[TMP0:%.*]] = and i8 [[Z:%.*]], 1
132+
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i8 [[TMP0]], 0
132133
; CHECK-NEXT: [[TMP2:%.*]] = xor i1 [[MULBOOL]], [[TMP1]]
133-
; CHECK-NEXT: [[TMP3:%.*]] = xor i1 [[TMP2]], true
134134
; CHECK-NEXT: br label [[END]]
135135
; CHECK: end:
136-
; CHECK-NEXT: [[P:%.*]] = phi i1 [ [[TMP3]], [[COND_TRUE]] ], [ false, [[ENTRY:%.*]] ]
136+
; CHECK-NEXT: [[P:%.*]] = phi i1 [ [[TMP2]], [[COND_TRUE]] ], [ false, [[ENTRY:%.*]] ]
137137
; CHECK-NEXT: ret i1 [[P]]
138138
;
139139
entry:

llvm/test/Transforms/InstCombine/mul-masked-bits.ll

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -214,8 +214,9 @@ define i64 @scalar_mul_bit_x0_y0_uses(i64 %x, i64 %y) {
214214
define i64 @scalar_mul_bit_x0_y1(i64 %x, i64 %y) {
215215
; CHECK-LABEL: @scalar_mul_bit_x0_y1(
216216
; CHECK-NEXT: [[AND2:%.*]] = and i64 [[Y:%.*]], 2
217-
; CHECK-NEXT: [[TMP1:%.*]] = trunc i64 [[X:%.*]] to i1
218-
; CHECK-NEXT: [[MUL:%.*]] = select i1 [[TMP1]], i64 [[AND2]], i64 0
217+
; CHECK-NEXT: [[TMP1:%.*]] = and i64 [[X:%.*]], 1
218+
; CHECK-NEXT: [[DOTNOT:%.*]] = icmp eq i64 [[TMP1]], 0
219+
; CHECK-NEXT: [[MUL:%.*]] = select i1 [[DOTNOT]], i64 0, i64 [[AND2]]
219220
; CHECK-NEXT: ret i64 [[MUL]]
220221
;
221222
%and1 = and i64 %x, 1
@@ -227,8 +228,9 @@ define i64 @scalar_mul_bit_x0_y1(i64 %x, i64 %y) {
227228
define i64 @scalar_mul_bit_x0_yC(i64 %x, i64 %y, i64 %c) {
228229
; CHECK-LABEL: @scalar_mul_bit_x0_yC(
229230
; CHECK-NEXT: [[AND2:%.*]] = and i64 [[Y:%.*]], [[C:%.*]]
230-
; CHECK-NEXT: [[TMP1:%.*]] = trunc i64 [[X:%.*]] to i1
231-
; CHECK-NEXT: [[MUL:%.*]] = select i1 [[TMP1]], i64 [[AND2]], i64 0
231+
; CHECK-NEXT: [[TMP1:%.*]] = and i64 [[X:%.*]], 1
232+
; CHECK-NEXT: [[DOTNOT:%.*]] = icmp eq i64 [[TMP1]], 0
233+
; CHECK-NEXT: [[MUL:%.*]] = select i1 [[DOTNOT]], i64 0, i64 [[AND2]]
232234
; CHECK-NEXT: ret i64 [[MUL]]
233235
;
234236
%and1 = and i64 %x, 1

llvm/test/Transforms/InstCombine/mul.ll

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -684,8 +684,9 @@ define <2 x i32> @signbit_mul_vec_commute(<2 x i32> %a, <2 x i32> %b) {
684684

685685
define i32 @lowbit_mul(i32 %a, i32 %b) {
686686
; CHECK-LABEL: @lowbit_mul(
687-
; CHECK-NEXT: [[TMP1:%.*]] = trunc i32 [[A:%.*]] to i1
688-
; CHECK-NEXT: [[E:%.*]] = select i1 [[TMP1]], i32 [[B:%.*]], i32 0
687+
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[A:%.*]], 1
688+
; CHECK-NEXT: [[DOTNOT:%.*]] = icmp eq i32 [[TMP1]], 0
689+
; CHECK-NEXT: [[E:%.*]] = select i1 [[DOTNOT]], i32 0, i32 [[B:%.*]]
689690
; CHECK-NEXT: ret i32 [[E]]
690691
;
691692
%d = and i32 %a, 1

0 commit comments

Comments
 (0)