From c4b5a66e44f031eb89c9d6ea32b144f1169bdbae Mon Sep 17 00:00:00 2001 From: Kadir Cetinkaya Date: Fri, 5 Jun 2020 13:02:35 +0200 Subject: [PATCH] Revert "[InstCombine] Simplify compare of Phi with constant inputs against a constant" This reverts commit 16b7eb6dd1247dbe322061d33636a054d6c954dc. Breaks build bots, see http://lab.llvm.org:8011/builders/clang-x86_64-debian-fast/builds/29888 for an example. --- .../Transforms/InstCombine/InstCombineCompares.cpp | 21 --- .../Transforms/InstCombine/icmp-constant-phi.ll | 172 +-------------------- .../Transforms/InstCombine/indexed-gep-compares.ll | 3 +- llvm/test/Transforms/InstCombine/zext-or-icmp.ll | 4 +- 4 files changed, 12 insertions(+), 188 deletions(-) diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp index a7b9ecb..48375a1 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp @@ -1452,27 +1452,6 @@ Instruction *InstCombiner::foldICmpWithConstant(ICmpInst &Cmp) { if (Instruction *Res = processUGT_ADDCST_ADD(Cmp, A, B, CI2, CI, *this)) return Res; - // icmp(phi(C1, C2, ...), C) -> phi(icmp(C1, C), icmp(C2, C), ...). - Constant *C = dyn_cast(Op1); - if (!C) - return nullptr; - - if (auto *Phi = dyn_cast(Op0)) - if (all_of(Phi->operands(), [](Value *V) { return isa(V); })) { - Type *Ty = Cmp.getType(); - Builder.SetInsertPoint(Phi); - PHINode *NewPhi = - Builder.CreatePHI(Ty, Phi->getNumOperands()); - for (BasicBlock *Predecessor : predecessors(Phi->getParent())) { - auto *Input = - cast(Phi->getIncomingValueForBlock(Predecessor)); - auto *BoolInput = ConstantExpr::getCompare(Pred, Input, C); - NewPhi->addIncoming(BoolInput, Predecessor); - } - NewPhi->takeName(&Cmp); - return replaceInstUsesWith(Cmp, NewPhi); - } - return nullptr; } diff --git a/llvm/test/Transforms/InstCombine/icmp-constant-phi.ll b/llvm/test/Transforms/InstCombine/icmp-constant-phi.ll index 7d4b929..9753149 100644 --- a/llvm/test/Transforms/InstCombine/icmp-constant-phi.ll +++ b/llvm/test/Transforms/InstCombine/icmp-constant-phi.ll @@ -2,6 +2,8 @@ ; RUN: opt < %s -instcombine -S | FileCheck %s ; RUN: opt < %s -passes=instcombine -S | FileCheck %s +; TODO: Replace with boolean Phi. + define i1 @test_eq(i1 %cond) { ; CHECK-LABEL: @test_eq( ; CHECK-NEXT: entry: @@ -11,9 +13,10 @@ define i1 @test_eq(i1 %cond) { ; CHECK: if.false: ; CHECK-NEXT: br label [[MERGE]] ; CHECK: merge: -; CHECK-NEXT: [[COMPARE:%.*]] = phi i1 [ true, [[IF_FALSE]] ], [ false, [[IF_TRUE]] ] +; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ 123, [[IF_TRUE]] ], [ 456, [[IF_FALSE]] ] ; CHECK-NEXT: br label [[EXIT:%.*]] ; CHECK: exit: +; CHECK-NEXT: [[COMPARE:%.*]] = icmp eq i32 [[PHI]], 456 ; CHECK-NEXT: ret i1 [[COMPARE]] ; entry: @@ -43,9 +46,10 @@ define i1 @test_slt(i1 %cond) { ; CHECK: if.false: ; CHECK-NEXT: br label [[MERGE]] ; CHECK: merge: -; CHECK-NEXT: [[COMPARE:%.*]] = phi i1 [ false, [[IF_FALSE]] ], [ true, [[IF_TRUE]] ] +; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ 123, [[IF_TRUE]] ], [ 456, [[IF_FALSE]] ] ; CHECK-NEXT: br label [[EXIT:%.*]] ; CHECK: exit: +; CHECK-NEXT: [[COMPARE:%.*]] = icmp ult i32 [[PHI]], 456 ; CHECK-NEXT: ret i1 [[COMPARE]] ; entry: @@ -106,9 +110,10 @@ define i1 @test_ne(i1 %cond) { ; CHECK: if.false: ; CHECK-NEXT: br label [[MERGE]] ; CHECK: merge: -; CHECK-NEXT: [[COMPARE:%.*]] = phi i1 [ false, [[IF_FALSE]] ], [ true, [[IF_TRUE]] ] +; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ 123, [[IF_TRUE]] ], [ 456, [[IF_FALSE]] ] ; CHECK-NEXT: br label [[EXIT:%.*]] ; CHECK: exit: +; CHECK-NEXT: [[COMPARE:%.*]] = icmp ne i32 [[PHI]], 456 ; CHECK-NEXT: ret i1 [[COMPARE]] ; entry: @@ -128,164 +133,3 @@ exit: %compare = icmp ne i32 %phi, 456 ret i1 %compare } - -define i1 @test_ne_undef(i1 %cond) { -; CHECK-LABEL: @test_ne_undef( -; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]] -; CHECK: if.true: -; CHECK-NEXT: br label [[MERGE:%.*]] -; CHECK: if.false: -; CHECK-NEXT: br label [[MERGE]] -; CHECK: merge: -; CHECK-NEXT: br label [[EXIT:%.*]] -; CHECK: exit: -; CHECK-NEXT: ret i1 false -; -entry: - br i1 %cond, label %if.true, label %if.false - -if.true: - br label %merge - -if.false: - br label %merge - -merge: - %phi = phi i32 [undef, %if.true], [456, %if.false] - br label %exit - -exit: - %compare = icmp ne i32 %phi, 456 - ret i1 %compare -} - -define <2 x i1> @test_ne_int_vector(i1 %cond) { -; CHECK-LABEL: @test_ne_int_vector( -; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]] -; CHECK: if.true: -; CHECK-NEXT: br label [[MERGE:%.*]] -; CHECK: if.false: -; CHECK-NEXT: br label [[MERGE]] -; CHECK: merge: -; CHECK-NEXT: [[COMPARE:%.*]] = phi <2 x i1> [ , [[IF_FALSE]] ], [ , [[IF_TRUE]] ] -; CHECK-NEXT: br label [[EXIT:%.*]] -; CHECK: exit: -; CHECK-NEXT: ret <2 x i1> [[COMPARE]] -; -entry: - br i1 %cond, label %if.true, label %if.false - -if.true: - br label %merge - -if.false: - br label %merge - -merge: - %phi = phi <2 x i32> [, %if.true], [, %if.false] - br label %exit - -exit: - %compare = icmp ne <2 x i32> %phi, - ret <2 x i1> %compare -} - -; TODO: We can also constant-fold this comparison for floats. -define i1 @test_ne_float(i1 %cond) { -; CHECK-LABEL: @test_ne_float( -; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]] -; CHECK: if.true: -; CHECK-NEXT: br label [[MERGE:%.*]] -; CHECK: if.false: -; CHECK-NEXT: br label [[MERGE]] -; CHECK: merge: -; CHECK-NEXT: [[PHI:%.*]] = phi float [ 1.000000e+00, [[IF_TRUE]] ], [ 1.250000e+00, [[IF_FALSE]] ] -; CHECK-NEXT: br label [[EXIT:%.*]] -; CHECK: exit: -; CHECK-NEXT: [[COMPARE:%.*]] = fcmp one float [[PHI]], 1.250000e+00 -; CHECK-NEXT: ret i1 [[COMPARE]] -; -entry: - br i1 %cond, label %if.true, label %if.false - -if.true: - br label %merge - -if.false: - br label %merge - -merge: - %phi = phi float [1.0, %if.true], [1.25, %if.false] - br label %exit - -exit: - %compare = fcmp one float %phi, 1.25 - ret i1 %compare -} - -define i1 @test_ne_float_undef(i1 %cond) { -; CHECK-LABEL: @test_ne_float_undef( -; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]] -; CHECK: if.true: -; CHECK-NEXT: br label [[MERGE:%.*]] -; CHECK: if.false: -; CHECK-NEXT: br label [[MERGE]] -; CHECK: merge: -; CHECK-NEXT: br label [[EXIT:%.*]] -; CHECK: exit: -; CHECK-NEXT: ret i1 true -; -entry: - br i1 %cond, label %if.true, label %if.false - -if.true: - br label %merge - -if.false: - br label %merge - -merge: - %phi = phi float [1.0, %if.true], [undef, %if.false] - br label %exit - -exit: - %compare = fcmp one float %phi, 1.25 - ret i1 %compare -} - -define <2 x i1> @test_ne_float_vector(i1 %cond) { -; CHECK-LABEL: @test_ne_float_vector( -; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]] -; CHECK: if.true: -; CHECK-NEXT: br label [[MERGE:%.*]] -; CHECK: if.false: -; CHECK-NEXT: br label [[MERGE]] -; CHECK: merge: -; CHECK-NEXT: [[PHI:%.*]] = phi <2 x float> [ , [[IF_TRUE]] ], [ , [[IF_FALSE]] ] -; CHECK-NEXT: br label [[EXIT:%.*]] -; CHECK: exit: -; CHECK-NEXT: [[COMPARE:%.*]] = fcmp one <2 x float> [[PHI]], -; CHECK-NEXT: ret <2 x i1> [[COMPARE]] -; -entry: - br i1 %cond, label %if.true, label %if.false - -if.true: - br label %merge - -if.false: - br label %merge - -merge: - %phi = phi <2 x float> [, %if.true], [, %if.false] - br label %exit - -exit: - %compare = fcmp one <2 x float> %phi, - ret <2 x i1> %compare -} diff --git a/llvm/test/Transforms/InstCombine/indexed-gep-compares.ll b/llvm/test/Transforms/InstCombine/indexed-gep-compares.ll index 859fd64..71afed4 100644 --- a/llvm/test/Transforms/InstCombine/indexed-gep-compares.ll +++ b/llvm/test/Transforms/InstCombine/indexed-gep-compares.ll @@ -182,7 +182,8 @@ bb10: ret i1 %cmp } ; CHECK-LABEL: @test7( -; CHECK: %[[cmp:.*]] = phi i1 [ true, %bb7 ], [ false, %entry ] +; CHECK: %[[phi:.*]] = phi i64* [ @pr30402, %entry ], [ getelementptr inbounds (i64, i64* @pr30402, i32 1), %bb7 ] +; CHECK: %[[cmp:.*]] = icmp eq i64* %[[phi]], getelementptr inbounds (i64, i64* @pr30402, i32 1) ; CHECK: ret i1 %[[cmp]] diff --git a/llvm/test/Transforms/InstCombine/zext-or-icmp.ll b/llvm/test/Transforms/InstCombine/zext-or-icmp.ll index 973c5a5..6c65032 100644 --- a/llvm/test/Transforms/InstCombine/zext-or-icmp.ll +++ b/llvm/test/Transforms/InstCombine/zext-or-icmp.ll @@ -40,8 +40,8 @@ block2: ret i32 %conv2 ; CHECK-LABEL: dont_widen_undef( -; CHECK: %cmp.i = phi i1 [ false, %block1 ], [ true, %entry ] -; CHECK-NEXT: %m.011 = phi i32 [ 0, %block1 ], [ 33, %entry ] +; CHECK: %m.011 = phi i32 [ 33, %entry ], [ 0, %block1 ] +; CHECK-NEXT: %cmp.i = icmp ugt i32 %m.011, 1 ; CHECK-NEXT: %m.1.op = lshr i32 1, %m.011 ; CHECK-NEXT: %sext.mask = and i32 %m.1.op, 65535 ; CHECK-NEXT: %cmp115 = icmp ne i32 %sext.mask, 0 -- 2.7.4