[clang] 3e39760 - Revert "Return "[InstCombine] Simplify compare of Phi with constant inputs against a constant""
Sam Parker via cfe-commits
cfe-commits at lists.llvm.org
Mon Jun 15 00:01:33 PDT 2020
Yeah, I will work on getting some today.
Sam Parker
Compilation Tools Engineer | Arm
. . . . . . . . . . . . . . . . . . . . . . . . . . .
Arm.com
________________________________
From: Roman Lebedev <lebedev.ri at gmail.com>
Sent: 15 June 2020 07:56
To: Sam Parker <Sam.Parker at arm.com>; Sam Parker <llvmlistbot at llvm.org>
Cc: cfe-commits at lists.llvm.org <cfe-commits at lists.llvm.org>
Subject: Re: [clang] 3e39760 - Revert "Return "[InstCombine] Simplify compare of Phi with constant inputs against a constant""
Reproducers?
On Mon, Jun 15, 2020 at 9:47 AM Sam Parker via cfe-commits
<cfe-commits at 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 at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20200615/531186b6/attachment-0001.html>
More information about the cfe-commits
mailing list