LCOV - code coverage report
Current view: top level - lib/Analysis - BranchProbabilityInfo.cpp (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 323 331 97.6 %
Date: 2018-10-20 13:21:21 Functions: 30 31 96.8 %
Legend: Lines: hit not hit

          Line data    Source code
       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/ADT/SCCIterator.h"
      17             : #include "llvm/ADT/STLExtras.h"
      18             : #include "llvm/ADT/SmallVector.h"
      19             : #include "llvm/Analysis/LoopInfo.h"
      20             : #include "llvm/Analysis/TargetLibraryInfo.h"
      21             : #include "llvm/IR/Attributes.h"
      22             : #include "llvm/IR/BasicBlock.h"
      23             : #include "llvm/IR/CFG.h"
      24             : #include "llvm/IR/Constants.h"
      25             : #include "llvm/IR/Dominators.h"
      26             : #include "llvm/IR/Function.h"
      27             : #include "llvm/IR/InstrTypes.h"
      28             : #include "llvm/IR/Instruction.h"
      29             : #include "llvm/IR/Instructions.h"
      30             : #include "llvm/IR/LLVMContext.h"
      31             : #include "llvm/IR/Metadata.h"
      32             : #include "llvm/IR/PassManager.h"
      33             : #include "llvm/IR/Type.h"
      34             : #include "llvm/IR/Value.h"
      35             : #include "llvm/Pass.h"
      36             : #include "llvm/Support/BranchProbability.h"
      37             : #include "llvm/Support/Casting.h"
      38             : #include "llvm/Support/Debug.h"
      39             : #include "llvm/Support/raw_ostream.h"
      40             : #include <cassert>
      41             : #include <cstdint>
      42             : #include <iterator>
      43             : #include <utility>
      44             : 
      45             : using namespace llvm;
      46             : 
      47             : #define DEBUG_TYPE "branch-prob"
      48             : 
      49             : static cl::opt<bool> PrintBranchProb(
      50             :     "print-bpi", cl::init(false), cl::Hidden,
      51             :     cl::desc("Print the branch probability info."));
      52             : 
      53             : cl::opt<std::string> PrintBranchProbFuncName(
      54             :     "print-bpi-func-name", cl::Hidden,
      55             :     cl::desc("The option to specify the name of the function "
      56             :              "whose branch probability info is printed."));
      57             : 
      58       39825 : INITIALIZE_PASS_BEGIN(BranchProbabilityInfoWrapperPass, "branch-prob",
      59             :                       "Branch Probability Analysis", false, true)
      60       39825 : INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass)
      61       39825 : INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass)
      62      251210 : INITIALIZE_PASS_END(BranchProbabilityInfoWrapperPass, "branch-prob",
      63             :                     "Branch Probability Analysis", false, true)
      64             : 
      65             : char BranchProbabilityInfoWrapperPass::ID = 0;
      66             : 
      67             : // Weights are for internal use only. They are used by heuristics to help to
      68             : // estimate edges' probability. Example:
      69             : //
      70             : // Using "Loop Branch Heuristics" we predict weights of edges for the
      71             : // block BB2.
      72             : //         ...
      73             : //          |
      74             : //          V
      75             : //         BB1<-+
      76             : //          |   |
      77             : //          |   | (Weight = 124)
      78             : //          V   |
      79             : //         BB2--+
      80             : //          |
      81             : //          | (Weight = 4)
      82             : //          V
      83             : //         BB3
      84             : //
      85             : // Probability of the edge BB2->BB1 = 124 / (124 + 4) = 0.96875
      86             : // Probability of the edge BB2->BB3 = 4 / (124 + 4) = 0.03125
      87             : static const uint32_t LBH_TAKEN_WEIGHT = 124;
      88             : static const uint32_t LBH_NONTAKEN_WEIGHT = 4;
      89             : // Unlikely edges within a loop are half as likely as other edges
      90             : static const uint32_t LBH_UNLIKELY_WEIGHT = 62;
      91             : 
      92             : /// Unreachable-terminating branch taken probability.
      93             : ///
      94             : /// This is the probability for a branch being taken to a block that terminates
      95             : /// (eventually) in unreachable. These are predicted as unlikely as possible.
      96             : /// All reachable probability will equally share the remaining part.
      97             : static const BranchProbability UR_TAKEN_PROB = BranchProbability::getRaw(1);
      98             : 
      99             : /// Weight for a branch taken going into a cold block.
     100             : ///
     101             : /// This is the weight for a branch taken toward a block marked
     102             : /// cold.  A block is marked cold if it's postdominated by a
     103             : /// block containing a call to a cold function.  Cold functions
     104             : /// are those marked with attribute 'cold'.
     105             : static const uint32_t CC_TAKEN_WEIGHT = 4;
     106             : 
     107             : /// Weight for a branch not-taken into a cold block.
     108             : ///
     109             : /// This is the weight for a branch not taken toward a block marked
     110             : /// cold.
     111             : static const uint32_t CC_NONTAKEN_WEIGHT = 64;
     112             : 
     113             : static const uint32_t PH_TAKEN_WEIGHT = 20;
     114             : static const uint32_t PH_NONTAKEN_WEIGHT = 12;
     115             : 
     116             : static const uint32_t ZH_TAKEN_WEIGHT = 20;
     117             : static const uint32_t ZH_NONTAKEN_WEIGHT = 12;
     118             : 
     119             : static const uint32_t FPH_TAKEN_WEIGHT = 20;
     120             : static const uint32_t FPH_NONTAKEN_WEIGHT = 12;
     121             : 
     122             : /// Invoke-terminating normal branch taken weight
     123             : ///
     124             : /// This is the weight for branching to the normal destination of an invoke
     125             : /// instruction. We expect this to happen most of the time. Set the weight to an
     126             : /// absurdly high value so that nested loops subsume it.
     127             : static const uint32_t IH_TAKEN_WEIGHT = 1024 * 1024 - 1;
     128             : 
     129             : /// Invoke-terminating normal branch not-taken weight.
     130             : ///
     131             : /// This is the weight for branching to the unwind destination of an invoke
     132             : /// instruction. This is essentially never taken.
     133             : static const uint32_t IH_NONTAKEN_WEIGHT = 1;
     134             : 
     135             : /// Add \p BB to PostDominatedByUnreachable set if applicable.
     136             : void
     137     2226272 : BranchProbabilityInfo::updatePostDominatedByUnreachable(const BasicBlock *BB) {
     138     2226272 :   const Instruction *TI = BB->getTerminator();
     139     2226272 :   if (TI->getNumSuccessors() == 0) {
     140     1619344 :     if (isa<UnreachableInst>(TI) ||
     141             :         // If this block is terminated by a call to
     142             :         // @llvm.experimental.deoptimize then treat it like an unreachable since
     143             :         // the @llvm.experimental.deoptimize call is expected to practically
     144             :         // never execute.
     145      723145 :         BB->getTerminatingDeoptimizeCall())
     146      173059 :       PostDominatedByUnreachable.insert(BB);
     147      896199 :     return;
     148             :   }
     149             : 
     150             :   // If the terminator is an InvokeInst, check only the normal destination block
     151             :   // as the unwind edge of InvokeInst is also very unlikely taken.
     152             :   if (auto *II = dyn_cast<InvokeInst>(TI)) {
     153      635438 :     if (PostDominatedByUnreachable.count(II->getNormalDest()))
     154       19293 :       PostDominatedByUnreachable.insert(BB);
     155      317719 :     return;
     156             :   }
     157             : 
     158     2103876 :   for (auto *I : successors(BB))
     159             :     // If any of successor is not post dominated then BB is also not.
     160     1041867 :     if (!PostDominatedByUnreachable.count(I))
     161             :       return;
     162             : 
     163       49654 :   PostDominatedByUnreachable.insert(BB);
     164             : }
     165             : 
     166             : /// Add \p BB to PostDominatedByColdCall set if applicable.
     167             : void
     168     2226272 : BranchProbabilityInfo::updatePostDominatedByColdCall(const BasicBlock *BB) {
     169             :   assert(!PostDominatedByColdCall.count(BB));
     170     2226272 :   const Instruction *TI = BB->getTerminator();
     171     2226272 :   if (TI->getNumSuccessors() == 0)
     172             :     return;
     173             : 
     174             :   // If all of successor are post dominated then BB is also done.
     175     1330074 :   if (llvm::all_of(successors(BB), [&](const BasicBlock *SuccBB) {
     176           0 :         return PostDominatedByColdCall.count(SuccBB);
     177             :       })) {
     178         102 :     PostDominatedByColdCall.insert(BB);
     179         102 :     return;
     180             :   }
     181             : 
     182             :   // If the terminator is an InvokeInst, check only the normal destination
     183             :   // block as the unwind edge of InvokeInst is also very unlikely taken.
     184             :   if (auto *II = dyn_cast<InvokeInst>(TI))
     185      635432 :     if (PostDominatedByColdCall.count(II->getNormalDest())) {
     186         492 :       PostDominatedByColdCall.insert(BB);
     187         492 :       return;
     188             :     }
     189             : 
     190             :   // Otherwise, if the block itself contains a cold function, add it to the
     191             :   // set of blocks post-dominated by a cold call.
     192    14668703 :   for (auto &I : *BB)
     193             :     if (const CallInst *CI = dyn_cast<CallInst>(&I))
     194     1578511 :       if (CI->hasFnAttr(Attribute::Cold)) {
     195         335 :         PostDominatedByColdCall.insert(BB);
     196             :         return;
     197             :       }
     198             : }
     199             : 
     200             : /// Calculate edge weights for successors lead to unreachable.
     201             : ///
     202             : /// Predict that a successor which leads necessarily to an
     203             : /// unreachable-terminated block as extremely unlikely.
     204      415223 : bool BranchProbabilityInfo::calcUnreachableHeuristics(const BasicBlock *BB) {
     205             :   const Instruction *TI = BB->getTerminator();
     206             :   (void) TI;
     207             :   assert(TI->getNumSuccessors() > 1 && "expected more than one successor!");
     208             :   assert(!isa<InvokeInst>(TI) &&
     209             :          "Invokes should have already been handled by calcInvokeHeuristics");
     210             : 
     211             :   SmallVector<unsigned, 4> UnreachableEdges;
     212             :   SmallVector<unsigned, 4> ReachableEdges;
     213             : 
     214     1273808 :   for (succ_const_iterator I = succ_begin(BB), E = succ_end(BB); I != E; ++I)
     215      858585 :     if (PostDominatedByUnreachable.count(*I))
     216       45916 :       UnreachableEdges.push_back(I.getSuccessorIndex());
     217             :     else
     218      812669 :       ReachableEdges.push_back(I.getSuccessorIndex());
     219             : 
     220             :   // Skip probabilities if all were reachable.
     221      415223 :   if (UnreachableEdges.empty())
     222             :     return false;
     223             : 
     224       28510 :   if (ReachableEdges.empty()) {
     225       12559 :     BranchProbability Prob(1, UnreachableEdges.size());
     226       37996 :     for (unsigned SuccIdx : UnreachableEdges)
     227       25437 :       setEdgeProbability(BB, SuccIdx, Prob);
     228             :     return true;
     229             :   }
     230             : 
     231       15951 :   auto UnreachableProb = UR_TAKEN_PROB;
     232             :   auto ReachableProb =
     233             :       (BranchProbability::getOne() - UR_TAKEN_PROB * UnreachableEdges.size()) /
     234       15951 :       ReachableEdges.size();
     235             : 
     236       36430 :   for (unsigned SuccIdx : UnreachableEdges)
     237       20479 :     setEdgeProbability(BB, SuccIdx, UnreachableProb);
     238       33830 :   for (unsigned SuccIdx : ReachableEdges)
     239       17879 :     setEdgeProbability(BB, SuccIdx, ReachableProb);
     240             : 
     241             :   return true;
     242             : }
     243             : 
     244             : // Propagate existing explicit probabilities from either profile data or
     245             : // 'expect' intrinsic processing. Examine metadata against unreachable
     246             : // heuristic. The probability of the edge coming to unreachable block is
     247             : // set to min of metadata and unreachable heuristic.
     248      755782 : bool BranchProbabilityInfo::calcMetadataWeights(const BasicBlock *BB) {
     249      755782 :   const Instruction *TI = BB->getTerminator();
     250             :   assert(TI->getNumSuccessors() > 1 && "expected more than one successor!");
     251      755782 :   if (!(isa<BranchInst>(TI) || isa<SwitchInst>(TI) || isa<IndirectBrInst>(TI)))
     252             :     return false;
     253             : 
     254             :   MDNode *WeightsNode = TI->getMetadata(LLVMContext::MD_prof);
     255      389506 :   if (!WeightsNode)
     256      415115 :     return false;
     257             : 
     258             :   // Check that the number of successors is manageable.
     259             :   assert(TI->getNumSuccessors() < UINT32_MAX && "Too many successors");
     260             : 
     261             :   // Ensure there are weights for all of the successors. Note that the first
     262             :   // operand to the metadata node is a name, not a weight.
     263       22848 :   if (WeightsNode->getNumOperands() != TI->getNumSuccessors() + 1)
     264             :     return false;
     265             : 
     266             :   // Build up the final weights that will be used in a temporary buffer.
     267             :   // Compute the sum of all weights to later decide whether they need to
     268             :   // be scaled to fit in 32 bits.
     269             :   uint64_t WeightSum = 0;
     270             :   SmallVector<uint32_t, 2> Weights;
     271             :   SmallVector<unsigned, 2> UnreachableIdxs;
     272             :   SmallVector<unsigned, 2> ReachableIdxs;
     273       22840 :   Weights.reserve(TI->getNumSuccessors());
     274       68966 :   for (unsigned i = 1, e = WeightsNode->getNumOperands(); i != e; ++i) {
     275             :     ConstantInt *Weight =
     276             :         mdconst::dyn_extract<ConstantInt>(WeightsNode->getOperand(i));
     277             :     if (!Weight)
     278             :       return false;
     279             :     assert(Weight->getValue().getActiveBits() <= 32 &&
     280             :            "Too many bits for uint32_t");
     281       46126 :     Weights.push_back(Weight->getZExtValue());
     282       46126 :     WeightSum += Weights.back();
     283       46126 :     if (PostDominatedByUnreachable.count(TI->getSuccessor(i - 1)))
     284       17310 :       UnreachableIdxs.push_back(i - 1);
     285             :     else
     286       28816 :       ReachableIdxs.push_back(i - 1);
     287             :   }
     288             :   assert(Weights.size() == TI->getNumSuccessors() && "Checked above");
     289             : 
     290             :   // If the sum of weights does not fit in 32 bits, scale every weight down
     291             :   // accordingly.
     292             :   uint64_t ScalingFactor =
     293       22840 :       (WeightSum > UINT32_MAX) ? WeightSum / UINT32_MAX + 1 : 1;
     294             : 
     295             :   if (ScalingFactor > 1) {
     296             :     WeightSum = 0;
     297          84 :     for (unsigned i = 0, e = TI->getNumSuccessors(); i != e; ++i) {
     298          65 :       Weights[i] /= ScalingFactor;
     299          65 :       WeightSum += Weights[i];
     300             :     }
     301             :   }
     302             :   assert(WeightSum <= UINT32_MAX &&
     303             :          "Expected weights to scale down to 32 bits");
     304             : 
     305       22840 :   if (WeightSum == 0 || ReachableIdxs.size() == 0) {
     306         489 :     for (unsigned i = 0, e = TI->getNumSuccessors(); i != e; ++i)
     307         658 :       Weights[i] = 1;
     308         160 :     WeightSum = TI->getNumSuccessors();
     309             :   }
     310             : 
     311             :   // Set the probability.
     312             :   SmallVector<BranchProbability, 2> BP;
     313       68966 :   for (unsigned i = 0, e = TI->getNumSuccessors(); i != e; ++i)
     314       92252 :     BP.push_back({ Weights[i], static_cast<uint32_t>(WeightSum) });
     315             : 
     316             :   // Examine the metadata against unreachable heuristic.
     317             :   // If the unreachable heuristic is more strong then we use it for this edge.
     318       45680 :   if (UnreachableIdxs.size() > 0 && ReachableIdxs.size() > 0) {
     319             :     auto ToDistribute = BranchProbability::getZero();
     320       16933 :     auto UnreachableProb = UR_TAKEN_PROB;
     321       33920 :     for (auto i : UnreachableIdxs)
     322       33974 :       if (UnreachableProb < BP[i]) {
     323             :         ToDistribute += BP[i] - UnreachableProb;
     324       16978 :         BP[i] = UnreachableProb;
     325             :       }
     326             : 
     327             :     // If we modified the probability of some edges then we must distribute
     328             :     // the difference between reachable blocks.
     329       16933 :     if (ToDistribute > BranchProbability::getZero()) {
     330       16927 :       BranchProbability PerEdge = ToDistribute / ReachableIdxs.size();
     331       33875 :       for (auto i : ReachableIdxs)
     332       16948 :         BP[i] += PerEdge;
     333             :     }
     334             :   }
     335             : 
     336       68966 :   for (unsigned i = 0, e = TI->getNumSuccessors(); i != e; ++i)
     337       92252 :     setEdgeProbability(BB, i, BP[i]);
     338             : 
     339             :   return true;
     340             : }
     341             : 
     342             : /// Calculate edge weights for edges leading to cold blocks.
     343             : ///
     344             : /// A cold block is one post-dominated by  a block with a call to a
     345             : /// cold function.  Those edges are unlikely to be taken, so we give
     346             : /// them relatively low weight.
     347             : ///
     348             : /// Return true if we could compute the weights for cold edges.
     349             : /// Return false, otherwise.
     350      386713 : bool BranchProbabilityInfo::calcColdCallHeuristics(const BasicBlock *BB) {
     351             :   const Instruction *TI = BB->getTerminator();
     352             :   (void) TI;
     353             :   assert(TI->getNumSuccessors() > 1 && "expected more than one successor!");
     354             :   assert(!isa<InvokeInst>(TI) &&
     355             :          "Invokes should have already been handled by calcInvokeHeuristics");
     356             : 
     357             :   // Determine which successors are post-dominated by a cold block.
     358             :   SmallVector<unsigned, 4> ColdEdges;
     359             :   SmallVector<unsigned, 4> NormalEdges;
     360     1181503 :   for (succ_const_iterator I = succ_begin(BB), E = succ_end(BB); I != E; ++I)
     361      794790 :     if (PostDominatedByColdCall.count(*I))
     362         364 :       ColdEdges.push_back(I.getSuccessorIndex());
     363             :     else
     364      794426 :       NormalEdges.push_back(I.getSuccessorIndex());
     365             : 
     366             :   // Skip probabilities if no cold edges.
     367      386713 :   if (ColdEdges.empty())
     368             :     return false;
     369             : 
     370         322 :   if (NormalEdges.empty()) {
     371          42 :     BranchProbability Prob(1, ColdEdges.size());
     372         126 :     for (unsigned SuccIdx : ColdEdges)
     373          84 :       setEdgeProbability(BB, SuccIdx, Prob);
     374             :     return true;
     375             :   }
     376             : 
     377             :   auto ColdProb = BranchProbability::getBranchProbability(
     378             :       CC_TAKEN_WEIGHT,
     379         280 :       (CC_TAKEN_WEIGHT + CC_NONTAKEN_WEIGHT) * uint64_t(ColdEdges.size()));
     380             :   auto NormalProb = BranchProbability::getBranchProbability(
     381             :       CC_NONTAKEN_WEIGHT,
     382         560 :       (CC_TAKEN_WEIGHT + CC_NONTAKEN_WEIGHT) * uint64_t(NormalEdges.size()));
     383             : 
     384         560 :   for (unsigned SuccIdx : ColdEdges)
     385         280 :     setEdgeProbability(BB, SuccIdx, ColdProb);
     386         560 :   for (unsigned SuccIdx : NormalEdges)
     387         280 :     setEdgeProbability(BB, SuccIdx, NormalProb);
     388             : 
     389             :   return true;
     390             : }
     391             : 
     392             : // Calculate Edge Weights using "Pointer Heuristics". Predict a comparison
     393             : // between two pointer or pointer and NULL will fail.
     394      333811 : bool BranchProbabilityInfo::calcPointerHeuristics(const BasicBlock *BB) {
     395      333811 :   const BranchInst *BI = dyn_cast<BranchInst>(BB->getTerminator());
     396      327947 :   if (!BI || !BI->isConditional())
     397             :     return false;
     398             : 
     399             :   Value *Cond = BI->getCondition();
     400             :   ICmpInst *CI = dyn_cast<ICmpInst>(Cond);
     401      263475 :   if (!CI || !CI->isEquality())
     402             :     return false;
     403             : 
     404             :   Value *LHS = CI->getOperand(0);
     405             : 
     406      451814 :   if (!LHS->getType()->isPointerTy())
     407             :     return false;
     408             : 
     409             :   assert(CI->getOperand(1)->getType()->isPointerTy());
     410             : 
     411             :   // p != 0   ->   isProb = true
     412             :   // p == 0   ->   isProb = false
     413             :   // p != q   ->   isProb = true
     414             :   // p == q   ->   isProb = false;
     415             :   unsigned TakenIdx = 0, NonTakenIdx = 1;
     416             :   bool isProb = CI->getPredicate() == ICmpInst::ICMP_NE;
     417      128640 :   if (!isProb)
     418             :     std::swap(TakenIdx, NonTakenIdx);
     419             : 
     420             :   BranchProbability TakenProb(PH_TAKEN_WEIGHT,
     421      128640 :                               PH_TAKEN_WEIGHT + PH_NONTAKEN_WEIGHT);
     422      128640 :   setEdgeProbability(BB, TakenIdx, TakenProb);
     423      257280 :   setEdgeProbability(BB, NonTakenIdx, TakenProb.getCompl());
     424      128640 :   return true;
     425             : }
     426             : 
     427             : static int getSCCNum(const BasicBlock *BB,
     428             :                      const BranchProbabilityInfo::SccInfo &SccI) {
     429      277159 :   auto SccIt = SccI.SccNums.find(BB);
     430      277159 :   if (SccIt == SccI.SccNums.end())
     431             :     return -1;
     432         839 :   return SccIt->second;
     433             : }
     434             : 
     435             : // Consider any block that is an entry point to the SCC as a header.
     436         839 : static bool isSCCHeader(const BasicBlock *BB, int SccNum,
     437             :                         BranchProbabilityInfo::SccInfo &SccI) {
     438             :   assert(getSCCNum(BB, SccI) == SccNum);
     439             : 
     440             :   // Lazily compute the set of headers for a given SCC and cache the results
     441             :   // in the SccHeaderMap.
     442        1678 :   if (SccI.SccHeaders.size() <= static_cast<unsigned>(SccNum))
     443          56 :     SccI.SccHeaders.resize(SccNum + 1);
     444         839 :   auto &HeaderMap = SccI.SccHeaders[SccNum];
     445             :   bool Inserted;
     446             :   BranchProbabilityInfo::SccHeaderMap::iterator HeaderMapIt;
     447         839 :   std::tie(HeaderMapIt, Inserted) = HeaderMap.insert(std::make_pair(BB, false));
     448         839 :   if (Inserted) {
     449         600 :     bool IsHeader = llvm::any_of(make_range(pred_begin(BB), pred_end(BB)),
     450             :                                  [&](const BasicBlock *Pred) {
     451             :                                    return getSCCNum(Pred, SccI) != SccNum;
     452             :                                  });
     453         600 :     HeaderMapIt->second = IsHeader;
     454         600 :     return IsHeader;
     455             :   } else
     456         239 :     return HeaderMapIt->second;
     457             : }
     458             : 
     459             : // Compute the unlikely successors to the block BB in the loop L, specifically
     460             : // those that are unlikely because this is a loop, and add them to the
     461             : // UnlikelyBlocks set.
     462             : static void
     463      110316 : computeUnlikelySuccessors(const BasicBlock *BB, Loop *L,
     464             :                           SmallPtrSetImpl<const BasicBlock*> &UnlikelyBlocks) {
     465             :   // Sometimes in a loop we have a branch whose condition is made false by
     466             :   // taking it. This is typically something like
     467             :   //  int n = 0;
     468             :   //  while (...) {
     469             :   //    if (++n >= MAX) {
     470             :   //      n = 0;
     471             :   //    }
     472             :   //  }
     473             :   // In this sort of situation taking the branch means that at the very least it
     474             :   // won't be taken again in the next iteration of the loop, so we should
     475             :   // consider it less likely than a typical branch.
     476             :   //
     477             :   // We detect this by looking back through the graph of PHI nodes that sets the
     478             :   // value that the condition depends on, and seeing if we can reach a successor
     479             :   // block which can be determined to make the condition false.
     480             :   //
     481             :   // FIXME: We currently consider unlikely blocks to be half as likely as other
     482             :   // blocks, but if we consider the example above the likelyhood is actually
     483             :   // 1/MAX. We could therefore be more precise in how unlikely we consider
     484             :   // blocks to be, but it would require more careful examination of the form
     485             :   // of the comparison expression.
     486      110316 :   const BranchInst *BI = dyn_cast<BranchInst>(BB->getTerminator());
     487      108823 :   if (!BI || !BI->isConditional())
     488       91884 :     return;
     489             : 
     490             :   // Check if the branch is based on an instruction compared with a constant
     491             :   CmpInst *CI = dyn_cast<CmpInst>(BI->getCondition());
     492      185982 :   if (!CI || !isa<Instruction>(CI->getOperand(0)) ||
     493             :       !isa<Constant>(CI->getOperand(1)))
     494             :     return;
     495             : 
     496             :   // Either the instruction must be a PHI, or a chain of operations involving
     497             :   // constants that ends in a PHI which we can then collapse into a single value
     498             :   // if the PHI value is known.
     499             :   Instruction *CmpLHS = dyn_cast<Instruction>(CI->getOperand(0));
     500       59572 :   PHINode *CmpPHI = dyn_cast<PHINode>(CmpLHS);
     501             :   Constant *CmpConst = dyn_cast<Constant>(CI->getOperand(1));
     502             :   // Collect the instructions until we hit a PHI
     503             :   SmallVector<BinaryOperator *, 1> InstChain;
     504       95356 :   while (!CmpPHI && CmpLHS && isa<BinaryOperator>(CmpLHS) &&
     505       19554 :          isa<Constant>(CmpLHS->getOperand(1))) {
     506             :     // Stop if the chain extends outside of the loop
     507       16635 :     if (!L->contains(CmpLHS))
     508             :       return;
     509       16230 :     InstChain.push_back(cast<BinaryOperator>(CmpLHS));
     510             :     CmpLHS = dyn_cast<Instruction>(CmpLHS->getOperand(0));
     511             :     if (CmpLHS)
     512       16161 :       CmpPHI = dyn_cast<PHINode>(CmpLHS);
     513             :   }
     514       77811 :   if (!CmpPHI || !L->contains(CmpPHI))
     515       40735 :     return;
     516             : 
     517             :   // Trace the phi node to find all values that come from successors of BB
     518             :   SmallPtrSet<PHINode*, 8> VisitedInsts;
     519             :   SmallVector<PHINode*, 8> WorkList;
     520       18432 :   WorkList.push_back(CmpPHI);
     521       18432 :   VisitedInsts.insert(CmpPHI);
     522       40576 :   while (!WorkList.empty()) {
     523       22144 :     PHINode *P = WorkList.back();
     524             :     WorkList.pop_back();
     525       69546 :     for (BasicBlock *B : P->blocks()) {
     526             :       // Skip blocks that aren't part of the loop
     527       47402 :       if (!L->contains(B))
     528             :         continue;
     529       31323 :       Value *V = P->getIncomingValueForBlock(B);
     530             :       // If the source is a PHI add it to the work list if we haven't
     531             :       // already visited it.
     532       31323 :       if (PHINode *PN = dyn_cast<PHINode>(V)) {
     533        6487 :         if (VisitedInsts.insert(PN).second)
     534        3712 :           WorkList.push_back(PN);
     535        6487 :         continue;
     536             :       }
     537             :       // If this incoming value is a constant and B is a successor of BB, then
     538             :       // we can constant-evaluate the compare to see if it makes the branch be
     539             :       // taken or not.
     540             :       Constant *CmpLHSConst = dyn_cast<Constant>(V);
     541        5448 :       if (!CmpLHSConst ||
     542        5448 :           std::find(succ_begin(BB), succ_end(BB), B) == succ_end(BB))
     543       24392 :         continue;
     544             :       // First collapse InstChain
     545         465 :       for (Instruction *I : llvm::reverse(InstChain)) {
     546          42 :         CmpLHSConst = ConstantExpr::get(I->getOpcode(), CmpLHSConst,
     547             :                                         cast<Constant>(I->getOperand(1)), true);
     548          21 :         if (!CmpLHSConst)
     549             :           break;
     550             :       }
     551         444 :       if (!CmpLHSConst)
     552             :         continue;
     553             :       // Now constant-evaluate the compare
     554         444 :       Constant *Result = ConstantExpr::getCompare(CI->getPredicate(),
     555             :                                                   CmpLHSConst, CmpConst, true);
     556             :       // If the result means we don't branch to the block then that block is
     557             :       // unlikely.
     558         888 :       if (Result &&
     559         894 :           ((Result->isZeroValue() && B == BI->getSuccessor(0)) ||
     560         752 :            (Result->isOneValue() && B == BI->getSuccessor(1))))
     561          75 :         UnlikelyBlocks.insert(B);
     562             :     }
     563             :   }
     564             : }
     565             : 
     566             : // Calculate Edge Weights using "Loop Branch Heuristics". Predict backedges
     567             : // as taken, exiting edges as not-taken.
     568      386391 : bool BranchProbabilityInfo::calcLoopBranchHeuristics(const BasicBlock *BB,
     569             :                                                      const LoopInfo &LI,
     570             :                                                      SccInfo &SccI) {
     571             :   int SccNum;
     572             :   Loop *L = LI.getLoopFor(BB);
     573      110316 :   if (!L) {
     574             :     SccNum = getSCCNum(BB, SccI);
     575         449 :     if (SccNum < 0)
     576      275626 :       return false;
     577             :   }
     578             : 
     579             :   SmallPtrSet<const BasicBlock*, 8> UnlikelyBlocks;
     580      110765 :   if (L)
     581      110316 :     computeUnlikelySuccessors(BB, L, UnlikelyBlocks);
     582             : 
     583             :   SmallVector<unsigned, 8> BackEdges;
     584             :   SmallVector<unsigned, 8> ExitingEdges;
     585             :   SmallVector<unsigned, 8> InEdges; // Edges from header to the loop.
     586             :   SmallVector<unsigned, 8> UnlikelyEdges;
     587             : 
     588      336137 :   for (succ_const_iterator I = succ_begin(BB), E = succ_end(BB); I != E; ++I) {
     589             :     // Use LoopInfo if we have it, otherwise fall-back to SCC info to catch
     590             :     // irreducible loops.
     591      225372 :     if (L) {
     592      224288 :       if (UnlikelyBlocks.count(*I) != 0)
     593          75 :         UnlikelyEdges.push_back(I.getSuccessorIndex());
     594      224213 :       else if (!L->contains(*I))
     595       53071 :         ExitingEdges.push_back(I.getSuccessorIndex());
     596      171142 :       else if (L->getHeader() == *I)
     597       31914 :         BackEdges.push_back(I.getSuccessorIndex());
     598             :       else
     599      139228 :         InEdges.push_back(I.getSuccessorIndex());
     600             :     } else {
     601        1084 :       if (getSCCNum(*I, SccI) != SccNum)
     602         245 :         ExitingEdges.push_back(I.getSuccessorIndex());
     603         839 :       else if (isSCCHeader(*I, SccNum, SccI))
     604          87 :         BackEdges.push_back(I.getSuccessorIndex());
     605             :       else
     606         752 :         InEdges.push_back(I.getSuccessorIndex());
     607             :     }
     608             :   }
     609             : 
     610      110765 :   if (BackEdges.empty() && ExitingEdges.empty() && UnlikelyEdges.empty())
     611             :     return false;
     612             : 
     613             :   // Collect the sum of probabilities of back-edges/in-edges/exiting-edges, and
     614             :   // normalize them so that they sum up to one.
     615       52580 :   unsigned Denom = (BackEdges.empty() ? 0 : LBH_TAKEN_WEIGHT) +
     616       52580 :                    (InEdges.empty() ? 0 : LBH_TAKEN_WEIGHT) +
     617       52580 :                    (UnlikelyEdges.empty() ? 0 : LBH_UNLIKELY_WEIGHT) +
     618       52580 :                    (ExitingEdges.empty() ? 0 : LBH_NONTAKEN_WEIGHT);
     619             : 
     620       52580 :   if (uint32_t numBackEdges = BackEdges.size()) {
     621       31943 :     BranchProbability TakenProb = BranchProbability(LBH_TAKEN_WEIGHT, Denom);
     622       31943 :     auto Prob = TakenProb / numBackEdges;
     623       63944 :     for (unsigned SuccIdx : BackEdges)
     624       32001 :       setEdgeProbability(BB, SuccIdx, Prob);
     625             :   }
     626             : 
     627       52580 :   if (uint32_t numInEdges = InEdges.size()) {
     628       20990 :     BranchProbability TakenProb = BranchProbability(LBH_TAKEN_WEIGHT, Denom);
     629       20990 :     auto Prob = TakenProb / numInEdges;
     630       42540 :     for (unsigned SuccIdx : InEdges)
     631       21550 :       setEdgeProbability(BB, SuccIdx, Prob);
     632             :   }
     633             : 
     634       52580 :   if (uint32_t numExitingEdges = ExitingEdges.size()) {
     635             :     BranchProbability NotTakenProb = BranchProbability(LBH_NONTAKEN_WEIGHT,
     636       52148 :                                                        Denom);
     637       52148 :     auto Prob = NotTakenProb / numExitingEdges;
     638      105464 :     for (unsigned SuccIdx : ExitingEdges)
     639       53316 :       setEdgeProbability(BB, SuccIdx, Prob);
     640             :   }
     641             : 
     642       52580 :   if (uint32_t numUnlikelyEdges = UnlikelyEdges.size()) {
     643             :     BranchProbability UnlikelyProb = BranchProbability(LBH_UNLIKELY_WEIGHT,
     644          73 :                                                        Denom);
     645          73 :     auto Prob = UnlikelyProb / numUnlikelyEdges;
     646         148 :     for (unsigned SuccIdx : UnlikelyEdges)
     647          75 :       setEdgeProbability(BB, SuccIdx, Prob);
     648             :   }
     649             : 
     650             :   return true;
     651             : }
     652             : 
     653      205171 : bool BranchProbabilityInfo::calcZeroHeuristics(const BasicBlock *BB,
     654             :                                                const TargetLibraryInfo *TLI) {
     655      205171 :   const BranchInst *BI = dyn_cast<BranchInst>(BB->getTerminator());
     656      199307 :   if (!BI || !BI->isConditional())
     657             :     return false;
     658             : 
     659             :   Value *Cond = BI->getCondition();
     660             :   ICmpInst *CI = dyn_cast<ICmpInst>(Cond);
     661             :   if (!CI)
     662             :     return false;
     663             : 
     664             :   Value *RHS = CI->getOperand(1);
     665             :   ConstantInt *CV = dyn_cast<ConstantInt>(RHS);
     666             :   if (!CV)
     667             :     return false;
     668             : 
     669             :   // If the LHS is the result of AND'ing a value with a single bit bitmask,
     670             :   // we don't have information about probabilities.
     671             :   if (Instruction *LHS = dyn_cast<Instruction>(CI->getOperand(0)))
     672       90077 :     if (LHS->getOpcode() == Instruction::And)
     673       19069 :       if (ConstantInt *AndRHS = dyn_cast<ConstantInt>(LHS->getOperand(1)))
     674       17655 :         if (AndRHS->getValue().isPowerOf2())
     675             :           return false;
     676             : 
     677             :   // Check if the LHS is the return value of a library function
     678       83989 :   LibFunc Func = NumLibFuncs;
     679       83989 :   if (TLI)
     680             :     if (CallInst *Call = dyn_cast<CallInst>(CI->getOperand(0)))
     681             :       if (Function *CalledFn = Call->getCalledFunction())
     682        6585 :         TLI->getLibFunc(*CalledFn, Func);
     683             : 
     684             :   bool isProb;
     685       83989 :   if (Func == LibFunc_strcasecmp ||
     686       83616 :       Func == LibFunc_strcmp ||
     687       83613 :       Func == LibFunc_strncasecmp ||
     688       83502 :       Func == LibFunc_strncmp ||
     689             :       Func == LibFunc_memcmp) {
     690             :     // strcmp and similar functions return zero, negative, or positive, if the
     691             :     // first string is equal, less, or greater than the second. We consider it
     692             :     // likely that the strings are not equal, so a comparison with zero is
     693             :     // probably false, but also a comparison with any other number is also
     694             :     // probably false given that what exactly is returned for nonzero values is
     695             :     // not specified. Any kind of comparison other than equality we know
     696             :     // nothing about.
     697         691 :     switch (CI->getPredicate()) {
     698             :     case CmpInst::ICMP_EQ:
     699             :       isProb = false;
     700             :       break;
     701             :     case CmpInst::ICMP_NE:
     702             :       isProb = true;
     703             :       break;
     704             :     default:
     705             :       return false;
     706             :     }
     707       83298 :   } else if (CV->isZero()) {
     708       50463 :     switch (CI->getPredicate()) {
     709             :     case CmpInst::ICMP_EQ:
     710             :       // X == 0   ->  Unlikely
     711             :       isProb = false;
     712             :       break;
     713             :     case CmpInst::ICMP_NE:
     714             :       // X != 0   ->  Likely
     715             :       isProb = true;
     716             :       break;
     717             :     case CmpInst::ICMP_SLT:
     718             :       // X < 0   ->  Unlikely
     719             :       isProb = false;
     720             :       break;
     721             :     case CmpInst::ICMP_SGT:
     722             :       // X > 0   ->  Likely
     723             :       isProb = true;
     724             :       break;
     725             :     default:
     726             :       return false;
     727             :     }
     728       32835 :   } else if (CV->isOne() && CI->getPredicate() == CmpInst::ICMP_SLT) {
     729             :     // InstCombine canonicalizes X <= 0 into X < 1.
     730             :     // X <= 0   ->  Unlikely
     731             :     isProb = false;
     732       32667 :   } else if (CV->isMinusOne()) {
     733        3527 :     switch (CI->getPredicate()) {
     734             :     case CmpInst::ICMP_EQ:
     735             :       // X == -1  ->  Unlikely
     736             :       isProb = false;
     737             :       break;
     738             :     case CmpInst::ICMP_NE:
     739             :       // X != -1  ->  Likely
     740             :       isProb = true;
     741             :       break;
     742             :     case CmpInst::ICMP_SGT:
     743             :       // InstCombine canonicalizes X >= 0 into X > -1.
     744             :       // X >= 0   ->  Likely
     745             :       isProb = true;
     746             :       break;
     747             :     default:
     748             :       return false;
     749             :     }
     750             :   } else {
     751             :     return false;
     752             :   }
     753             : 
     754             :   unsigned TakenIdx = 0, NonTakenIdx = 1;
     755             : 
     756             :   if (!isProb)
     757             :     std::swap(TakenIdx, NonTakenIdx);
     758             : 
     759             :   BranchProbability TakenProb(ZH_TAKEN_WEIGHT,
     760       54522 :                               ZH_TAKEN_WEIGHT + ZH_NONTAKEN_WEIGHT);
     761       54522 :   setEdgeProbability(BB, TakenIdx, TakenProb);
     762      109044 :   setEdgeProbability(BB, NonTakenIdx, TakenProb.getCompl());
     763       54522 :   return true;
     764             : }
     765             : 
     766      150649 : bool BranchProbabilityInfo::calcFloatingPointHeuristics(const BasicBlock *BB) {
     767      150649 :   const BranchInst *BI = dyn_cast<BranchInst>(BB->getTerminator());
     768      144785 :   if (!BI || !BI->isConditional())
     769             :     return false;
     770             : 
     771             :   Value *Cond = BI->getCondition();
     772             :   FCmpInst *FCmp = dyn_cast<FCmpInst>(Cond);
     773             :   if (!FCmp)
     774             :     return false;
     775             : 
     776             :   bool isProb;
     777             :   if (FCmp->isEquality()) {
     778             :     // f1 == f2 -> Unlikely
     779             :     // f1 != f2 -> Likely
     780             :     isProb = !FCmp->isTrueWhenEqual();
     781        2684 :   } else if (FCmp->getPredicate() == FCmpInst::FCMP_ORD) {
     782             :     // !isnan -> Likely
     783             :     isProb = true;
     784        2579 :   } else if (FCmp->getPredicate() == FCmpInst::FCMP_UNO) {
     785             :     // isnan -> Unlikely
     786             :     isProb = false;
     787             :   } else {
     788             :     return false;
     789             :   }
     790             : 
     791             :   unsigned TakenIdx = 0, NonTakenIdx = 1;
     792             : 
     793         511 :   if (!isProb)
     794             :     std::swap(TakenIdx, NonTakenIdx);
     795             : 
     796             :   BranchProbability TakenProb(FPH_TAKEN_WEIGHT,
     797         651 :                               FPH_TAKEN_WEIGHT + FPH_NONTAKEN_WEIGHT);
     798         651 :   setEdgeProbability(BB, TakenIdx, TakenProb);
     799        1302 :   setEdgeProbability(BB, NonTakenIdx, TakenProb.getCompl());
     800         651 :   return true;
     801             : }
     802             : 
     803      732942 : bool BranchProbabilityInfo::calcInvokeHeuristics(const BasicBlock *BB) {
     804      732942 :   const InvokeInst *II = dyn_cast<InvokeInst>(BB->getTerminator());
     805             :   if (!II)
     806             :     return false;
     807             : 
     808             :   BranchProbability TakenProb(IH_TAKEN_WEIGHT,
     809      317719 :                               IH_TAKEN_WEIGHT + IH_NONTAKEN_WEIGHT);
     810      317719 :   setEdgeProbability(BB, 0 /*Index for Normal*/, TakenProb);
     811      635438 :   setEdgeProbability(BB, 1 /*Index for Unwind*/, TakenProb.getCompl());
     812      317719 :   return true;
     813             : }
     814             : 
     815      497604 : void BranchProbabilityInfo::releaseMemory() {
     816      497604 :   Probs.clear();
     817      497604 : }
     818             : 
     819         164 : void BranchProbabilityInfo::print(raw_ostream &OS) const {
     820         164 :   OS << "---- Branch Probabilities ----\n";
     821             :   // We print the probabilities from the last function the analysis ran over,
     822             :   // or the function it is currently running over.
     823             :   assert(LastF && "Cannot print prior to running over a function");
     824         979 :   for (const auto &BI : *LastF) {
     825        1732 :     for (succ_const_iterator SI = succ_begin(&BI), SE = succ_end(&BI); SI != SE;
     826             :          ++SI) {
     827         917 :       printEdgeProbability(OS << "  ", &BI, *SI);
     828             :     }
     829             :   }
     830         164 : }
     831             : 
     832         919 : bool BranchProbabilityInfo::
     833             : isEdgeHot(const BasicBlock *Src, const BasicBlock *Dst) const {
     834             :   // Hot probability is at least 4/5 = 80%
     835             :   // FIXME: Compare against a static "hot" BranchProbability.
     836         919 :   return getEdgeProbability(Src, Dst) > BranchProbability(4, 5);
     837             : }
     838             : 
     839             : const BasicBlock *
     840           0 : BranchProbabilityInfo::getHotSucc(const BasicBlock *BB) const {
     841             :   auto MaxProb = BranchProbability::getZero();
     842             :   const BasicBlock *MaxSucc = nullptr;
     843             : 
     844           0 :   for (succ_const_iterator I = succ_begin(BB), E = succ_end(BB); I != E; ++I) {
     845             :     const BasicBlock *Succ = *I;
     846           0 :     auto Prob = getEdgeProbability(BB, Succ);
     847           0 :     if (Prob > MaxProb) {
     848             :       MaxProb = Prob;
     849             :       MaxSucc = Succ;
     850             :     }
     851             :   }
     852             : 
     853             :   // Hot probability is at least 4/5 = 80%
     854           0 :   if (MaxProb > BranchProbability(4, 5))
     855           0 :     return MaxSucc;
     856             : 
     857             :   return nullptr;
     858             : }
     859             : 
     860             : /// Get the raw edge probability for the edge. If can't find it, return a
     861             : /// default probability 1/N where N is the number of successors. Here an edge is
     862             : /// specified using PredBlock and an
     863             : /// index to the successors.
     864             : BranchProbability
     865     1808997 : BranchProbabilityInfo::getEdgeProbability(const BasicBlock *Src,
     866             :                                           unsigned IndexInSuccessors) const {
     867     1808997 :   auto I = Probs.find(std::make_pair(Src, IndexInSuccessors));
     868             : 
     869     1808997 :   if (I != Probs.end())
     870     1034216 :     return I->second;
     871             : 
     872      774781 :   return {1, static_cast<uint32_t>(succ_size(Src))};
     873             : }
     874             : 
     875             : BranchProbability
     876     1803632 : BranchProbabilityInfo::getEdgeProbability(const BasicBlock *Src,
     877             :                                           succ_const_iterator Dst) const {
     878     1803632 :   return getEdgeProbability(Src, Dst.getSuccessorIndex());
     879             : }
     880             : 
     881             : /// Get the raw edge probability calculated for the block pair. This returns the
     882             : /// sum of all raw edge probabilities from Src to Dst.
     883             : BranchProbability
     884      221921 : BranchProbabilityInfo::getEdgeProbability(const BasicBlock *Src,
     885             :                                           const BasicBlock *Dst) const {
     886             :   auto Prob = BranchProbability::getZero();
     887             :   bool FoundProb = false;
     888      679315 :   for (succ_const_iterator I = succ_begin(Src), E = succ_end(Src); I != E; ++I)
     889      457394 :     if (*I == Dst) {
     890      452458 :       auto MapI = Probs.find(std::make_pair(Src, I.getSuccessorIndex()));
     891      226229 :       if (MapI != Probs.end()) {
     892             :         FoundProb = true;
     893             :         Prob += MapI->second;
     894             :       }
     895             :     }
     896      221921 :   uint32_t succ_num = std::distance(succ_begin(Src), succ_end(Src));
     897      221921 :   return FoundProb ? Prob : BranchProbability(1, succ_num);
     898             : }
     899             : 
     900             : /// Set the edge probability for a given edge specified by PredBlock and an
     901             : /// index to the successors.
     902     1220587 : void BranchProbabilityInfo::setEdgeProbability(const BasicBlock *Src,
     903             :                                                unsigned IndexInSuccessors,
     904             :                                                BranchProbability Prob) {
     905     1220587 :   Probs[std::make_pair(Src, IndexInSuccessors)] = Prob;
     906     1220587 :   Handles.insert(BasicBlockCallbackVH(Src, this));
     907             :   LLVM_DEBUG(dbgs() << "set edge " << Src->getName() << " -> "
     908             :                     << IndexInSuccessors << " successor probability to " << Prob
     909             :                     << "\n");
     910     1220587 : }
     911             : 
     912             : raw_ostream &
     913         917 : BranchProbabilityInfo::printEdgeProbability(raw_ostream &OS,
     914             :                                             const BasicBlock *Src,
     915             :                                             const BasicBlock *Dst) const {
     916         917 :   const BranchProbability Prob = getEdgeProbability(Src, Dst);
     917         917 :   OS << "edge " << Src->getName() << " -> " << Dst->getName()
     918         917 :      << " probability is " << Prob
     919        1343 :      << (isEdgeHot(Src, Dst) ? " [HOT edge]\n" : "\n");
     920             : 
     921         917 :   return OS;
     922             : }
     923             : 
     924       18862 : void BranchProbabilityInfo::eraseBlock(const BasicBlock *BB) {
     925       60044 :   for (auto I = Probs.begin(), E = Probs.end(); I != E; ++I) {
     926       22320 :     auto Key = I->first;
     927       22320 :     if (Key.first == BB)
     928        5732 :       Probs.erase(Key);
     929             :   }
     930       18862 : }
     931             : 
     932      697895 : void BranchProbabilityInfo::calculate(const Function &F, const LoopInfo &LI,
     933             :                                       const TargetLibraryInfo *TLI) {
     934             :   LLVM_DEBUG(dbgs() << "---- Branch Probability Info : " << F.getName()
     935             :                     << " ----\n\n");
     936      697895 :   LastF = &F; // Store the last function we ran on for printing.
     937             :   assert(PostDominatedByUnreachable.empty());
     938             :   assert(PostDominatedByColdCall.empty());
     939             : 
     940             :   // Record SCC numbers of blocks in the CFG to identify irreducible loops.
     941             :   // FIXME: We could only calculate this if the CFG is known to be irreducible
     942             :   // (perhaps cache this info in LoopInfo if we can easily calculate it there?).
     943             :   int SccNum = 0;
     944             :   SccInfo SccI;
     945     2717304 :   for (scc_iterator<const Function *> It = scc_begin(&F); !It.isAtEnd();
     946             :        ++It, ++SccNum) {
     947             :     // Ignore single-block SCCs since they either aren't loops or LoopInfo will
     948             :     // catch them.
     949             :     const std::vector<const BasicBlock *> &Scc = *It;
     950     2019409 :     if (Scc.size() == 1)
     951             :       continue;
     952             : 
     953             :     LLVM_DEBUG(dbgs() << "BPI: SCC " << SccNum << ":");
     954      245258 :     for (auto *BB : Scc) {
     955             :       LLVM_DEBUG(dbgs() << " " << BB->getName());
     956      226061 :       SccI.SccNums[BB] = SccNum;
     957             :     }
     958             :     LLVM_DEBUG(dbgs() << "\n");
     959             :   }
     960             : 
     961             :   // Walk the basic blocks in post-order so that we can build up state about
     962             :   // the successors of a block iteratively.
     963     3622063 :   for (auto BB : post_order(&F.getEntryBlock())) {
     964             :     LLVM_DEBUG(dbgs() << "Computing probabilities for " << BB->getName()
     965             :                       << "\n");
     966     2226273 :     updatePostDominatedByUnreachable(BB);
     967     2226273 :     updatePostDominatedByColdCall(BB);
     968             :     // If there is no at least two successors, no sense to set probability.
     969     2226272 :     if (BB->getTerminator()->getNumSuccessors() < 2)
     970             :       continue;
     971      755782 :     if (calcMetadataWeights(BB))
     972             :       continue;
     973      732942 :     if (calcInvokeHeuristics(BB))
     974             :       continue;
     975      415223 :     if (calcUnreachableHeuristics(BB))
     976             :       continue;
     977      386713 :     if (calcColdCallHeuristics(BB))
     978             :       continue;
     979      386391 :     if (calcLoopBranchHeuristics(BB, LI, SccI))
     980             :       continue;
     981      333811 :     if (calcPointerHeuristics(BB))
     982             :       continue;
     983      205171 :     if (calcZeroHeuristics(BB, TLI))
     984             :       continue;
     985      150649 :     if (calcFloatingPointHeuristics(BB))
     986             :       continue;
     987             :   }
     988             : 
     989      697895 :   PostDominatedByUnreachable.clear();
     990      697895 :   PostDominatedByColdCall.clear();
     991             : 
     992      697895 :   if (PrintBranchProb &&
     993             :       (PrintBranchProbFuncName.empty() ||
     994      697895 :        F.getName().equals(PrintBranchProbFuncName))) {
     995           0 :     print(dbgs());
     996             :   }
     997      697894 : }
     998             : 
     999       51871 : void BranchProbabilityInfoWrapperPass::getAnalysisUsage(
    1000             :     AnalysisUsage &AU) const {
    1001             :   // We require DT so it's available when LI is available. The LI updating code
    1002             :   // asserts that DT is also present so if we don't make sure that we have DT
    1003             :   // here, that assert will trigger.
    1004             :   AU.addRequired<DominatorTreeWrapperPass>();
    1005             :   AU.addRequired<LoopInfoWrapperPass>();
    1006             :   AU.addRequired<TargetLibraryInfoWrapperPass>();
    1007             :   AU.setPreservesAll();
    1008       51871 : }
    1009             : 
    1010      497682 : bool BranchProbabilityInfoWrapperPass::runOnFunction(Function &F) {
    1011      497682 :   const LoopInfo &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
    1012      497682 :   const TargetLibraryInfo &TLI = getAnalysis<TargetLibraryInfoWrapperPass>().getTLI();
    1013      497682 :   BPI.calculate(F, LI, &TLI);
    1014      497681 :   return false;
    1015             : }
    1016             : 
    1017      497604 : void BranchProbabilityInfoWrapperPass::releaseMemory() { BPI.releaseMemory(); }
    1018             : 
    1019          80 : void BranchProbabilityInfoWrapperPass::print(raw_ostream &OS,
    1020             :                                              const Module *) const {
    1021          80 :   BPI.print(OS);
    1022          80 : }
    1023             : 
    1024             : AnalysisKey BranchProbabilityAnalysis::Key;
    1025             : BranchProbabilityInfo
    1026        1089 : BranchProbabilityAnalysis::run(Function &F, FunctionAnalysisManager &AM) {
    1027        1089 :   BranchProbabilityInfo BPI;
    1028        1089 :   BPI.calculate(F, AM.getResult<LoopAnalysis>(F), &AM.getResult<TargetLibraryAnalysis>(F));
    1029        1089 :   return BPI;
    1030             : }
    1031             : 
    1032             : PreservedAnalyses
    1033          52 : BranchProbabilityPrinterPass::run(Function &F, FunctionAnalysisManager &AM) {
    1034          52 :   OS << "Printing analysis results of BPI for function "
    1035          52 :      << "'" << F.getName() << "':"
    1036          52 :      << "\n";
    1037          52 :   AM.getResult<BranchProbabilityAnalysis>(F).print(OS);
    1038          52 :   return PreservedAnalyses::all();
    1039             : }

Generated by: LCOV version 1.13