From 1b41b25fc111c9a72ff017011cc3f92849304146 Mon Sep 17 00:00:00 2001 From: Sam Parker Date: Fri, 15 Feb 2019 11:50:21 +0000 Subject: [PATCH] [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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@354119 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/BranchProbabilityInfo.cpp | 8 +- .../BranchProbabilityInfo/zero_heuristics.ll | 103 ++++++++++++++++++ 2 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 test/Analysis/BranchProbabilityInfo/zero_heuristics.ll diff --git a/lib/Analysis/BranchProbabilityInfo.cpp b/lib/Analysis/BranchProbabilityInfo.cpp index e4de67b8b84..5eb95003f5d 100644 --- a/lib/Analysis/BranchProbabilityInfo.cpp +++ b/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(V)) + return dyn_cast(I->getOperand(0)); + return dyn_cast(V); + }; + Value *RHS = CI->getOperand(1); - ConstantInt *CV = dyn_cast(RHS); + ConstantInt *CV = GetConstantInt(RHS); if (!CV) return false; diff --git a/test/Analysis/BranchProbabilityInfo/zero_heuristics.ll b/test/Analysis/BranchProbabilityInfo/zero_heuristics.ll new file mode 100644 index 00000000000..c6e1cb8c265 --- /dev/null +++ b/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 +} -- 2.40.0