1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-22 18:54:02 +01:00

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.

llvm-svn: 142492
This commit is contained in:
Chandler Carruth 2011-10-19 10:30:30 +00:00
parent 13b475d4f6
commit 18a382b4b6
2 changed files with 63 additions and 0 deletions

View File

@ -13,6 +13,8 @@
#include "llvm/Constants.h" #include "llvm/Constants.h"
#include "llvm/Instructions.h" #include "llvm/Instructions.h"
#include "llvm/LLVMContext.h"
#include "llvm/Metadata.h"
#include "llvm/Analysis/BranchProbabilityInfo.h" #include "llvm/Analysis/BranchProbabilityInfo.h"
#include "llvm/Analysis/LoopInfo.h" #include "llvm/Analysis/LoopInfo.h"
#include "llvm/Support/Debug.h" #include "llvm/Support/Debug.h"
@ -117,6 +119,9 @@ public:
: BP(BP), LI(LI) { : BP(BP), LI(LI) {
} }
// Metadata Weights
bool calcMetadataWeights(BasicBlock *BB);
// Return Heuristics // Return Heuristics
bool calcReturnHeuristics(BasicBlock *BB); bool calcReturnHeuristics(BasicBlock *BB);
@ -133,6 +138,36 @@ public:
}; };
} // end anonymous namespace } // 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 // Calculate Edge Weights using "Return Heuristics". Predict a successor which
// leads directly to Return Instruction will not be taken. // leads directly to Return Instruction will not be taken.
bool BranchProbabilityAnalysis::calcReturnHeuristics(BasicBlock *BB){ 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; ) { for (Function::iterator I = F.begin(), E = F.end(); I != E; ) {
BasicBlock *BB = I++; BasicBlock *BB = I++;
if (calcMetadataWeights(BB))
continue;
if (calcLoopBranchHeuristics(BB)) if (calcLoopBranchHeuristics(BB))
continue; continue;

View File

@ -22,3 +22,28 @@ body:
exit: exit:
ret i32 %sum 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}