summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Analysis/BranchProbabilityInfo.cpp
diff options
context:
space:
mode:
authorJakub Staszak <jstaszak@apple.com>2011-07-28 21:33:46 +0000
committerJakub Staszak <jstaszak@apple.com>2011-07-28 21:33:46 +0000
commitbcb3c65bb4fcef1438e04a830492b13170714d15 (patch)
tree9d634b6ecd193910d27966db55b6f4775735a4fb /llvm/lib/Analysis/BranchProbabilityInfo.cpp
parentf8d95bc4c6fd22f78b41536dca083c80bef41b95 (diff)
downloadbcm5719-llvm-bcb3c65bb4fcef1438e04a830492b13170714d15.tar.gz
bcm5719-llvm-bcb3c65bb4fcef1438e04a830492b13170714d15.zip
Add InEdges (edges from header to the loop) in Loop Branch Heuristics, so
there is no frequency difference whether condition is in the header or in the latch. llvm-svn: 136398
Diffstat (limited to 'llvm/lib/Analysis/BranchProbabilityInfo.cpp')
-rw-r--r--llvm/lib/Analysis/BranchProbabilityInfo.cpp17
1 files changed, 17 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/BranchProbabilityInfo.cpp b/llvm/lib/Analysis/BranchProbabilityInfo.cpp
index e39cd221b5a..5ac2d814a00 100644
--- a/llvm/lib/Analysis/BranchProbabilityInfo.cpp
+++ b/llvm/lib/Analysis/BranchProbabilityInfo.cpp
@@ -205,6 +205,9 @@ void BranchProbabilityAnalysis::calcLoopBranchHeuristics(BasicBlock *BB) {
SmallVector<BasicBlock *, 8> BackEdges;
SmallVector<BasicBlock *, 8> ExitingEdges;
+ SmallVector<BasicBlock *, 8> InEdges; // Edges from header to the loop.
+
+ bool isHeader = BB == L->getHeader();
for (succ_iterator I = succ_begin(BB), E = succ_end(BB); I != E; ++I) {
BasicBlock *Succ = *I;
@@ -213,6 +216,8 @@ void BranchProbabilityAnalysis::calcLoopBranchHeuristics(BasicBlock *BB) {
ExitingEdges.push_back(Succ);
else if (Succ == L->getHeader())
BackEdges.push_back(Succ);
+ else if (isHeader)
+ InEdges.push_back(Succ);
}
if (uint32_t numBackEdges = BackEdges.size()) {
@@ -227,6 +232,18 @@ void BranchProbabilityAnalysis::calcLoopBranchHeuristics(BasicBlock *BB) {
}
}
+ if (uint32_t numInEdges = InEdges.size()) {
+ uint32_t inWeight = LBH_TAKEN_WEIGHT / numInEdges;
+ if (inWeight < NORMAL_WEIGHT)
+ inWeight = NORMAL_WEIGHT;
+
+ for (SmallVector<BasicBlock *, 8>::iterator EI = InEdges.begin(),
+ EE = InEdges.end(); EI != EE; ++EI) {
+ BasicBlock *Back = *EI;
+ BP->setEdgeWeight(BB, Back, inWeight);
+ }
+ }
+
uint32_t numExitingEdges = ExitingEdges.size();
if (uint32_t numNonExitingEdges = numSuccs - numExitingEdges) {
uint32_t exitWeight = LBH_NONTAKEN_WEIGHT / numNonExitingEdges;
OpenPOWER on IntegriCloud