28 "Branch Probability Analysis",
false,
true)
33 char BranchProbabilityInfo::
ID = 0;
116 return UINT32_MAX / BB->getTerminator()->getNumSuccessors();
124 bool BranchProbabilityInfo::calcUnreachableHeuristics(
BasicBlock *BB) {
127 if (isa<UnreachableInst>(TI))
128 PostDominatedByUnreachable.insert(BB);
136 if (PostDominatedByUnreachable.count(*
I))
137 UnreachableEdges.
push_back(
I.getSuccessorIndex());
139 ReachableEdges.
push_back(
I.getSuccessorIndex());
145 PostDominatedByUnreachable.insert(BB);
152 uint32_t UnreachableWeight =
155 E = UnreachableEdges.
end();
159 if (ReachableEdges.
empty())
161 uint32_t ReachableWeight =
165 E = ReachableEdges.
end();
174 bool BranchProbabilityInfo::calcMetadataWeights(
BasicBlock *BB) {
178 if (!isa<BranchInst>(TI) && !isa<SwitchInst>(TI))
196 for (
unsigned i = 1, e = WeightsNode->
getNumOperands(); i != e; ++i) {
218 bool BranchProbabilityInfo::calcColdCallHeuristics(
BasicBlock *BB) {
227 if (PostDominatedByColdCall.count(*
I))
235 PostDominatedByColdCall.insert(BB);
239 assert(!PostDominatedByColdCall.count(BB));
241 if (
CallInst *CI = dyn_cast<CallInst>(
I))
243 PostDominatedByColdCall.insert(BB);
252 uint32_t ColdWeight =
259 if (NormalEdges.
empty())
261 uint32_t NormalWeight = std::max(
264 E = NormalEdges.
end();
273 bool BranchProbabilityInfo::calcPointerHeuristics(
BasicBlock *BB) {
294 unsigned TakenIdx = 0, NonTakenIdx = 1;
306 bool BranchProbabilityInfo::calcLoopBranchHeuristics(
BasicBlock *BB) {
317 ExitingEdges.
push_back(
I.getSuccessorIndex());
324 if (uint32_t numBackEdges = BackEdges.
size()) {
330 EE = BackEdges.
end(); EI != EE; ++EI) {
335 if (uint32_t numInEdges = InEdges.
size()) {
341 EE = InEdges.
end(); EI != EE; ++EI) {
346 if (uint32_t numExitingEdges = ExitingEdges.
size()) {
352 EE = ExitingEdges.
end(); EI != EE; ++EI) {
360 bool BranchProbabilityInfo::calcZeroHeuristics(
BasicBlock *BB) {
423 unsigned TakenIdx = 0, NonTakenIdx = 1;
434 bool BranchProbabilityInfo::calcFloatingPointHeuristics(
BasicBlock *BB) {
459 unsigned TakenIdx = 0, NonTakenIdx = 1;
470 bool BranchProbabilityInfo::calcInvokeHeuristics(
BasicBlock *BB) {
487 LI = &getAnalysis<LoopInfo>();
488 assert(PostDominatedByUnreachable.empty());
489 assert(PostDominatedByColdCall.empty());
496 DEBUG(
dbgs() <<
"Computing probabilities for " <<
I->getName() <<
"\n");
497 if (calcUnreachableHeuristics(*
I))
499 if (calcMetadataWeights(*
I))
501 if (calcColdCallHeuristics(*
I))
503 if (calcLoopBranchHeuristics(*
I))
505 if (calcPointerHeuristics(*
I))
507 if (calcZeroHeuristics(*
I))
509 if (calcFloatingPointHeuristics(*
I))
511 calcInvokeHeuristics(*
I);
514 PostDominatedByUnreachable.clear();
515 PostDominatedByColdCall.clear();
520 OS <<
"---- Branch Probabilities ----\n";
523 assert(LastF &&
"Cannot print prior to running over a function");
533 uint32_t BranchProbabilityInfo::getSumForBlock(
const BasicBlock *BB)
const {
538 uint32_t PrevSum = Sum;
541 assert(Sum > PrevSum); (void) PrevSum;
556 uint32_t MaxWeight = 0;
562 uint32_t PrevSum = Sum;
565 assert(Sum > PrevSum); (void) PrevSum;
567 if (Weight > MaxWeight) {
586 Weights.find(std::make_pair(Src, IndexInSuccessors));
588 if (I != Weights.
end())
591 return DEFAULT_WEIGHT;
602 MapI = Weights.find(std::make_pair(Src,
I.getSuccessorIndex()));
603 if (MapI != Weights.
end())
604 Weight += MapI->second;
606 return (Weight == 0) ? DEFAULT_WEIGHT : Weight;
614 Weights[std::make_pair(Src, IndexInSuccessors)] = Weight;
616 << IndexInSuccessors <<
" successor weight to "
624 uint32_t D = getSumForBlock(Src);
635 uint32_t D = getSumForBlock(Src);
647 <<
" probability is " << Prob
648 << (
isEdgeHot(Src, Dst) ?
" [HOT edge]\n" :
"\n");
void push_back(const T &Elt)
raw_ostream & printEdgeProbability(raw_ostream &OS, const BasicBlock *Src, const BasicBlock *Dst) const
Print an edge's probability.
The main container class for the LLVM Intermediate Representation.
enable_if_c<!is_simple_type< Y >::value, typename cast_retty< X, const Y >::ret_type >::type dyn_cast(const Y &Val)
unsigned getNumOperands() const
getNumOperands - Return number of MDNode operands.
static const uint32_t FPH_TAKEN_WEIGHT
INITIALIZE_PASS_BEGIN(BranchProbabilityInfo,"branch-prob","Branch Probability Analysis", false, true) INITIALIZE_PASS_END(BranchProbabilityInfo
static bool isEquality(Predicate P)
MDNode - a tuple of other values.
BasicBlock * getHotSucc(BasicBlock *BB) const
Retrieve the hot successor of a block if one exists.
static uint32_t getMaxWeightFor(BasicBlock *BB)
BlockT * getHeader() const
StringRef getName() const
Value * getOperand(unsigned i) const LLVM_READONLY
getOperand - Return specified operand.
branch Branch Probability false
AnalysisUsage & addRequired()
#define INITIALIZE_PASS_DEPENDENCY(depName)
1 0 0 0 True if unordered: isnan(X) | isnan(Y)
void print(raw_ostream &OS, const Module *M=0) const
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
po_iterator< T > po_begin(T G)
ID
LLVM Calling Convention Representation.
Interval::succ_iterator succ_begin(Interval *I)
bool LLVM_ATTRIBUTE_UNUSED_RESULT empty() const
Represents a floating point comparison operator.
uint64_t getLimitedValue(uint64_t Limit=~0ULL) const
Get the constant's value with a saturation limit.
static const uint32_t UR_TAKEN_WEIGHT
Unreachable-terminating branch taken weight.
Loop * getLoopFor(const BasicBlock *BB) const
Interval::succ_iterator succ_end(Interval *I)
unsigned getNumSuccessors() const
static const uint32_t IH_NONTAKEN_WEIGHT
Invoke-terminating normal branch not-taken weight.
LLVM Basic Block Representation.
void setEdgeWeight(const BasicBlock *Src, unsigned IndexInSuccessors, uint32_t Weight)
Set the raw edge weight for a given edge.
static const uint32_t CC_TAKEN_WEIGHT
Weight for a branch taken going into a cold block.
bool contains(const LoopT *L) const
Represent an integer comparison operator.
Value * getOperand(unsigned i) const
0 1 1 1 True if ordered (no nans)
Predicate getPredicate() const
Return the predicate for this instruction.
static const uint32_t ZH_NONTAKEN_WEIGHT
Marks function as being in a cold path.
bool isConditional() const
Class for constant integers.
static const uint32_t NORMAL_WEIGHT
MDNode * getMetadata(unsigned KindID) const
bool isEquality() const
Determine if this is an equality predicate.
bool isTrueWhenEqual() const
Determine if this is true when both operands are the same.
const BasicBlock & getEntryBlock() const
bool isEdgeHot(const BasicBlock *Src, const BasicBlock *Dst) const
Test if an edge is hot relative to other out-edges of the Src.
branch Branch Probability Analysis
void getAnalysisUsage(AnalysisUsage &AU) const
raw_ostream & dbgs()
dbgs - Return a circular-buffered debug stream.
bool isAllOnesValue() const
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
static const uint32_t FPH_NONTAKEN_WEIGHT
static const uint32_t MIN_WEIGHT
static const uint32_t IH_TAKEN_WEIGHT
Invoke-terminating normal branch taken weight.
Value * getCondition() const
Analysis pass providing branch probability information.
static const uint32_t PH_NONTAKEN_WEIGHT
bool runOnFunction(Function &F)
po_iterator< T > po_end(T G)
static const uint32_t LBH_NONTAKEN_WEIGHT
static const uint32_t LBH_TAKEN_WEIGHT
TerminatorInst * getTerminator()
Returns the terminator instruction if the block is well formed or null if the block is not well forme...
static const uint32_t CC_NONTAKEN_WEIGHT
Weight for a branch not-taken into a cold block.
LLVM Value Representation.
static const uint32_t ZH_TAKEN_WEIGHT
static const uint32_t PH_TAKEN_WEIGHT
BranchProbability getEdgeProbability(const BasicBlock *Src, unsigned IndexInSuccessors) const
Get an edge's probability, relative to other out-edges of the Src.
uint32_t getEdgeWeight(const BasicBlock *Src, unsigned IndexInSuccessors) const
Get the raw edge weight calculated for the edge.
bool isOne() const
Determine if the value is one.
static const uint32_t UR_NONTAKEN_WEIGHT
Unreachable-terminating branch not-taken weight.