Reproducers?
On Mon, Jun 15, 2020 at 9:47 AM Sam Parker via cfe-commits <cfe-commits@lists.llvm.org> wrote: > > > Author: Sam Parker > Date: 2020-06-15T07:46:28+01:00 > New Revision: 3e39760f8eaad4770efa05824768e67237915cf5 > > URL: > https://github.com/llvm/llvm-project/commit/3e39760f8eaad4770efa05824768e67237915cf5 > DIFF: > https://github.com/llvm/llvm-project/commit/3e39760f8eaad4770efa05824768e67237915cf5.diff > > LOG: Revert "Return "[InstCombine] Simplify compare of Phi with constant > inputs against a constant"" > > This reverts commit 23291b9863c8af7ad348c4a7d85d8d784df88eb1. > > This caused performance regressions. > > Added: > > > Modified: > clang/test/CodeGenObjC/exceptions.m > llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp > llvm/test/Transforms/InstCombine/icmp-constant-phi.ll > llvm/test/Transforms/InstCombine/indexed-gep-compares.ll > llvm/test/Transforms/InstCombine/zext-or-icmp.ll > > Removed: > > > > ################################################################################ > diff --git a/clang/test/CodeGenObjC/exceptions.m > b/clang/test/CodeGenObjC/exceptions.m > index 3bb4f86cf025..741f8a819158 100644 > --- a/clang/test/CodeGenObjC/exceptions.m > +++ b/clang/test/CodeGenObjC/exceptions.m > @@ -97,7 +97,7 @@ void f3() { > // CHECK: call void @objc_exception_try_exit( > f3_helper(0, &x); > } @finally { > - // CHECK: [[DEST1:%.*]] = phi i1 [ true, {{%.*}} ], [ false, {{%.*}} ] > + // CHECK: [[DEST1:%.*]] = phi i32 [ 0, {{%.*}} ], [ 3, {{%.*}} ] > // CHECK: call void @objc_exception_try_enter > // CHECK: call i32 @_setjmp > @try { > @@ -105,7 +105,7 @@ void f3() { > // CHECK: call void @objc_exception_try_exit( > f3_helper(1, &x); > } @finally { > - // CHECK: [[DEST2:%.*]] = phi i1 [ true, {{%.*}} ], [ false, {{%.*}} ] > + // CHECK: [[DEST2:%.*]] = phi i32 [ 0, {{%.*}} ], [ 5, {{%.*}} ] > // CHECK: call void @f3_helper(i32 2, i32* nonnull [[X]]) > f3_helper(2, &x); > > > diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp > b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp > index a7b9ecb9bf3b..48375a1a323f 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<Constant>(Op1); > - if (!C) > - return nullptr; > - > - if (auto *Phi = dyn_cast<PHINode>(Op0)) > - if (all_of(Phi->operands(), [](Value *V) { return isa<Constant>(V); })) { > - Type *Ty = Cmp.getType(); > - Builder.SetInsertPoint(Phi); > - PHINode *NewPhi = > - Builder.CreatePHI(Ty, Phi->getNumOperands()); > - for (BasicBlock *Predecessor : predecessors(Phi->getParent())) { > - auto *Input = > - cast<Constant>(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 7d4b9294143f..9753149f8012 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> [ <i1 true, i1 false>, > [[IF_FALSE]] ], [ <i1 false, i1 true>, [[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> [<i32 123, i32 123>, %if.true], [<i32 456, i32 456>, > %if.false] > - br label %exit > - > -exit: > - %compare = icmp ne <2 x i32> %phi, <i32 123, i32 456> > - 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> [ <float 1.232500e+02, float > 1.232500e+02>, [[IF_TRUE]] ], [ <float 4.562500e+02, float 4.562500e+02>, > [[IF_FALSE]] ] > -; CHECK-NEXT: br label [[EXIT:%.*]] > -; CHECK: exit: > -; CHECK-NEXT: [[COMPARE:%.*]] = fcmp one <2 x float> [[PHI]], <float > 1.232500e+02, float 4.562500e+02> > -; 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> [<float 123.25, float 123.25>, %if.true], [<float > 456.25, float 456.25>, %if.false] > - br label %exit > - > -exit: > - %compare = fcmp one <2 x float> %phi, <float 123.25, float 456.25> > - 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 859fd6437bb3..71afed438d10 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 973c5a53abac..6c65032cebe9 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 > > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits