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