diff options
author | Jakub Staszak <jstaszak@apple.com> | 2011-07-28 21:33:46 +0000 |
---|---|---|
committer | Jakub Staszak <jstaszak@apple.com> | 2011-07-28 21:33:46 +0000 |
commit | bcb3c65bb4fcef1438e04a830492b13170714d15 (patch) | |
tree | 9d634b6ecd193910d27966db55b6f4775735a4fb /llvm/lib/Analysis/BranchProbabilityInfo.cpp | |
parent | f8d95bc4c6fd22f78b41536dca083c80bef41b95 (diff) | |
download | bcm5719-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.cpp | 17 |
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; |