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
This commit is contained in:
Chandler Carruth 2011-10-19 10:30:30 +00:00
parent 6aa5c26c81
commit 99d01c54a0
2 changed files with 63 additions and 0 deletions

View File

@ -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;

View File

@ -22,3 +22,28 @@ body:
exit:
ret i32 %sum
}
define i32 @test2(i32 %i, i32 %a, i32 %b) {
; CHECK: Printing analysis {{.*}} for function 'test2'
; CHECK: entry = 1024
entry:
%cond = icmp ult i32 %i, 42
br i1 %cond, label %then, label %else, !prof !0
; The 'then' branch is predicted more likely via branch weight metadata.
; CHECK: then = 963
then:
br label %exit
; CHECK: else = 60
else:
br label %exit
; FIXME: It may be a bug that we don't sum back to 1024.
; CHECK: exit = 1023
exit:
%result = phi i32 [ %a, %then ], [ %b, %else ]
ret i32 %result
}
!0 = metadata !{metadata !"branch_weights", i32 64, i32 4}