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