diff options
author | Sam Parker <sam.parker@arm.com> | 2019-02-15 11:50:21 +0000 |
---|---|---|
committer | Sam Parker <sam.parker@arm.com> | 2019-02-15 11:50:21 +0000 |
commit | 0b53e8454b11340353610162191edb8eccd775cd (patch) | |
tree | 2ddcc72bde7790ac08cddf9cafab1f87707b01a4 | |
parent | 136f09bea19b2584a7b8b4739ca4935dde319753 (diff) | |
download | bcm5719-llvm-0b53e8454b11340353610162191edb8eccd775cd.tar.gz bcm5719-llvm-0b53e8454b11340353610162191edb8eccd775cd.zip |
[BPI] Look through bitcasts in calcZeroHeuristic
Constant hoisting may have hidden a constant behind a bitcast so that
it isn't folded into its users. However, this prevents BPI from
calculating some of its heuristics that are based upon constant
values. So, I've added a simple helper function to look through these
casts.
Differential Revision: https://reviews.llvm.org/D58166
llvm-svn: 354119
-rw-r--r-- | llvm/lib/Analysis/BranchProbabilityInfo.cpp | 8 | ||||
-rw-r--r-- | llvm/test/Analysis/BranchProbabilityInfo/zero_heuristics.ll | 103 |
2 files changed, 110 insertions, 1 deletions
diff --git a/llvm/lib/Analysis/BranchProbabilityInfo.cpp b/llvm/lib/Analysis/BranchProbabilityInfo.cpp index e4de67b8b84..5eb95003f5d 100644 --- a/llvm/lib/Analysis/BranchProbabilityInfo.cpp +++ b/llvm/lib/Analysis/BranchProbabilityInfo.cpp @@ -660,8 +660,14 @@ bool BranchProbabilityInfo::calcZeroHeuristics(const BasicBlock *BB, if (!CI) return false; + auto GetConstantInt = [](Value *V) { + if (auto *I = dyn_cast<BitCastInst>(V)) + return dyn_cast<ConstantInt>(I->getOperand(0)); + return dyn_cast<ConstantInt>(V); + }; + Value *RHS = CI->getOperand(1); - ConstantInt *CV = dyn_cast<ConstantInt>(RHS); + ConstantInt *CV = GetConstantInt(RHS); if (!CV) return false; diff --git a/llvm/test/Analysis/BranchProbabilityInfo/zero_heuristics.ll b/llvm/test/Analysis/BranchProbabilityInfo/zero_heuristics.ll new file mode 100644 index 00000000000..c6e1cb8c265 --- /dev/null +++ b/llvm/test/Analysis/BranchProbabilityInfo/zero_heuristics.ll @@ -0,0 +1,103 @@ +; RUN: opt < %s -analyze -branch-prob | FileCheck %s + +@A = global i32 0, align 4 +@B = global i32 0, align 4 + +; CHECK-LABEL: eq_opaque_minus_one +define void @eq_opaque_minus_one(i32* %base) { +entry: + %const = bitcast i32 -1 to i32 + %tmp1 = load i32, i32* @B, align 4 + br label %for.body + +; CHECK: edge for.body -> if.then probability is 0x30000000 / 0x80000000 = 37.50% +; CHECK: edge for.body -> for.inc probability is 0x50000000 / 0x80000000 = 62.50% +for.body: + %tmp4 = phi i32 [ %tmp1, %entry ], [ %tmp7, %for.inc ] + %inc.iv = phi i32 [ 0, %entry ], [ %inc, %for.inc ] + %storemerge176.in = getelementptr inbounds i32, i32* %base, i32 %inc.iv + %storemerge176 = load i32, i32* %storemerge176.in, align 4 + store i32 %storemerge176, i32* @A, align 4 + %cmp20 = icmp eq i32 %storemerge176, %const + br i1 %cmp20, label %if.then, label %for.inc + +if.then: + %lnot.ext = zext i1 %cmp20 to i32 + store i32 %lnot.ext, i32* @B, align 4 + br label %for.inc + +for.inc: + %tmp7 = phi i32 [ %tmp4, %for.body ], [ %lnot.ext, %if.then ] + %inc = add nuw nsw i32 %inc.iv, 1 + %cmp9 = icmp ult i32 %inc, 401 + br i1 %cmp9, label %for.body, label %exit + +exit: + ret void +} + +; CHECK-LABEL: ne_opaque_minus_one +define void @ne_opaque_minus_one(i32* %base) { +entry: + %const = bitcast i32 -1 to i32 + %tmp1 = load i32, i32* @B, align 4 + br label %for.body + +; CHECK: edge for.body -> if.then probability is 0x50000000 / 0x80000000 = 62.50% +; CHECK: edge for.body -> for.inc probability is 0x30000000 / 0x80000000 = 37.50% +for.body: + %tmp4 = phi i32 [ %tmp1, %entry ], [ %tmp7, %for.inc ] + %inc.iv = phi i32 [ 0, %entry ], [ %inc, %for.inc ] + %storemerge176.in = getelementptr inbounds i32, i32* %base, i32 %inc.iv + %storemerge176 = load i32, i32* %storemerge176.in, align 4 + store i32 %storemerge176, i32* @A, align 4 + %cmp20 = icmp ne i32 %storemerge176, %const + br i1 %cmp20, label %if.then, label %for.inc + +if.then: + %lnot.ext = zext i1 %cmp20 to i32 + store i32 %lnot.ext, i32* @B, align 4 + br label %for.inc + +for.inc: + %tmp7 = phi i32 [ %tmp4, %for.body ], [ %lnot.ext, %if.then ] + %inc = add nuw nsw i32 %inc.iv, 1 + %cmp9 = icmp ult i32 %inc, 401 + br i1 %cmp9, label %for.body, label %exit + +exit: + ret void +} + +; CHECK-LABEL: sgt_opaque_minus_one +define void @sgt_opaque_minus_one(i32* %base) { +entry: + %const = bitcast i32 -1 to i32 + %tmp1 = load i32, i32* @B, align 4 + br label %for.body + +; CHECK: edge for.body -> if.then probability is 0x50000000 / 0x80000000 = 62.50% +; CHECK: edge for.body -> for.inc probability is 0x30000000 / 0x80000000 = 37.50% +for.body: + %tmp4 = phi i32 [ %tmp1, %entry ], [ %tmp7, %for.inc ] + %inc.iv = phi i32 [ 0, %entry ], [ %inc, %for.inc ] + %storemerge176.in = getelementptr inbounds i32, i32* %base, i32 %inc.iv + %storemerge176 = load i32, i32* %storemerge176.in, align 4 + store i32 %storemerge176, i32* @A, align 4 + %cmp20 = icmp sgt i32 %storemerge176, %const + br i1 %cmp20, label %if.then, label %for.inc + +if.then: + %lnot.ext = zext i1 %cmp20 to i32 + store i32 %lnot.ext, i32* @B, align 4 + br label %for.inc + +for.inc: + %tmp7 = phi i32 [ %tmp4, %for.body ], [ %lnot.ext, %if.then ] + %inc = add nuw nsw i32 %inc.iv, 1 + %cmp9 = icmp ult i32 %inc, 401 + br i1 %cmp9, label %for.body, label %exit + +exit: + ret void +} |