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

llvm/test/Transforms/InstCombine/phi.ll

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -137,8 +137,8 @@ define i32 @test6(i16 %A, i1 %b) {
137137
; CHECK: BB1:
138138
; CHECK-NEXT: br label [[BB2]]
139139
; CHECK: BB2:
140-
; CHECK-NEXT: [[C:%.*]] = zext i16 [[A:%.*]] to i32
141-
; CHECK-NEXT: ret i32 [[C]]
140+
; CHECK-NEXT: [[B:%.*]] = zext i16 [[A:%.*]] to i32
141+
; CHECK-NEXT: ret i32 [[B]]
142142
;
143143
BB0:
144144
%X = zext i16 %A to i32
@@ -150,8 +150,8 @@ BB1:
150150

151151
BB2:
152152
;; Suck casts into phi
153-
%c = phi i32 [ %X, %BB0 ], [ %Y, %BB1 ]
154-
ret i32 %c
153+
%B = phi i32 [ %X, %BB0 ], [ %Y, %BB1 ]
154+
ret i32 %B
155155
}
156156

157157
define i32 @test_dead_cycle(i32 %A, i1 %cond) {
@@ -253,8 +253,8 @@ define ptr @test8(ptr %A, i1 %b) {
253253
; CHECK: BB1:
254254
; CHECK-NEXT: br label [[BB2]]
255255
; CHECK: BB2:
256-
; CHECK-NEXT: [[C:%.*]] = getelementptr i8, ptr [[A:%.*]], i64 4
257-
; CHECK-NEXT: ret ptr [[C]]
256+
; CHECK-NEXT: [[B:%.*]] = getelementptr i8, ptr [[A:%.*]], i64 4
257+
; CHECK-NEXT: ret ptr [[B]]
258258
;
259259
BB0:
260260
%X = getelementptr inbounds { i32, i32 }, ptr %A, i32 0, i32 1
@@ -266,8 +266,8 @@ BB1:
266266

267267
BB2:
268268
;; Suck GEPs into phi
269-
%c = phi ptr [ %X, %BB0 ], [ %Y, %BB1 ]
270-
ret ptr %c
269+
%B = phi ptr [ %X, %BB0 ], [ %Y, %BB1 ]
270+
ret ptr %B
271271
}
272272

273273
define i32 @test9(ptr %A, ptr %B) {
@@ -510,8 +510,9 @@ define i64 @test15b(i64 %A, i1 %b) {
510510
; CHECK-NEXT: [[Y_OFF0:%.*]] = phi i64 [ [[A]], [[ENTRY]] ], [ [[C]], [[ONE]] ]
511511
; CHECK-NEXT: [[Y_OFF64]] = phi i64 [ [[A]], [[ENTRY]] ], [ 0, [[ONE]] ]
512512
; CHECK-NEXT: [[D:%.*]] = call i64 @test15a(i64 [[Y_OFF64]])
513-
; CHECK-NEXT: [[D1:%.*]] = trunc i64 [[D]] to i1
514-
; CHECK-NEXT: br i1 [[D1]], label [[ONE]], label [[END:%.*]]
513+
; CHECK-NEXT: [[TMP0:%.*]] = and i64 [[D]], 1
514+
; CHECK-NEXT: [[D1_NOT:%.*]] = icmp eq i64 [[TMP0]], 0
515+
; CHECK-NEXT: br i1 [[D1_NOT]], label [[END:%.*]], label [[ONE]]
515516
; CHECK: end:
516517
; CHECK-NEXT: ret i64 [[Y_OFF0]]
517518
;

llvm/test/Transforms/InstCombine/ptr-int-cast.ll

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ define i1 @test1(ptr %x) nounwind {
66
; CHECK-LABEL: @test1(
77
; CHECK-NEXT: entry:
88
; CHECK-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[X:%.*]] to i64
9-
; CHECK-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP0]] to i1
9+
; CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 1
10+
; CHECK-NEXT: [[TMP2:%.*]] = icmp ne i64 [[TMP1]], 0
1011
; CHECK-NEXT: ret i1 [[TMP2]]
1112
;
1213
entry:

llvm/test/Transforms/PhaseOrdering/X86/merge-functions.ll

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ define i1 @test1(i32 %c) {
1414
; CHECK-NEXT: [[TMP0:%.*]] = icmp ult i32 [[SWITCH_TABLEIDX]], 20
1515
; CHECK-NEXT: [[SWITCH_CAST:%.*]] = trunc i32 [[SWITCH_TABLEIDX]] to i20
1616
; CHECK-NEXT: [[SWITCH_DOWNSHIFT:%.*]] = lshr i20 -490991, [[SWITCH_CAST]]
17-
; CHECK-NEXT: [[SWITCH_MASKED:%.*]] = trunc i20 [[SWITCH_DOWNSHIFT]] to i1
17+
; CHECK-NEXT: [[TMP1:%.*]] = and i20 [[SWITCH_DOWNSHIFT]], 1
18+
; CHECK-NEXT: [[SWITCH_MASKED:%.*]] = icmp ne i20 [[TMP1]], 0
1819
; CHECK-NEXT: [[I_0:%.*]] = select i1 [[TMP0]], i1 [[SWITCH_MASKED]], i1 false
1920
; CHECK-NEXT: ret i1 [[I_0]]
2021
;

0 commit comments

Comments
 (0)