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