[llvm] 3279347 - [BPI] Look through bitcasts in calcZeroHeuristic

Wei Wang via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 17 09:34:50 PST 2020


Author: Wei Wang
Date: 2020-11-17T09:33:05-08:00
New Revision: 3279347da05e590c970b37540d7e3ac873ae3e1d

URL: https://github.com/llvm/llvm-project/commit/3279347da05e590c970b37540d7e3ac873ae3e1d
DIFF: https://github.com/llvm/llvm-project/commit/3279347da05e590c970b37540d7e3ac873ae3e1d.diff

LOG: [BPI] Look through bitcasts in calcZeroHeuristic

Constant hoisting may hide the constant value behind bitcast for And's
operand. Track down the constant to make the BFI result consistent
regardless of hoisting.

Differential Revision: https://reviews.llvm.org/D91450

Added: 
    llvm/test/Analysis/BranchProbabilityInfo/hoist.ll

Modified: 
    llvm/lib/Analysis/BranchProbabilityInfo.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Analysis/BranchProbabilityInfo.cpp b/llvm/lib/Analysis/BranchProbabilityInfo.cpp
index ca4b58044d67..ac5dbe1ce6e9 100644
--- a/llvm/lib/Analysis/BranchProbabilityInfo.cpp
+++ b/llvm/lib/Analysis/BranchProbabilityInfo.cpp
@@ -881,7 +881,7 @@ bool BranchProbabilityInfo::calcZeroHeuristics(const BasicBlock *BB,
   // we don't have information about probabilities.
   if (Instruction *LHS = dyn_cast<Instruction>(CI->getOperand(0)))
     if (LHS->getOpcode() == Instruction::And)
-      if (ConstantInt *AndRHS = dyn_cast<ConstantInt>(LHS->getOperand(1)))
+      if (ConstantInt *AndRHS = GetConstantInt(LHS->getOperand(1)))
         if (AndRHS->getValue().isPowerOf2())
           return false;
 

diff  --git a/llvm/test/Analysis/BranchProbabilityInfo/hoist.ll b/llvm/test/Analysis/BranchProbabilityInfo/hoist.ll
new file mode 100644
index 000000000000..1daa5d1e86e7
--- /dev/null
+++ b/llvm/test/Analysis/BranchProbabilityInfo/hoist.ll
@@ -0,0 +1,63 @@
+; RUN: opt < %s -analyze -branch-prob -enable-new-pm=0 | FileCheck %s
+; RUN: opt < %s -passes='print<branch-prob>' -disable-output 2>&1 | FileCheck %s
+
+; CHECK-LABEL: no_hoist
+; CHECK: edge entry -> if.end probability is 0x40000000 / 0x80000000 = 50.00%
+; CHECK: edge entry -> if.then probability is 0x40000000 / 0x80000000 = 50.00%
+; CHECK: edge if.end -> if.end4 probability is 0x40000000 / 0x80000000 = 50.00%
+; CHECK: edge if.end -> if.then3 probability is 0x40000000 / 0x80000000 = 50.00%
+define dso_local void @no_hoist(i64 %arg1, i64 %arg2) local_unnamed_addr #0 {
+entry:
+  %and = and i64 %arg1, 1152921504606846976
+  %tobool.not = icmp eq i64 %and, 0
+  br i1 %tobool.not, label %if.end, label %if.then
+
+if.then:                                          ; preds = %entry
+  tail call void @bar()
+  br label %if.end
+
+if.end:                                           ; preds = %if.then, %entry
+  %and1 = and i64 %arg2, 1152921504606846976
+  %tobool2.not = icmp eq i64 %and1, 0
+  br i1 %tobool2.not, label %if.end4, label %if.then3
+
+if.then3:                                         ; preds = %if.end
+  tail call void @baz()
+  br label %if.end4
+
+if.end4:                                          ; preds = %if.then3, %if.end
+  ret void
+}
+
+; CHECK-LABEL: hoist
+; CHECK: edge entry -> if.end probability is 0x40000000 / 0x80000000 = 50.00%
+; CHECK: edge entry -> if.then probability is 0x40000000 / 0x80000000 = 50.00%
+; CHECK: edge if.end -> if.end4 probability is 0x40000000 / 0x80000000 = 50.00%
+; CHECK: edge if.end -> if.then3 probability is 0x40000000 / 0x80000000 = 50.00%
+define dso_local void @hoist(i64 %arg1, i64 %arg2) local_unnamed_addr #0 {
+entry:
+  %const = bitcast i64 1152921504606846976 to i64
+  %and = and i64 %arg1, %const
+  %tobool.not = icmp eq i64 %and, 0
+  br i1 %tobool.not, label %if.end, label %if.then
+
+if.then:                                          ; preds = %entry
+  tail call void @bar()
+  br label %if.end
+
+if.end:                                           ; preds = %if.then, %entry
+  %and1 = and i64 %arg2, %const
+  %tobool2.not = icmp eq i64 %and1, 0
+  br i1 %tobool2.not, label %if.end4, label %if.then3
+
+if.then3:                                         ; preds = %if.end
+  tail call void @baz()
+  br label %if.end4
+
+if.end4:                                          ; preds = %if.then3, %if.end
+  ret void
+}
+
+declare dso_local void @bar() local_unnamed_addr #1
+
+declare dso_local void @baz() local_unnamed_addr #1


        


More information about the llvm-commits mailing list