diff options
author | Chandler Carruth <chandlerc@gmail.com> | 2011-10-19 10:30:30 +0000 |
---|---|---|
committer | Chandler Carruth <chandlerc@gmail.com> | 2011-10-19 10:30:30 +0000 |
commit | 99d01c54a0fd790a48d5aa02bfeb4cc08388b8fa (patch) | |
tree | f937b9c7d85eece81dbc1f73370dfb26006570ae /lib/Analysis/BranchProbabilityInfo.cpp | |
parent | 6aa5c26c81071e22a23a6f0ae7dcac6080ad6597 (diff) |
Teach the BranchProbabilityInfo analysis pass to read any metadata
encoding of probabilities. In the absense of metadata, it continues to
fall back on static heuristics.
This allows __builtin_expect, after lowering through llvm.expect
a branch instruction's metadata, to actually enter the branch
probability model. This is one component of resolving PR2577.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@142492 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/BranchProbabilityInfo.cpp')
-rw-r--r-- | lib/Analysis/BranchProbabilityInfo.cpp | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/lib/Analysis/BranchProbabilityInfo.cpp b/lib/Analysis/BranchProbabilityInfo.cpp index c37987e1be..70de3d1c49 100644 --- a/lib/Analysis/BranchProbabilityInfo.cpp +++ b/lib/Analysis/BranchProbabilityInfo.cpp @@ -13,6 +13,8 @@ #include "llvm/Constants.h" #include "llvm/Instructions.h" +#include "llvm/LLVMContext.h" +#include "llvm/Metadata.h" #include "llvm/Analysis/BranchProbabilityInfo.h" #include "llvm/Analysis/LoopInfo.h" #include "llvm/Support/Debug.h" @@ -117,6 +119,9 @@ public: : BP(BP), LI(LI) { } + // Metadata Weights + bool calcMetadataWeights(BasicBlock *BB); + // Return Heuristics bool calcReturnHeuristics(BasicBlock *BB); @@ -133,6 +138,36 @@ public: }; } // end anonymous namespace +// Propagate existing explicit probabilities from either profile data or +// 'expect' intrinsic processing. +// FIXME: This doesn't correctly extract probabilities for switches. +bool BranchProbabilityAnalysis::calcMetadataWeights(BasicBlock *BB) { + BranchInst *BI = dyn_cast<BranchInst>(BB->getTerminator()); + if (!BI || !BI->isConditional()) + return false; + + MDNode *WeightsNode = BI->getMetadata(LLVMContext::MD_prof); + if (!WeightsNode || WeightsNode->getNumOperands() < 3) + return false; + + // Pull the weights out of the metadata. Note that the zero operand is the + // name. + ConstantInt *Weights[] = { + dyn_cast<ConstantInt>(WeightsNode->getOperand(1)), + dyn_cast<ConstantInt>(WeightsNode->getOperand(2)) + }; + if (!Weights[0] || !Weights[1]) + return false; + + uint32_t WeightLimit = getMaxWeightFor(BB); + BP->setEdgeWeight(BB, BI->getSuccessor(0), + Weights[0]->getLimitedValue(WeightLimit)); + BP->setEdgeWeight(BB, BI->getSuccessor(1), + Weights[1]->getLimitedValue(WeightLimit)); + + return true; +} + // Calculate Edge Weights using "Return Heuristics". Predict a successor which // leads directly to Return Instruction will not be taken. bool BranchProbabilityAnalysis::calcReturnHeuristics(BasicBlock *BB){ @@ -341,6 +376,9 @@ bool BranchProbabilityAnalysis::runOnFunction(Function &F) { for (Function::iterator I = F.begin(), E = F.end(); I != E; ) { BasicBlock *BB = I++; + if (calcMetadataWeights(BB)) + continue; + if (calcLoopBranchHeuristics(BB)) continue; |