]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/lib/Analysis/BranchProbabilityInfo.cpp
Merge llvm, clang, lld, lldb, compiler-rt and libc++ r303571, and update
[FreeBSD/FreeBSD.git] / contrib / llvm / lib / Analysis / BranchProbabilityInfo.cpp
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 probability.
62 ///
63 /// This is the probability for a branch being taken to a block that terminates
64 /// (eventually) in unreachable. These are predicted as unlikely as possible.
65 /// All reachable probability will equally share the remaining part.
66 static const BranchProbability UR_TAKEN_PROB = BranchProbability::getRaw(1);
67
68 /// \brief Weight for a branch taken going into a cold block.
69 ///
70 /// This is the weight for a branch taken toward a block marked
71 /// cold.  A block is marked cold if it's postdominated by a
72 /// block containing a call to a cold function.  Cold functions
73 /// are those marked with attribute 'cold'.
74 static const uint32_t CC_TAKEN_WEIGHT = 4;
75
76 /// \brief Weight for a branch not-taken into a cold block.
77 ///
78 /// This is the weight for a branch not taken toward a block marked
79 /// cold.
80 static const uint32_t CC_NONTAKEN_WEIGHT = 64;
81
82 static const uint32_t PH_TAKEN_WEIGHT = 20;
83 static const uint32_t PH_NONTAKEN_WEIGHT = 12;
84
85 static const uint32_t ZH_TAKEN_WEIGHT = 20;
86 static const uint32_t ZH_NONTAKEN_WEIGHT = 12;
87
88 static const uint32_t FPH_TAKEN_WEIGHT = 20;
89 static const uint32_t FPH_NONTAKEN_WEIGHT = 12;
90
91 /// \brief Invoke-terminating normal branch taken weight
92 ///
93 /// This is the weight for branching to the normal destination of an invoke
94 /// instruction. We expect this to happen most of the time. Set the weight to an
95 /// absurdly high value so that nested loops subsume it.
96 static const uint32_t IH_TAKEN_WEIGHT = 1024 * 1024 - 1;
97
98 /// \brief Invoke-terminating normal branch not-taken weight.
99 ///
100 /// This is the weight for branching to the unwind destination of an invoke
101 /// instruction. This is essentially never taken.
102 static const uint32_t IH_NONTAKEN_WEIGHT = 1;
103
104 /// \brief Add \p BB to PostDominatedByUnreachable set if applicable.
105 void
106 BranchProbabilityInfo::updatePostDominatedByUnreachable(const BasicBlock *BB) {
107   const TerminatorInst *TI = BB->getTerminator();
108   if (TI->getNumSuccessors() == 0) {
109     if (isa<UnreachableInst>(TI) ||
110         // If this block is terminated by a call to
111         // @llvm.experimental.deoptimize then treat it like an unreachable since
112         // the @llvm.experimental.deoptimize call is expected to practically
113         // never execute.
114         BB->getTerminatingDeoptimizeCall())
115       PostDominatedByUnreachable.insert(BB);
116     return;
117   }
118
119   // If the terminator is an InvokeInst, check only the normal destination block
120   // as the unwind edge of InvokeInst is also very unlikely taken.
121   if (auto *II = dyn_cast<InvokeInst>(TI)) {
122     if (PostDominatedByUnreachable.count(II->getNormalDest()))
123       PostDominatedByUnreachable.insert(BB);
124     return;
125   }
126
127   for (auto *I : successors(BB))
128     // If any of successor is not post dominated then BB is also not.
129     if (!PostDominatedByUnreachable.count(I))
130       return;
131
132   PostDominatedByUnreachable.insert(BB);
133 }
134
135 /// \brief Add \p BB to PostDominatedByColdCall set if applicable.
136 void
137 BranchProbabilityInfo::updatePostDominatedByColdCall(const BasicBlock *BB) {
138   assert(!PostDominatedByColdCall.count(BB));
139   const TerminatorInst *TI = BB->getTerminator();
140   if (TI->getNumSuccessors() == 0)
141     return;
142
143   // If all of successor are post dominated then BB is also done.
144   if (llvm::all_of(successors(BB), [&](const BasicBlock *SuccBB) {
145         return PostDominatedByColdCall.count(SuccBB);
146       })) {
147     PostDominatedByColdCall.insert(BB);
148     return;
149   }
150
151   // If the terminator is an InvokeInst, check only the normal destination
152   // block as the unwind edge of InvokeInst is also very unlikely taken.
153   if (auto *II = dyn_cast<InvokeInst>(TI))
154     if (PostDominatedByColdCall.count(II->getNormalDest())) {
155       PostDominatedByColdCall.insert(BB);
156       return;
157     }
158
159   // Otherwise, if the block itself contains a cold function, add it to the
160   // set of blocks post-dominated by a cold call.
161   for (auto &I : *BB)
162     if (const CallInst *CI = dyn_cast<CallInst>(&I))
163       if (CI->hasFnAttr(Attribute::Cold)) {
164         PostDominatedByColdCall.insert(BB);
165         return;
166       }
167 }
168
169 /// \brief Calculate edge weights for successors lead to unreachable.
170 ///
171 /// Predict that a successor which leads necessarily to an
172 /// unreachable-terminated block as extremely unlikely.
173 bool BranchProbabilityInfo::calcUnreachableHeuristics(const BasicBlock *BB) {
174   const TerminatorInst *TI = BB->getTerminator();
175   assert(TI->getNumSuccessors() > 1 && "expected more than one successor!");
176
177   // Return false here so that edge weights for InvokeInst could be decided
178   // in calcInvokeHeuristics().
179   if (isa<InvokeInst>(TI))
180     return false;
181
182   SmallVector<unsigned, 4> UnreachableEdges;
183   SmallVector<unsigned, 4> ReachableEdges;
184
185   for (succ_const_iterator I = succ_begin(BB), E = succ_end(BB); I != E; ++I)
186     if (PostDominatedByUnreachable.count(*I))
187       UnreachableEdges.push_back(I.getSuccessorIndex());
188     else
189       ReachableEdges.push_back(I.getSuccessorIndex());
190
191   // Skip probabilities if all were reachable.
192   if (UnreachableEdges.empty())
193     return false;
194
195   if (ReachableEdges.empty()) {
196     BranchProbability Prob(1, UnreachableEdges.size());
197     for (unsigned SuccIdx : UnreachableEdges)
198       setEdgeProbability(BB, SuccIdx, Prob);
199     return true;
200   }
201
202   auto UnreachableProb = UR_TAKEN_PROB;
203   auto ReachableProb =
204       (BranchProbability::getOne() - UR_TAKEN_PROB * UnreachableEdges.size()) /
205       ReachableEdges.size();
206
207   for (unsigned SuccIdx : UnreachableEdges)
208     setEdgeProbability(BB, SuccIdx, UnreachableProb);
209   for (unsigned SuccIdx : ReachableEdges)
210     setEdgeProbability(BB, SuccIdx, ReachableProb);
211
212   return true;
213 }
214
215 // Propagate existing explicit probabilities from either profile data or
216 // 'expect' intrinsic processing. Examine metadata against unreachable
217 // heuristic. The probability of the edge coming to unreachable block is
218 // set to min of metadata and unreachable heuristic.
219 bool BranchProbabilityInfo::calcMetadataWeights(const BasicBlock *BB) {
220   const TerminatorInst *TI = BB->getTerminator();
221   assert(TI->getNumSuccessors() > 1 && "expected more than one successor!");
222   if (!isa<BranchInst>(TI) && !isa<SwitchInst>(TI))
223     return false;
224
225   MDNode *WeightsNode = TI->getMetadata(LLVMContext::MD_prof);
226   if (!WeightsNode)
227     return false;
228
229   // Check that the number of successors is manageable.
230   assert(TI->getNumSuccessors() < UINT32_MAX && "Too many successors");
231
232   // Ensure there are weights for all of the successors. Note that the first
233   // operand to the metadata node is a name, not a weight.
234   if (WeightsNode->getNumOperands() != TI->getNumSuccessors() + 1)
235     return false;
236
237   // Build up the final weights that will be used in a temporary buffer.
238   // Compute the sum of all weights to later decide whether they need to
239   // be scaled to fit in 32 bits.
240   uint64_t WeightSum = 0;
241   SmallVector<uint32_t, 2> Weights;
242   SmallVector<unsigned, 2> UnreachableIdxs;
243   SmallVector<unsigned, 2> ReachableIdxs;
244   Weights.reserve(TI->getNumSuccessors());
245   for (unsigned i = 1, e = WeightsNode->getNumOperands(); i != e; ++i) {
246     ConstantInt *Weight =
247         mdconst::dyn_extract<ConstantInt>(WeightsNode->getOperand(i));
248     if (!Weight)
249       return false;
250     assert(Weight->getValue().getActiveBits() <= 32 &&
251            "Too many bits for uint32_t");
252     Weights.push_back(Weight->getZExtValue());
253     WeightSum += Weights.back();
254     if (PostDominatedByUnreachable.count(TI->getSuccessor(i - 1)))
255       UnreachableIdxs.push_back(i - 1);
256     else
257       ReachableIdxs.push_back(i - 1);
258   }
259   assert(Weights.size() == TI->getNumSuccessors() && "Checked above");
260
261   // If the sum of weights does not fit in 32 bits, scale every weight down
262   // accordingly.
263   uint64_t ScalingFactor =
264       (WeightSum > UINT32_MAX) ? WeightSum / UINT32_MAX + 1 : 1;
265
266   if (ScalingFactor > 1) {
267     WeightSum = 0;
268     for (unsigned i = 0, e = TI->getNumSuccessors(); i != e; ++i) {
269       Weights[i] /= ScalingFactor;
270       WeightSum += Weights[i];
271     }
272   }
273   assert(WeightSum <= UINT32_MAX &&
274          "Expected weights to scale down to 32 bits");
275
276   if (WeightSum == 0 || ReachableIdxs.size() == 0) {
277     for (unsigned i = 0, e = TI->getNumSuccessors(); i != e; ++i)
278       Weights[i] = 1;
279     WeightSum = TI->getNumSuccessors();
280   }
281
282   // Set the probability.
283   SmallVector<BranchProbability, 2> BP;
284   for (unsigned i = 0, e = TI->getNumSuccessors(); i != e; ++i)
285     BP.push_back({ Weights[i], static_cast<uint32_t>(WeightSum) });
286
287   // Examine the metadata against unreachable heuristic.
288   // If the unreachable heuristic is more strong then we use it for this edge.
289   if (UnreachableIdxs.size() > 0 && ReachableIdxs.size() > 0) {
290     auto ToDistribute = BranchProbability::getZero();
291     auto UnreachableProb = UR_TAKEN_PROB;
292     for (auto i : UnreachableIdxs)
293       if (UnreachableProb < BP[i]) {
294         ToDistribute += BP[i] - UnreachableProb;
295         BP[i] = UnreachableProb;
296       }
297
298     // If we modified the probability of some edges then we must distribute
299     // the difference between reachable blocks.
300     if (ToDistribute > BranchProbability::getZero()) {
301       BranchProbability PerEdge = ToDistribute / ReachableIdxs.size();
302       for (auto i : ReachableIdxs)
303         BP[i] += PerEdge;
304     }
305   }
306
307   for (unsigned i = 0, e = TI->getNumSuccessors(); i != e; ++i)
308     setEdgeProbability(BB, i, BP[i]);
309
310   return true;
311 }
312
313 /// \brief Calculate edge weights for edges leading to cold blocks.
314 ///
315 /// A cold block is one post-dominated by  a block with a call to a
316 /// cold function.  Those edges are unlikely to be taken, so we give
317 /// them relatively low weight.
318 ///
319 /// Return true if we could compute the weights for cold edges.
320 /// Return false, otherwise.
321 bool BranchProbabilityInfo::calcColdCallHeuristics(const BasicBlock *BB) {
322   const TerminatorInst *TI = BB->getTerminator();
323   assert(TI->getNumSuccessors() > 1 && "expected more than one successor!");
324
325   // Return false here so that edge weights for InvokeInst could be decided
326   // in calcInvokeHeuristics().
327   if (isa<InvokeInst>(TI))
328     return false;
329
330   // Determine which successors are post-dominated by a cold block.
331   SmallVector<unsigned, 4> ColdEdges;
332   SmallVector<unsigned, 4> NormalEdges;
333   for (succ_const_iterator I = succ_begin(BB), E = succ_end(BB); I != E; ++I)
334     if (PostDominatedByColdCall.count(*I))
335       ColdEdges.push_back(I.getSuccessorIndex());
336     else
337       NormalEdges.push_back(I.getSuccessorIndex());
338
339   // Skip probabilities if no cold edges.
340   if (ColdEdges.empty())
341     return false;
342
343   if (NormalEdges.empty()) {
344     BranchProbability Prob(1, ColdEdges.size());
345     for (unsigned SuccIdx : ColdEdges)
346       setEdgeProbability(BB, SuccIdx, Prob);
347     return true;
348   }
349
350   auto ColdProb = BranchProbability::getBranchProbability(
351       CC_TAKEN_WEIGHT,
352       (CC_TAKEN_WEIGHT + CC_NONTAKEN_WEIGHT) * uint64_t(ColdEdges.size()));
353   auto NormalProb = BranchProbability::getBranchProbability(
354       CC_NONTAKEN_WEIGHT,
355       (CC_TAKEN_WEIGHT + CC_NONTAKEN_WEIGHT) * uint64_t(NormalEdges.size()));
356
357   for (unsigned SuccIdx : ColdEdges)
358     setEdgeProbability(BB, SuccIdx, ColdProb);
359   for (unsigned SuccIdx : NormalEdges)
360     setEdgeProbability(BB, SuccIdx, NormalProb);
361
362   return true;
363 }
364
365 // Calculate Edge Weights using "Pointer Heuristics". Predict a comparsion
366 // between two pointer or pointer and NULL will fail.
367 bool BranchProbabilityInfo::calcPointerHeuristics(const BasicBlock *BB) {
368   const BranchInst *BI = dyn_cast<BranchInst>(BB->getTerminator());
369   if (!BI || !BI->isConditional())
370     return false;
371
372   Value *Cond = BI->getCondition();
373   ICmpInst *CI = dyn_cast<ICmpInst>(Cond);
374   if (!CI || !CI->isEquality())
375     return false;
376
377   Value *LHS = CI->getOperand(0);
378
379   if (!LHS->getType()->isPointerTy())
380     return false;
381
382   assert(CI->getOperand(1)->getType()->isPointerTy());
383
384   // p != 0   ->   isProb = true
385   // p == 0   ->   isProb = false
386   // p != q   ->   isProb = true
387   // p == q   ->   isProb = false;
388   unsigned TakenIdx = 0, NonTakenIdx = 1;
389   bool isProb = CI->getPredicate() == ICmpInst::ICMP_NE;
390   if (!isProb)
391     std::swap(TakenIdx, NonTakenIdx);
392
393   BranchProbability TakenProb(PH_TAKEN_WEIGHT,
394                               PH_TAKEN_WEIGHT + PH_NONTAKEN_WEIGHT);
395   setEdgeProbability(BB, TakenIdx, TakenProb);
396   setEdgeProbability(BB, NonTakenIdx, TakenProb.getCompl());
397   return true;
398 }
399
400 // Calculate Edge Weights using "Loop Branch Heuristics". Predict backedges
401 // as taken, exiting edges as not-taken.
402 bool BranchProbabilityInfo::calcLoopBranchHeuristics(const BasicBlock *BB,
403                                                      const LoopInfo &LI) {
404   Loop *L = LI.getLoopFor(BB);
405   if (!L)
406     return false;
407
408   SmallVector<unsigned, 8> BackEdges;
409   SmallVector<unsigned, 8> ExitingEdges;
410   SmallVector<unsigned, 8> InEdges; // Edges from header to the loop.
411
412   for (succ_const_iterator I = succ_begin(BB), E = succ_end(BB); I != E; ++I) {
413     if (!L->contains(*I))
414       ExitingEdges.push_back(I.getSuccessorIndex());
415     else if (L->getHeader() == *I)
416       BackEdges.push_back(I.getSuccessorIndex());
417     else
418       InEdges.push_back(I.getSuccessorIndex());
419   }
420
421   if (BackEdges.empty() && ExitingEdges.empty())
422     return false;
423
424   // Collect the sum of probabilities of back-edges/in-edges/exiting-edges, and
425   // normalize them so that they sum up to one.
426   BranchProbability Probs[] = {BranchProbability::getZero(),
427                                BranchProbability::getZero(),
428                                BranchProbability::getZero()};
429   unsigned Denom = (BackEdges.empty() ? 0 : LBH_TAKEN_WEIGHT) +
430                    (InEdges.empty() ? 0 : LBH_TAKEN_WEIGHT) +
431                    (ExitingEdges.empty() ? 0 : LBH_NONTAKEN_WEIGHT);
432   if (!BackEdges.empty())
433     Probs[0] = BranchProbability(LBH_TAKEN_WEIGHT, Denom);
434   if (!InEdges.empty())
435     Probs[1] = BranchProbability(LBH_TAKEN_WEIGHT, Denom);
436   if (!ExitingEdges.empty())
437     Probs[2] = BranchProbability(LBH_NONTAKEN_WEIGHT, Denom);
438
439   if (uint32_t numBackEdges = BackEdges.size()) {
440     auto Prob = Probs[0] / numBackEdges;
441     for (unsigned SuccIdx : BackEdges)
442       setEdgeProbability(BB, SuccIdx, Prob);
443   }
444
445   if (uint32_t numInEdges = InEdges.size()) {
446     auto Prob = Probs[1] / numInEdges;
447     for (unsigned SuccIdx : InEdges)
448       setEdgeProbability(BB, SuccIdx, Prob);
449   }
450
451   if (uint32_t numExitingEdges = ExitingEdges.size()) {
452     auto Prob = Probs[2] / numExitingEdges;
453     for (unsigned SuccIdx : ExitingEdges)
454       setEdgeProbability(BB, SuccIdx, Prob);
455   }
456
457   return true;
458 }
459
460 bool BranchProbabilityInfo::calcZeroHeuristics(const BasicBlock *BB) {
461   const BranchInst *BI = dyn_cast<BranchInst>(BB->getTerminator());
462   if (!BI || !BI->isConditional())
463     return false;
464
465   Value *Cond = BI->getCondition();
466   ICmpInst *CI = dyn_cast<ICmpInst>(Cond);
467   if (!CI)
468     return false;
469
470   Value *RHS = CI->getOperand(1);
471   ConstantInt *CV = dyn_cast<ConstantInt>(RHS);
472   if (!CV)
473     return false;
474
475   // If the LHS is the result of AND'ing a value with a single bit bitmask,
476   // we don't have information about probabilities.
477   if (Instruction *LHS = dyn_cast<Instruction>(CI->getOperand(0)))
478     if (LHS->getOpcode() == Instruction::And)
479       if (ConstantInt *AndRHS = dyn_cast<ConstantInt>(LHS->getOperand(1)))
480         if (AndRHS->getUniqueInteger().isPowerOf2())
481           return false;
482
483   bool isProb;
484   if (CV->isZero()) {
485     switch (CI->getPredicate()) {
486     case CmpInst::ICMP_EQ:
487       // X == 0   ->  Unlikely
488       isProb = false;
489       break;
490     case CmpInst::ICMP_NE:
491       // X != 0   ->  Likely
492       isProb = true;
493       break;
494     case CmpInst::ICMP_SLT:
495       // X < 0   ->  Unlikely
496       isProb = false;
497       break;
498     case CmpInst::ICMP_SGT:
499       // X > 0   ->  Likely
500       isProb = true;
501       break;
502     default:
503       return false;
504     }
505   } else if (CV->isOne() && CI->getPredicate() == CmpInst::ICMP_SLT) {
506     // InstCombine canonicalizes X <= 0 into X < 1.
507     // X <= 0   ->  Unlikely
508     isProb = false;
509   } else if (CV->isAllOnesValue()) {
510     switch (CI->getPredicate()) {
511     case CmpInst::ICMP_EQ:
512       // X == -1  ->  Unlikely
513       isProb = false;
514       break;
515     case CmpInst::ICMP_NE:
516       // X != -1  ->  Likely
517       isProb = true;
518       break;
519     case CmpInst::ICMP_SGT:
520       // InstCombine canonicalizes X >= 0 into X > -1.
521       // X >= 0   ->  Likely
522       isProb = true;
523       break;
524     default:
525       return false;
526     }
527   } else {
528     return false;
529   }
530
531   unsigned TakenIdx = 0, NonTakenIdx = 1;
532
533   if (!isProb)
534     std::swap(TakenIdx, NonTakenIdx);
535
536   BranchProbability TakenProb(ZH_TAKEN_WEIGHT,
537                               ZH_TAKEN_WEIGHT + ZH_NONTAKEN_WEIGHT);
538   setEdgeProbability(BB, TakenIdx, TakenProb);
539   setEdgeProbability(BB, NonTakenIdx, TakenProb.getCompl());
540   return true;
541 }
542
543 bool BranchProbabilityInfo::calcFloatingPointHeuristics(const BasicBlock *BB) {
544   const BranchInst *BI = dyn_cast<BranchInst>(BB->getTerminator());
545   if (!BI || !BI->isConditional())
546     return false;
547
548   Value *Cond = BI->getCondition();
549   FCmpInst *FCmp = dyn_cast<FCmpInst>(Cond);
550   if (!FCmp)
551     return false;
552
553   bool isProb;
554   if (FCmp->isEquality()) {
555     // f1 == f2 -> Unlikely
556     // f1 != f2 -> Likely
557     isProb = !FCmp->isTrueWhenEqual();
558   } else if (FCmp->getPredicate() == FCmpInst::FCMP_ORD) {
559     // !isnan -> Likely
560     isProb = true;
561   } else if (FCmp->getPredicate() == FCmpInst::FCMP_UNO) {
562     // isnan -> Unlikely
563     isProb = false;
564   } else {
565     return false;
566   }
567
568   unsigned TakenIdx = 0, NonTakenIdx = 1;
569
570   if (!isProb)
571     std::swap(TakenIdx, NonTakenIdx);
572
573   BranchProbability TakenProb(FPH_TAKEN_WEIGHT,
574                               FPH_TAKEN_WEIGHT + FPH_NONTAKEN_WEIGHT);
575   setEdgeProbability(BB, TakenIdx, TakenProb);
576   setEdgeProbability(BB, NonTakenIdx, TakenProb.getCompl());
577   return true;
578 }
579
580 bool BranchProbabilityInfo::calcInvokeHeuristics(const BasicBlock *BB) {
581   const InvokeInst *II = dyn_cast<InvokeInst>(BB->getTerminator());
582   if (!II)
583     return false;
584
585   BranchProbability TakenProb(IH_TAKEN_WEIGHT,
586                               IH_TAKEN_WEIGHT + IH_NONTAKEN_WEIGHT);
587   setEdgeProbability(BB, 0 /*Index for Normal*/, TakenProb);
588   setEdgeProbability(BB, 1 /*Index for Unwind*/, TakenProb.getCompl());
589   return true;
590 }
591
592 void BranchProbabilityInfo::releaseMemory() {
593   Probs.clear();
594 }
595
596 void BranchProbabilityInfo::print(raw_ostream &OS) const {
597   OS << "---- Branch Probabilities ----\n";
598   // We print the probabilities from the last function the analysis ran over,
599   // or the function it is currently running over.
600   assert(LastF && "Cannot print prior to running over a function");
601   for (const auto &BI : *LastF) {
602     for (succ_const_iterator SI = succ_begin(&BI), SE = succ_end(&BI); SI != SE;
603          ++SI) {
604       printEdgeProbability(OS << "  ", &BI, *SI);
605     }
606   }
607 }
608
609 bool BranchProbabilityInfo::
610 isEdgeHot(const BasicBlock *Src, const BasicBlock *Dst) const {
611   // Hot probability is at least 4/5 = 80%
612   // FIXME: Compare against a static "hot" BranchProbability.
613   return getEdgeProbability(Src, Dst) > BranchProbability(4, 5);
614 }
615
616 const BasicBlock *
617 BranchProbabilityInfo::getHotSucc(const BasicBlock *BB) const {
618   auto MaxProb = BranchProbability::getZero();
619   const BasicBlock *MaxSucc = nullptr;
620
621   for (succ_const_iterator I = succ_begin(BB), E = succ_end(BB); I != E; ++I) {
622     const BasicBlock *Succ = *I;
623     auto Prob = getEdgeProbability(BB, Succ);
624     if (Prob > MaxProb) {
625       MaxProb = Prob;
626       MaxSucc = Succ;
627     }
628   }
629
630   // Hot probability is at least 4/5 = 80%
631   if (MaxProb > BranchProbability(4, 5))
632     return MaxSucc;
633
634   return nullptr;
635 }
636
637 /// Get the raw edge probability for the edge. If can't find it, return a
638 /// default probability 1/N where N is the number of successors. Here an edge is
639 /// specified using PredBlock and an
640 /// index to the successors.
641 BranchProbability
642 BranchProbabilityInfo::getEdgeProbability(const BasicBlock *Src,
643                                           unsigned IndexInSuccessors) const {
644   auto I = Probs.find(std::make_pair(Src, IndexInSuccessors));
645
646   if (I != Probs.end())
647     return I->second;
648
649   return {1,
650           static_cast<uint32_t>(std::distance(succ_begin(Src), succ_end(Src)))};
651 }
652
653 BranchProbability
654 BranchProbabilityInfo::getEdgeProbability(const BasicBlock *Src,
655                                           succ_const_iterator Dst) const {
656   return getEdgeProbability(Src, Dst.getSuccessorIndex());
657 }
658
659 /// Get the raw edge probability calculated for the block pair. This returns the
660 /// sum of all raw edge probabilities from Src to Dst.
661 BranchProbability
662 BranchProbabilityInfo::getEdgeProbability(const BasicBlock *Src,
663                                           const BasicBlock *Dst) const {
664   auto Prob = BranchProbability::getZero();
665   bool FoundProb = false;
666   for (succ_const_iterator I = succ_begin(Src), E = succ_end(Src); I != E; ++I)
667     if (*I == Dst) {
668       auto MapI = Probs.find(std::make_pair(Src, I.getSuccessorIndex()));
669       if (MapI != Probs.end()) {
670         FoundProb = true;
671         Prob += MapI->second;
672       }
673     }
674   uint32_t succ_num = std::distance(succ_begin(Src), succ_end(Src));
675   return FoundProb ? Prob : BranchProbability(1, succ_num);
676 }
677
678 /// Set the edge probability for a given edge specified by PredBlock and an
679 /// index to the successors.
680 void BranchProbabilityInfo::setEdgeProbability(const BasicBlock *Src,
681                                                unsigned IndexInSuccessors,
682                                                BranchProbability Prob) {
683   Probs[std::make_pair(Src, IndexInSuccessors)] = Prob;
684   Handles.insert(BasicBlockCallbackVH(Src, this));
685   DEBUG(dbgs() << "set edge " << Src->getName() << " -> " << IndexInSuccessors
686                << " successor probability to " << Prob << "\n");
687 }
688
689 raw_ostream &
690 BranchProbabilityInfo::printEdgeProbability(raw_ostream &OS,
691                                             const BasicBlock *Src,
692                                             const BasicBlock *Dst) const {
693
694   const BranchProbability Prob = getEdgeProbability(Src, Dst);
695   OS << "edge " << Src->getName() << " -> " << Dst->getName()
696      << " probability is " << Prob
697      << (isEdgeHot(Src, Dst) ? " [HOT edge]\n" : "\n");
698
699   return OS;
700 }
701
702 void BranchProbabilityInfo::eraseBlock(const BasicBlock *BB) {
703   for (auto I = Probs.begin(), E = Probs.end(); I != E; ++I) {
704     auto Key = I->first;
705     if (Key.first == BB)
706       Probs.erase(Key);
707   }
708 }
709
710 void BranchProbabilityInfo::calculate(const Function &F, const LoopInfo &LI) {
711   DEBUG(dbgs() << "---- Branch Probability Info : " << F.getName()
712                << " ----\n\n");
713   LastF = &F; // Store the last function we ran on for printing.
714   assert(PostDominatedByUnreachable.empty());
715   assert(PostDominatedByColdCall.empty());
716
717   // Walk the basic blocks in post-order so that we can build up state about
718   // the successors of a block iteratively.
719   for (auto BB : post_order(&F.getEntryBlock())) {
720     DEBUG(dbgs() << "Computing probabilities for " << BB->getName() << "\n");
721     updatePostDominatedByUnreachable(BB);
722     updatePostDominatedByColdCall(BB);
723     // If there is no at least two successors, no sense to set probability.
724     if (BB->getTerminator()->getNumSuccessors() < 2)
725       continue;
726     if (calcMetadataWeights(BB))
727       continue;
728     if (calcUnreachableHeuristics(BB))
729       continue;
730     if (calcColdCallHeuristics(BB))
731       continue;
732     if (calcLoopBranchHeuristics(BB, LI))
733       continue;
734     if (calcPointerHeuristics(BB))
735       continue;
736     if (calcZeroHeuristics(BB))
737       continue;
738     if (calcFloatingPointHeuristics(BB))
739       continue;
740     calcInvokeHeuristics(BB);
741   }
742
743   PostDominatedByUnreachable.clear();
744   PostDominatedByColdCall.clear();
745 }
746
747 void BranchProbabilityInfoWrapperPass::getAnalysisUsage(
748     AnalysisUsage &AU) const {
749   AU.addRequired<LoopInfoWrapperPass>();
750   AU.setPreservesAll();
751 }
752
753 bool BranchProbabilityInfoWrapperPass::runOnFunction(Function &F) {
754   const LoopInfo &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
755   BPI.calculate(F, LI);
756   return false;
757 }
758
759 void BranchProbabilityInfoWrapperPass::releaseMemory() { BPI.releaseMemory(); }
760
761 void BranchProbabilityInfoWrapperPass::print(raw_ostream &OS,
762                                              const Module *) const {
763   BPI.print(OS);
764 }
765
766 AnalysisKey BranchProbabilityAnalysis::Key;
767 BranchProbabilityInfo
768 BranchProbabilityAnalysis::run(Function &F, FunctionAnalysisManager &AM) {
769   BranchProbabilityInfo BPI;
770   BPI.calculate(F, AM.getResult<LoopAnalysis>(F));
771   return BPI;
772 }
773
774 PreservedAnalyses
775 BranchProbabilityPrinterPass::run(Function &F, FunctionAnalysisManager &AM) {
776   OS << "Printing analysis results of BPI for function "
777      << "'" << F.getName() << "':"
778      << "\n";
779   AM.getResult<BranchProbabilityAnalysis>(F).print(OS);
780   return PreservedAnalyses::all();
781 }