Home | History | Annotate | Download | only in Analysis
      1 //===-- BranchProbabilityInfo.cpp - Branch Probability Analysis -----------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // Loops should be simplified before this analysis.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #include "llvm/Analysis/BranchProbabilityInfo.h"
     15 #include "llvm/ADT/PostOrderIterator.h"
     16 #include "llvm/Analysis/LoopInfo.h"
     17 #include "llvm/IR/CFG.h"
     18 #include "llvm/IR/Constants.h"
     19 #include "llvm/IR/Function.h"
     20 #include "llvm/IR/Instructions.h"
     21 #include "llvm/IR/LLVMContext.h"
     22 #include "llvm/IR/Metadata.h"
     23 #include "llvm/Support/Debug.h"
     24 
     25 using namespace llvm;
     26 
     27 #define DEBUG_TYPE "branch-prob"
     28 
     29 INITIALIZE_PASS_BEGIN(BranchProbabilityInfo, "branch-prob",
     30                       "Branch Probability Analysis", false, true)
     31 INITIALIZE_PASS_DEPENDENCY(LoopInfo)
     32 INITIALIZE_PASS_END(BranchProbabilityInfo, "branch-prob",
     33                     "Branch Probability Analysis", false, true)
     34 
     35 char BranchProbabilityInfo::ID = 0;
     36 
     37 // Weights are for internal use only. They are used by heuristics to help to
     38 // estimate edges' probability. Example:
     39 //
     40 // Using "Loop Branch Heuristics" we predict weights of edges for the
     41 // block BB2.
     42 //         ...
     43 //          |
     44 //          V
     45 //         BB1<-+
     46 //          |   |
     47 //          |   | (Weight = 124)
     48 //          V   |
     49 //         BB2--+
     50 //          |
     51 //          | (Weight = 4)
     52 //          V
     53 //         BB3
     54 //
     55 // Probability of the edge BB2->BB1 = 124 / (124 + 4) = 0.96875
     56 // Probability of the edge BB2->BB3 = 4 / (124 + 4) = 0.03125
     57 static const uint32_t LBH_TAKEN_WEIGHT = 124;
     58 static const uint32_t LBH_NONTAKEN_WEIGHT = 4;
     59 
     60 /// \brief Unreachable-terminating branch taken weight.
     61 ///
     62 /// This is the weight for a branch being taken to a block that terminates
     63 /// (eventually) in unreachable. These are predicted as unlikely as possible.
     64 static const uint32_t UR_TAKEN_WEIGHT = 1;
     65 
     66 /// \brief Unreachable-terminating branch not-taken weight.
     67 ///
     68 /// This is the weight for a branch not being taken toward a block that
     69 /// terminates (eventually) in unreachable. Such a branch is essentially never
     70 /// taken. Set the weight to an absurdly high value so that nested loops don't
     71 /// easily subsume it.
     72 static const uint32_t UR_NONTAKEN_WEIGHT = 1024*1024 - 1;
     73 
     74 /// \brief Weight for a branch taken going into a cold block.
     75 ///
     76 /// This is the weight for a branch taken toward a block marked
     77 /// cold.  A block is marked cold if it's postdominated by a
     78 /// block containing a call to a cold function.  Cold functions
     79 /// are those marked with attribute 'cold'.
     80 static const uint32_t CC_TAKEN_WEIGHT = 4;
     81 
     82 /// \brief Weight for a branch not-taken into a cold block.
     83 ///
     84 /// This is the weight for a branch not taken toward a block marked
     85 /// cold.
     86 static const uint32_t CC_NONTAKEN_WEIGHT = 64;
     87 
     88 static const uint32_t PH_TAKEN_WEIGHT = 20;
     89 static const uint32_t PH_NONTAKEN_WEIGHT = 12;
     90 
     91 static const uint32_t ZH_TAKEN_WEIGHT = 20;
     92 static const uint32_t ZH_NONTAKEN_WEIGHT = 12;
     93 
     94 static const uint32_t FPH_TAKEN_WEIGHT = 20;
     95 static const uint32_t FPH_NONTAKEN_WEIGHT = 12;
     96 
     97 /// \brief Invoke-terminating normal branch taken weight
     98 ///
     99 /// This is the weight for branching to the normal destination of an invoke
    100 /// instruction. We expect this to happen most of the time. Set the weight to an
    101 /// absurdly high value so that nested loops subsume it.
    102 static const uint32_t IH_TAKEN_WEIGHT = 1024 * 1024 - 1;
    103 
    104 /// \brief Invoke-terminating normal branch not-taken weight.
    105 ///
    106 /// This is the weight for branching to the unwind destination of an invoke
    107 /// instruction. This is essentially never taken.
    108 static const uint32_t IH_NONTAKEN_WEIGHT = 1;
    109 
    110 // Standard weight value. Used when none of the heuristics set weight for
    111 // the edge.
    112 static const uint32_t NORMAL_WEIGHT = 16;
    113 
    114 // Minimum weight of an edge. Please note, that weight is NEVER 0.
    115 static const uint32_t MIN_WEIGHT = 1;
    116 
    117 static uint32_t getMaxWeightFor(BasicBlock *BB) {
    118   return UINT32_MAX / BB->getTerminator()->getNumSuccessors();
    119 }
    120 
    121 
    122 /// \brief Calculate edge weights for successors lead to unreachable.
    123 ///
    124 /// Predict that a successor which leads necessarily to an
    125 /// unreachable-terminated block as extremely unlikely.
    126 bool BranchProbabilityInfo::calcUnreachableHeuristics(BasicBlock *BB) {
    127   TerminatorInst *TI = BB->getTerminator();
    128   if (TI->getNumSuccessors() == 0) {
    129     if (isa<UnreachableInst>(TI))
    130       PostDominatedByUnreachable.insert(BB);
    131     return false;
    132   }
    133 
    134   SmallVector<unsigned, 4> UnreachableEdges;
    135   SmallVector<unsigned, 4> ReachableEdges;
    136 
    137   for (succ_iterator I = succ_begin(BB), E = succ_end(BB); I != E; ++I) {
    138     if (PostDominatedByUnreachable.count(*I))
    139       UnreachableEdges.push_back(I.getSuccessorIndex());
    140     else
    141       ReachableEdges.push_back(I.getSuccessorIndex());
    142   }
    143 
    144   // If all successors are in the set of blocks post-dominated by unreachable,
    145   // this block is too.
    146   if (UnreachableEdges.size() == TI->getNumSuccessors())
    147     PostDominatedByUnreachable.insert(BB);
    148 
    149   // Skip probabilities if this block has a single successor or if all were
    150   // reachable.
    151   if (TI->getNumSuccessors() == 1 || UnreachableEdges.empty())
    152     return false;
    153 
    154   uint32_t UnreachableWeight =
    155     std::max(UR_TAKEN_WEIGHT / (unsigned)UnreachableEdges.size(), MIN_WEIGHT);
    156   for (SmallVectorImpl<unsigned>::iterator I = UnreachableEdges.begin(),
    157                                            E = UnreachableEdges.end();
    158        I != E; ++I)
    159     setEdgeWeight(BB, *I, UnreachableWeight);
    160 
    161   if (ReachableEdges.empty())
    162     return true;
    163   uint32_t ReachableWeight =
    164     std::max(UR_NONTAKEN_WEIGHT / (unsigned)ReachableEdges.size(),
    165              NORMAL_WEIGHT);
    166   for (SmallVectorImpl<unsigned>::iterator I = ReachableEdges.begin(),
    167                                            E = ReachableEdges.end();
    168        I != E; ++I)
    169     setEdgeWeight(BB, *I, ReachableWeight);
    170 
    171   return true;
    172 }
    173 
    174 // Propagate existing explicit probabilities from either profile data or
    175 // 'expect' intrinsic processing.
    176 bool BranchProbabilityInfo::calcMetadataWeights(BasicBlock *BB) {
    177   TerminatorInst *TI = BB->getTerminator();
    178   if (TI->getNumSuccessors() == 1)
    179     return false;
    180   if (!isa<BranchInst>(TI) && !isa<SwitchInst>(TI))
    181     return false;
    182 
    183   MDNode *WeightsNode = TI->getMetadata(LLVMContext::MD_prof);
    184   if (!WeightsNode)
    185     return false;
    186 
    187   // Ensure there are weights for all of the successors. Note that the first
    188   // operand to the metadata node is a name, not a weight.
    189   if (WeightsNode->getNumOperands() != TI->getNumSuccessors() + 1)
    190     return false;
    191 
    192   // Build up the final weights that will be used in a temporary buffer, but
    193   // don't add them until all weihts are present. Each weight value is clamped
    194   // to [1, getMaxWeightFor(BB)].
    195   uint32_t WeightLimit = getMaxWeightFor(BB);
    196   SmallVector<uint32_t, 2> Weights;
    197   Weights.reserve(TI->getNumSuccessors());
    198   for (unsigned i = 1, e = WeightsNode->getNumOperands(); i != e; ++i) {
    199     ConstantInt *Weight = dyn_cast<ConstantInt>(WeightsNode->getOperand(i));
    200     if (!Weight)
    201       return false;
    202     Weights.push_back(
    203       std::max<uint32_t>(1, Weight->getLimitedValue(WeightLimit)));
    204   }
    205   assert(Weights.size() == TI->getNumSuccessors() && "Checked above");
    206   for (unsigned i = 0, e = TI->getNumSuccessors(); i != e; ++i)
    207     setEdgeWeight(BB, i, Weights[i]);
    208 
    209   return true;
    210 }
    211 
    212 /// \brief Calculate edge weights for edges leading to cold blocks.
    213 ///
    214 /// A cold block is one post-dominated by  a block with a call to a
    215 /// cold function.  Those edges are unlikely to be taken, so we give
    216 /// them relatively low weight.
    217 ///
    218 /// Return true if we could compute the weights for cold edges.
    219 /// Return false, otherwise.
    220 bool BranchProbabilityInfo::calcColdCallHeuristics(BasicBlock *BB) {
    221   TerminatorInst *TI = BB->getTerminator();
    222   if (TI->getNumSuccessors() == 0)
    223     return false;
    224 
    225   // Determine which successors are post-dominated by a cold block.
    226   SmallVector<unsigned, 4> ColdEdges;
    227   SmallVector<unsigned, 4> NormalEdges;
    228   for (succ_iterator I = succ_begin(BB), E = succ_end(BB); I != E; ++I)
    229     if (PostDominatedByColdCall.count(*I))
    230       ColdEdges.push_back(I.getSuccessorIndex());
    231     else
    232       NormalEdges.push_back(I.getSuccessorIndex());
    233 
    234   // If all successors are in the set of blocks post-dominated by cold calls,
    235   // this block is in the set post-dominated by cold calls.
    236   if (ColdEdges.size() == TI->getNumSuccessors())
    237     PostDominatedByColdCall.insert(BB);
    238   else {
    239     // Otherwise, if the block itself contains a cold function, add it to the
    240     // set of blocks postdominated by a cold call.
    241     assert(!PostDominatedByColdCall.count(BB));
    242     for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I)
    243       if (CallInst *CI = dyn_cast<CallInst>(I))
    244         if (CI->hasFnAttr(Attribute::Cold)) {
    245           PostDominatedByColdCall.insert(BB);
    246           break;
    247         }
    248   }
    249 
    250   // Skip probabilities if this block has a single successor.
    251   if (TI->getNumSuccessors() == 1 || ColdEdges.empty())
    252     return false;
    253 
    254   uint32_t ColdWeight =
    255       std::max(CC_TAKEN_WEIGHT / (unsigned) ColdEdges.size(), MIN_WEIGHT);
    256   for (SmallVectorImpl<unsigned>::iterator I = ColdEdges.begin(),
    257                                            E = ColdEdges.end();
    258        I != E; ++I)
    259     setEdgeWeight(BB, *I, ColdWeight);
    260 
    261   if (NormalEdges.empty())
    262     return true;
    263   uint32_t NormalWeight = std::max(
    264       CC_NONTAKEN_WEIGHT / (unsigned) NormalEdges.size(), NORMAL_WEIGHT);
    265   for (SmallVectorImpl<unsigned>::iterator I = NormalEdges.begin(),
    266                                            E = NormalEdges.end();
    267        I != E; ++I)
    268     setEdgeWeight(BB, *I, NormalWeight);
    269 
    270   return true;
    271 }
    272 
    273 // Calculate Edge Weights using "Pointer Heuristics". Predict a comparsion
    274 // between two pointer or pointer and NULL will fail.
    275 bool BranchProbabilityInfo::calcPointerHeuristics(BasicBlock *BB) {
    276   BranchInst * BI = dyn_cast<BranchInst>(BB->getTerminator());
    277   if (!BI || !BI->isConditional())
    278     return false;
    279 
    280   Value *Cond = BI->getCondition();
    281   ICmpInst *CI = dyn_cast<ICmpInst>(Cond);
    282   if (!CI || !CI->isEquality())
    283     return false;
    284 
    285   Value *LHS = CI->getOperand(0);
    286 
    287   if (!LHS->getType()->isPointerTy())
    288     return false;
    289 
    290   assert(CI->getOperand(1)->getType()->isPointerTy());
    291 
    292   // p != 0   ->   isProb = true
    293   // p == 0   ->   isProb = false
    294   // p != q   ->   isProb = true
    295   // p == q   ->   isProb = false;
    296   unsigned TakenIdx = 0, NonTakenIdx = 1;
    297   bool isProb = CI->getPredicate() == ICmpInst::ICMP_NE;
    298   if (!isProb)
    299     std::swap(TakenIdx, NonTakenIdx);
    300 
    301   setEdgeWeight(BB, TakenIdx, PH_TAKEN_WEIGHT);
    302   setEdgeWeight(BB, NonTakenIdx, PH_NONTAKEN_WEIGHT);
    303   return true;
    304 }
    305 
    306 // Calculate Edge Weights using "Loop Branch Heuristics". Predict backedges
    307 // as taken, exiting edges as not-taken.
    308 bool BranchProbabilityInfo::calcLoopBranchHeuristics(BasicBlock *BB) {
    309   Loop *L = LI->getLoopFor(BB);
    310   if (!L)
    311     return false;
    312 
    313   SmallVector<unsigned, 8> BackEdges;
    314   SmallVector<unsigned, 8> ExitingEdges;
    315   SmallVector<unsigned, 8> InEdges; // Edges from header to the loop.
    316 
    317   for (succ_iterator I = succ_begin(BB), E = succ_end(BB); I != E; ++I) {
    318     if (!L->contains(*I))
    319       ExitingEdges.push_back(I.getSuccessorIndex());
    320     else if (L->getHeader() == *I)
    321       BackEdges.push_back(I.getSuccessorIndex());
    322     else
    323       InEdges.push_back(I.getSuccessorIndex());
    324   }
    325 
    326   if (BackEdges.empty() && ExitingEdges.empty())
    327     return false;
    328 
    329   if (uint32_t numBackEdges = BackEdges.size()) {
    330     uint32_t backWeight = LBH_TAKEN_WEIGHT / numBackEdges;
    331     if (backWeight < NORMAL_WEIGHT)
    332       backWeight = NORMAL_WEIGHT;
    333 
    334     for (SmallVectorImpl<unsigned>::iterator EI = BackEdges.begin(),
    335          EE = BackEdges.end(); EI != EE; ++EI) {
    336       setEdgeWeight(BB, *EI, backWeight);
    337     }
    338   }
    339 
    340   if (uint32_t numInEdges = InEdges.size()) {
    341     uint32_t inWeight = LBH_TAKEN_WEIGHT / numInEdges;
    342     if (inWeight < NORMAL_WEIGHT)
    343       inWeight = NORMAL_WEIGHT;
    344 
    345     for (SmallVectorImpl<unsigned>::iterator EI = InEdges.begin(),
    346          EE = InEdges.end(); EI != EE; ++EI) {
    347       setEdgeWeight(BB, *EI, inWeight);
    348     }
    349   }
    350 
    351   if (uint32_t numExitingEdges = ExitingEdges.size()) {
    352     uint32_t exitWeight = LBH_NONTAKEN_WEIGHT / numExitingEdges;
    353     if (exitWeight < MIN_WEIGHT)
    354       exitWeight = MIN_WEIGHT;
    355 
    356     for (SmallVectorImpl<unsigned>::iterator EI = ExitingEdges.begin(),
    357          EE = ExitingEdges.end(); EI != EE; ++EI) {
    358       setEdgeWeight(BB, *EI, exitWeight);
    359     }
    360   }
    361 
    362   return true;
    363 }
    364 
    365 bool BranchProbabilityInfo::calcZeroHeuristics(BasicBlock *BB) {
    366   BranchInst * BI = dyn_cast<BranchInst>(BB->getTerminator());
    367   if (!BI || !BI->isConditional())
    368     return false;
    369 
    370   Value *Cond = BI->getCondition();
    371   ICmpInst *CI = dyn_cast<ICmpInst>(Cond);
    372   if (!CI)
    373     return false;
    374 
    375   Value *RHS = CI->getOperand(1);
    376   ConstantInt *CV = dyn_cast<ConstantInt>(RHS);
    377   if (!CV)
    378     return false;
    379 
    380   bool isProb;
    381   if (CV->isZero()) {
    382     switch (CI->getPredicate()) {
    383     case CmpInst::ICMP_EQ:
    384       // X == 0   ->  Unlikely
    385       isProb = false;
    386       break;
    387     case CmpInst::ICMP_NE:
    388       // X != 0   ->  Likely
    389       isProb = true;
    390       break;
    391     case CmpInst::ICMP_SLT:
    392       // X < 0   ->  Unlikely
    393       isProb = false;
    394       break;
    395     case CmpInst::ICMP_SGT:
    396       // X > 0   ->  Likely
    397       isProb = true;
    398       break;
    399     default:
    400       return false;
    401     }
    402   } else if (CV->isOne() && CI->getPredicate() == CmpInst::ICMP_SLT) {
    403     // InstCombine canonicalizes X <= 0 into X < 1.
    404     // X <= 0   ->  Unlikely
    405     isProb = false;
    406   } else if (CV->isAllOnesValue()) {
    407     switch (CI->getPredicate()) {
    408     case CmpInst::ICMP_EQ:
    409       // X == -1  ->  Unlikely
    410       isProb = false;
    411       break;
    412     case CmpInst::ICMP_NE:
    413       // X != -1  ->  Likely
    414       isProb = true;
    415       break;
    416     case CmpInst::ICMP_SGT:
    417       // InstCombine canonicalizes X >= 0 into X > -1.
    418       // X >= 0   ->  Likely
    419       isProb = true;
    420       break;
    421     default:
    422       return false;
    423     }
    424   } else {
    425     return false;
    426   }
    427 
    428   unsigned TakenIdx = 0, NonTakenIdx = 1;
    429 
    430   if (!isProb)
    431     std::swap(TakenIdx, NonTakenIdx);
    432 
    433   setEdgeWeight(BB, TakenIdx, ZH_TAKEN_WEIGHT);
    434   setEdgeWeight(BB, NonTakenIdx, ZH_NONTAKEN_WEIGHT);
    435 
    436   return true;
    437 }
    438 
    439 bool BranchProbabilityInfo::calcFloatingPointHeuristics(BasicBlock *BB) {
    440   BranchInst *BI = dyn_cast<BranchInst>(BB->getTerminator());
    441   if (!BI || !BI->isConditional())
    442     return false;
    443 
    444   Value *Cond = BI->getCondition();
    445   FCmpInst *FCmp = dyn_cast<FCmpInst>(Cond);
    446   if (!FCmp)
    447     return false;
    448 
    449   bool isProb;
    450   if (FCmp->isEquality()) {
    451     // f1 == f2 -> Unlikely
    452     // f1 != f2 -> Likely
    453     isProb = !FCmp->isTrueWhenEqual();
    454   } else if (FCmp->getPredicate() == FCmpInst::FCMP_ORD) {
    455     // !isnan -> Likely
    456     isProb = true;
    457   } else if (FCmp->getPredicate() == FCmpInst::FCMP_UNO) {
    458     // isnan -> Unlikely
    459     isProb = false;
    460   } else {
    461     return false;
    462   }
    463 
    464   unsigned TakenIdx = 0, NonTakenIdx = 1;
    465 
    466   if (!isProb)
    467     std::swap(TakenIdx, NonTakenIdx);
    468 
    469   setEdgeWeight(BB, TakenIdx, FPH_TAKEN_WEIGHT);
    470   setEdgeWeight(BB, NonTakenIdx, FPH_NONTAKEN_WEIGHT);
    471 
    472   return true;
    473 }
    474 
    475 bool BranchProbabilityInfo::calcInvokeHeuristics(BasicBlock *BB) {
    476   InvokeInst *II = dyn_cast<InvokeInst>(BB->getTerminator());
    477   if (!II)
    478     return false;
    479 
    480   setEdgeWeight(BB, 0/*Index for Normal*/, IH_TAKEN_WEIGHT);
    481   setEdgeWeight(BB, 1/*Index for Unwind*/, IH_NONTAKEN_WEIGHT);
    482   return true;
    483 }
    484 
    485 void BranchProbabilityInfo::getAnalysisUsage(AnalysisUsage &AU) const {
    486   AU.addRequired<LoopInfo>();
    487   AU.setPreservesAll();
    488 }
    489 
    490 bool BranchProbabilityInfo::runOnFunction(Function &F) {
    491   DEBUG(dbgs() << "---- Branch Probability Info : " << F.getName()
    492                << " ----\n\n");
    493   LastF = &F; // Store the last function we ran on for printing.
    494   LI = &getAnalysis<LoopInfo>();
    495   assert(PostDominatedByUnreachable.empty());
    496   assert(PostDominatedByColdCall.empty());
    497 
    498   // Walk the basic blocks in post-order so that we can build up state about
    499   // the successors of a block iteratively.
    500   for (po_iterator<BasicBlock *> I = po_begin(&F.getEntryBlock()),
    501                                  E = po_end(&F.getEntryBlock());
    502        I != E; ++I) {
    503     DEBUG(dbgs() << "Computing probabilities for " << I->getName() << "\n");
    504     if (calcUnreachableHeuristics(*I))
    505       continue;
    506     if (calcMetadataWeights(*I))
    507       continue;
    508     if (calcColdCallHeuristics(*I))
    509       continue;
    510     if (calcLoopBranchHeuristics(*I))
    511       continue;
    512     if (calcPointerHeuristics(*I))
    513       continue;
    514     if (calcZeroHeuristics(*I))
    515       continue;
    516     if (calcFloatingPointHeuristics(*I))
    517       continue;
    518     calcInvokeHeuristics(*I);
    519   }
    520 
    521   PostDominatedByUnreachable.clear();
    522   PostDominatedByColdCall.clear();
    523   return false;
    524 }
    525 
    526 void BranchProbabilityInfo::print(raw_ostream &OS, const Module *) const {
    527   OS << "---- Branch Probabilities ----\n";
    528   // We print the probabilities from the last function the analysis ran over,
    529   // or the function it is currently running over.
    530   assert(LastF && "Cannot print prior to running over a function");
    531   for (Function::const_iterator BI = LastF->begin(), BE = LastF->end();
    532        BI != BE; ++BI) {
    533     for (succ_const_iterator SI = succ_begin(BI), SE = succ_end(BI);
    534          SI != SE; ++SI) {
    535       printEdgeProbability(OS << "  ", BI, *SI);
    536     }
    537   }
    538 }
    539 
    540 uint32_t BranchProbabilityInfo::getSumForBlock(const BasicBlock *BB) const {
    541   uint32_t Sum = 0;
    542 
    543   for (succ_const_iterator I = succ_begin(BB), E = succ_end(BB); I != E; ++I) {
    544     uint32_t Weight = getEdgeWeight(BB, I.getSuccessorIndex());
    545     uint32_t PrevSum = Sum;
    546 
    547     Sum += Weight;
    548     assert(Sum > PrevSum); (void) PrevSum;
    549   }
    550 
    551   return Sum;
    552 }
    553 
    554 bool BranchProbabilityInfo::
    555 isEdgeHot(const BasicBlock *Src, const BasicBlock *Dst) const {
    556   // Hot probability is at least 4/5 = 80%
    557   // FIXME: Compare against a static "hot" BranchProbability.
    558   return getEdgeProbability(Src, Dst) > BranchProbability(4, 5);
    559 }
    560 
    561 BasicBlock *BranchProbabilityInfo::getHotSucc(BasicBlock *BB) const {
    562   uint32_t Sum = 0;
    563   uint32_t MaxWeight = 0;
    564   BasicBlock *MaxSucc = nullptr;
    565 
    566   for (succ_iterator I = succ_begin(BB), E = succ_end(BB); I != E; ++I) {
    567     BasicBlock *Succ = *I;
    568     uint32_t Weight = getEdgeWeight(BB, Succ);
    569     uint32_t PrevSum = Sum;
    570 
    571     Sum += Weight;
    572     assert(Sum > PrevSum); (void) PrevSum;
    573 
    574     if (Weight > MaxWeight) {
    575       MaxWeight = Weight;
    576       MaxSucc = Succ;
    577     }
    578   }
    579 
    580   // Hot probability is at least 4/5 = 80%
    581   if (BranchProbability(MaxWeight, Sum) > BranchProbability(4, 5))
    582     return MaxSucc;
    583 
    584   return nullptr;
    585 }
    586 
    587 /// Get the raw edge weight for the edge. If can't find it, return
    588 /// DEFAULT_WEIGHT value. Here an edge is specified using PredBlock and an index
    589 /// to the successors.
    590 uint32_t BranchProbabilityInfo::
    591 getEdgeWeight(const BasicBlock *Src, unsigned IndexInSuccessors) const {
    592   DenseMap<Edge, uint32_t>::const_iterator I =
    593       Weights.find(std::make_pair(Src, IndexInSuccessors));
    594 
    595   if (I != Weights.end())
    596     return I->second;
    597 
    598   return DEFAULT_WEIGHT;
    599 }
    600 
    601 uint32_t BranchProbabilityInfo::getEdgeWeight(const BasicBlock *Src,
    602                                               succ_const_iterator Dst) const {
    603   return getEdgeWeight(Src, Dst.getSuccessorIndex());
    604 }
    605 
    606 /// Get the raw edge weight calculated for the block pair. This returns the sum
    607 /// of all raw edge weights from Src to Dst.
    608 uint32_t BranchProbabilityInfo::
    609 getEdgeWeight(const BasicBlock *Src, const BasicBlock *Dst) const {
    610   uint32_t Weight = 0;
    611   DenseMap<Edge, uint32_t>::const_iterator MapI;
    612   for (succ_const_iterator I = succ_begin(Src), E = succ_end(Src); I != E; ++I)
    613     if (*I == Dst) {
    614       MapI = Weights.find(std::make_pair(Src, I.getSuccessorIndex()));
    615       if (MapI != Weights.end())
    616         Weight += MapI->second;
    617     }
    618   return (Weight == 0) ? DEFAULT_WEIGHT : Weight;
    619 }
    620 
    621 /// Set the edge weight for a given edge specified by PredBlock and an index
    622 /// to the successors.
    623 void BranchProbabilityInfo::
    624 setEdgeWeight(const BasicBlock *Src, unsigned IndexInSuccessors,
    625               uint32_t Weight) {
    626   Weights[std::make_pair(Src, IndexInSuccessors)] = Weight;
    627   DEBUG(dbgs() << "set edge " << Src->getName() << " -> "
    628                << IndexInSuccessors << " successor weight to "
    629                << Weight << "\n");
    630 }
    631 
    632 /// Get an edge's probability, relative to other out-edges from Src.
    633 BranchProbability BranchProbabilityInfo::
    634 getEdgeProbability(const BasicBlock *Src, unsigned IndexInSuccessors) const {
    635   uint32_t N = getEdgeWeight(Src, IndexInSuccessors);
    636   uint32_t D = getSumForBlock(Src);
    637 
    638   return BranchProbability(N, D);
    639 }
    640 
    641 /// Get the probability of going from Src to Dst. It returns the sum of all
    642 /// probabilities for edges from Src to Dst.
    643 BranchProbability BranchProbabilityInfo::
    644 getEdgeProbability(const BasicBlock *Src, const BasicBlock *Dst) const {
    645 
    646   uint32_t N = getEdgeWeight(Src, Dst);
    647   uint32_t D = getSumForBlock(Src);
    648 
    649   return BranchProbability(N, D);
    650 }
    651 
    652 raw_ostream &
    653 BranchProbabilityInfo::printEdgeProbability(raw_ostream &OS,
    654                                             const BasicBlock *Src,
    655                                             const BasicBlock *Dst) const {
    656 
    657   const BranchProbability Prob = getEdgeProbability(Src, Dst);
    658   OS << "edge " << Src->getName() << " -> " << Dst->getName()
    659      << " probability is " << Prob
    660      << (isEdgeHot(Src, Dst) ? " [HOT edge]\n" : "\n");
    661 
    662   return OS;
    663 }
    664