summaryrefslogtreecommitdiff
path: root/lib/Analysis/BranchProbabilityInfo.cpp
diff options
context:
space:
mode:
authorBenjamin Kramer <benny.kra@googlemail.com>2011-10-21 20:12:47 +0000
committerBenjamin Kramer <benny.kra@googlemail.com>2011-10-21 20:12:47 +0000
commitc888aa47bdf4b5766f30e4d1a2c3c2d4e06a18b5 (patch)
treea87eaa70903f839194e6ac791e8bf0222df22271 /lib/Analysis/BranchProbabilityInfo.cpp
parentcdcfa280568d5d48ebeba2dcfc87915105e090d1 (diff)
downloadllvm-c888aa47bdf4b5766f30e4d1a2c3c2d4e06a18b5.tar.gz
llvm-c888aa47bdf4b5766f30e4d1a2c3c2d4e06a18b5.tar.bz2
llvm-c888aa47bdf4b5766f30e4d1a2c3c2d4e06a18b5.tar.xz
BranchProbabilityInfo: floating point equality is unlikely.
This is from the same paper from Ball and Larus as the rest of the currently implemented heuristics. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@142677 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/BranchProbabilityInfo.cpp')
-rw-r--r--lib/Analysis/BranchProbabilityInfo.cpp36
1 files changed, 34 insertions, 2 deletions
diff --git a/lib/Analysis/BranchProbabilityInfo.cpp b/lib/Analysis/BranchProbabilityInfo.cpp
index 52090c9fc1..6e8d7e0115 100644
--- a/lib/Analysis/BranchProbabilityInfo.cpp
+++ b/lib/Analysis/BranchProbabilityInfo.cpp
@@ -76,6 +76,9 @@ class BranchProbabilityAnalysis {
static const uint32_t ZH_TAKEN_WEIGHT = 20;
static const uint32_t ZH_NONTAKEN_WEIGHT = 12;
+ static const uint32_t FPH_TAKEN_WEIGHT = 20;
+ static const uint32_t FPH_NONTAKEN_WEIGHT = 12;
+
// Standard weight value. Used when none of the heuristics set weight for
// the edge.
static const uint32_t NORMAL_WEIGHT = 16;
@@ -131,9 +134,12 @@ public:
// Loop Branch Heuristics
bool calcLoopBranchHeuristics(BasicBlock *BB);
- // Zero Heurestics
+ // Zero Heuristics
bool calcZeroHeuristics(BasicBlock *BB);
+ // Floating Point Heuristics
+ bool calcFloatingPointHeuristics(BasicBlock *BB);
+
bool runOnFunction(Function &F);
};
} // end anonymous namespace
@@ -378,6 +384,29 @@ bool BranchProbabilityAnalysis::calcZeroHeuristics(BasicBlock *BB) {
return true;
}
+bool BranchProbabilityAnalysis::calcFloatingPointHeuristics(BasicBlock *BB) {
+ BranchInst *BI = dyn_cast<BranchInst>(BB->getTerminator());
+ if (!BI || !BI->isConditional())
+ return false;
+
+ Value *Cond = BI->getCondition();
+ FCmpInst *FCmp = dyn_cast<FCmpInst>(Cond);
+ if (!FCmp || !FCmp->isEquality())
+ return false;
+
+ BasicBlock *Taken = BI->getSuccessor(0);
+ BasicBlock *NonTaken = BI->getSuccessor(1);
+
+ // f1 == f2 -> Unlikely
+ // f1 != f2 -> Likely
+ if (FCmp->isTrueWhenEqual())
+ std::swap(Taken, NonTaken);
+
+ BP->setEdgeWeight(BB, Taken, FPH_TAKEN_WEIGHT);
+ BP->setEdgeWeight(BB, NonTaken, FPH_NONTAKEN_WEIGHT);
+
+ return true;
+}
bool BranchProbabilityAnalysis::runOnFunction(Function &F) {
@@ -396,7 +425,10 @@ bool BranchProbabilityAnalysis::runOnFunction(Function &F) {
if (calcPointerHeuristics(BB))
continue;
- calcZeroHeuristics(BB);
+ if (calcZeroHeuristics(BB))
+ continue;
+
+ calcFloatingPointHeuristics(BB);
}
return false;