blob: 98210857c86680ed2262c4553416f7517933b354 [file] [log] [blame]
Bill Wendlinge1c54262012-08-15 12:22:35 +00001//===-- BranchProbabilityInfo.cpp - Branch Probability Analysis -----------===//
Andrew Trick49371f32011-06-04 01:16:30 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// Loops should be simplified before this analysis.
11//
12//===----------------------------------------------------------------------===//
13
Chandler Carruthed0881b2012-12-03 16:50:05 +000014#include "llvm/Analysis/BranchProbabilityInfo.h"
15#include "llvm/ADT/PostOrderIterator.h"
16#include "llvm/Analysis/LoopInfo.h"
Chandler Carruth1305dc32014-03-04 11:45:46 +000017#include "llvm/IR/CFG.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000018#include "llvm/IR/Constants.h"
19#include "llvm/IR/Function.h"
20#include "llvm/IR/Instructions.h"
21#include "llvm/IR/LLVMContext.h"
22#include "llvm/IR/Metadata.h"
Andrew Trick3d4e64b2011-06-11 01:05:22 +000023#include "llvm/Support/Debug.h"
Benjamin Kramer16132e62015-03-23 18:07:13 +000024#include "llvm/Support/raw_ostream.h"
Andrew Trick49371f32011-06-04 01:16:30 +000025
26using namespace llvm;
27
Chandler Carruthf1221bd2014-04-22 02:48:03 +000028#define DEBUG_TYPE "branch-prob"
29
Cong Houab23bfb2015-07-15 22:48:29 +000030INITIALIZE_PASS_BEGIN(BranchProbabilityInfoWrapperPass, "branch-prob",
Andrew Trick49371f32011-06-04 01:16:30 +000031 "Branch Probability Analysis", false, true)
Chandler Carruth4f8f3072015-01-17 14:16:18 +000032INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass)
Cong Houab23bfb2015-07-15 22:48:29 +000033INITIALIZE_PASS_END(BranchProbabilityInfoWrapperPass, "branch-prob",
Andrew Trick49371f32011-06-04 01:16:30 +000034 "Branch Probability Analysis", false, true)
35
Cong Houab23bfb2015-07-15 22:48:29 +000036char BranchProbabilityInfoWrapperPass::ID = 0;
Andrew Trick49371f32011-06-04 01:16:30 +000037
Chandler Carruth7a0094a2011-10-24 01:40:45 +000038// Weights are for internal use only. They are used by heuristics to help to
39// estimate edges' probability. Example:
40//
41// Using "Loop Branch Heuristics" we predict weights of edges for the
42// block BB2.
43// ...
44// |
45// V
46// BB1<-+
47// | |
48// | | (Weight = 124)
49// V |
50// BB2--+
51// |
52// | (Weight = 4)
53// V
54// BB3
55//
56// Probability of the edge BB2->BB1 = 124 / (124 + 4) = 0.96875
57// Probability of the edge BB2->BB3 = 4 / (124 + 4) = 0.03125
58static const uint32_t LBH_TAKEN_WEIGHT = 124;
59static const uint32_t LBH_NONTAKEN_WEIGHT = 4;
Andrew Trick49371f32011-06-04 01:16:30 +000060
Chandler Carruth7111f452011-10-24 12:01:08 +000061/// \brief Unreachable-terminating branch taken weight.
62///
63/// This is the weight for a branch being taken to a block that terminates
64/// (eventually) in unreachable. These are predicted as unlikely as possible.
65static const uint32_t UR_TAKEN_WEIGHT = 1;
66
67/// \brief Unreachable-terminating branch not-taken weight.
68///
69/// This is the weight for a branch not being taken toward a block that
70/// terminates (eventually) in unreachable. Such a branch is essentially never
Chandler Carruthb024aa02011-12-22 09:26:37 +000071/// taken. Set the weight to an absurdly high value so that nested loops don't
72/// easily subsume it.
73static const uint32_t UR_NONTAKEN_WEIGHT = 1024*1024 - 1;
Andrew Trick49371f32011-06-04 01:16:30 +000074
Serguei Katkov2616bbb2017-04-17 04:33:04 +000075/// \brief Returns the branch probability for unreachable edge according to
76/// heuristic.
77///
78/// This is the branch probability being taken to a block that terminates
79/// (eventually) in unreachable. These are predicted as unlikely as possible.
80static BranchProbability getUnreachableProbability(uint64_t UnreachableCount) {
81 assert(UnreachableCount > 0 && "UnreachableCount must be > 0");
82 return BranchProbability::getBranchProbability(
83 UR_TAKEN_WEIGHT,
84 (UR_TAKEN_WEIGHT + UR_NONTAKEN_WEIGHT) * UnreachableCount);
85}
86
87/// \brief Returns the branch probability for reachable edge according to
88/// heuristic.
89///
90/// This is the branch probability not being taken toward a block that
91/// terminates (eventually) in unreachable. Such a branch is essentially never
92/// taken. Set the weight to an absurdly high value so that nested loops don't
93/// easily subsume it.
94static BranchProbability getReachableProbability(uint64_t ReachableCount) {
95 assert(ReachableCount > 0 && "ReachableCount must be > 0");
96 return BranchProbability::getBranchProbability(
97 UR_NONTAKEN_WEIGHT,
98 (UR_TAKEN_WEIGHT + UR_NONTAKEN_WEIGHT) * ReachableCount);
99}
100
Diego Novilloc6399532013-05-24 12:26:52 +0000101/// \brief Weight for a branch taken going into a cold block.
102///
103/// This is the weight for a branch taken toward a block marked
104/// cold. A block is marked cold if it's postdominated by a
105/// block containing a call to a cold function. Cold functions
106/// are those marked with attribute 'cold'.
107static const uint32_t CC_TAKEN_WEIGHT = 4;
108
109/// \brief Weight for a branch not-taken into a cold block.
110///
111/// This is the weight for a branch not taken toward a block marked
112/// cold.
113static const uint32_t CC_NONTAKEN_WEIGHT = 64;
114
Chandler Carruth7a0094a2011-10-24 01:40:45 +0000115static const uint32_t PH_TAKEN_WEIGHT = 20;
116static const uint32_t PH_NONTAKEN_WEIGHT = 12;
Andrew Trick49371f32011-06-04 01:16:30 +0000117
Chandler Carruth7a0094a2011-10-24 01:40:45 +0000118static const uint32_t ZH_TAKEN_WEIGHT = 20;
119static const uint32_t ZH_NONTAKEN_WEIGHT = 12;
Andrew Trick49371f32011-06-04 01:16:30 +0000120
Chandler Carruth7a0094a2011-10-24 01:40:45 +0000121static const uint32_t FPH_TAKEN_WEIGHT = 20;
122static const uint32_t FPH_NONTAKEN_WEIGHT = 12;
Andrew Trick49371f32011-06-04 01:16:30 +0000123
Bill Wendlinge1c54262012-08-15 12:22:35 +0000124/// \brief Invoke-terminating normal branch taken weight
125///
126/// This is the weight for branching to the normal destination of an invoke
127/// instruction. We expect this to happen most of the time. Set the weight to an
128/// absurdly high value so that nested loops subsume it.
129static const uint32_t IH_TAKEN_WEIGHT = 1024 * 1024 - 1;
130
131/// \brief Invoke-terminating normal branch not-taken weight.
132///
133/// This is the weight for branching to the unwind destination of an invoke
134/// instruction. This is essentially never taken.
135static const uint32_t IH_NONTAKEN_WEIGHT = 1;
136
Serguei Katkovecebc3d2017-04-12 05:42:14 +0000137/// \brief Add \p BB to PostDominatedByUnreachable set if applicable.
138void
139BranchProbabilityInfo::updatePostDominatedByUnreachable(const BasicBlock *BB) {
Mehdi Aminia7978772016-04-07 21:59:28 +0000140 const TerminatorInst *TI = BB->getTerminator();
Chandler Carruth7111f452011-10-24 12:01:08 +0000141 if (TI->getNumSuccessors() == 0) {
Sanjoy Das432c1c32016-04-18 19:01:28 +0000142 if (isa<UnreachableInst>(TI) ||
143 // If this block is terminated by a call to
144 // @llvm.experimental.deoptimize then treat it like an unreachable since
145 // the @llvm.experimental.deoptimize call is expected to practically
146 // never execute.
147 BB->getTerminatingDeoptimizeCall())
Chandler Carruth7111f452011-10-24 12:01:08 +0000148 PostDominatedByUnreachable.insert(BB);
Serguei Katkovecebc3d2017-04-12 05:42:14 +0000149 return;
Chandler Carruth7111f452011-10-24 12:01:08 +0000150 }
151
Serguei Katkovecebc3d2017-04-12 05:42:14 +0000152 // If the terminator is an InvokeInst, check only the normal destination block
153 // as the unwind edge of InvokeInst is also very unlikely taken.
154 if (auto *II = dyn_cast<InvokeInst>(TI)) {
155 if (PostDominatedByUnreachable.count(II->getNormalDest()))
156 PostDominatedByUnreachable.insert(BB);
157 return;
158 }
159
160 for (auto *I : successors(BB))
161 // If any of successor is not post dominated then BB is also not.
162 if (!PostDominatedByUnreachable.count(I))
163 return;
164
165 PostDominatedByUnreachable.insert(BB);
166}
167
168/// \brief Add \p BB to PostDominatedByColdCall set if applicable.
169void
170BranchProbabilityInfo::updatePostDominatedByColdCall(const BasicBlock *BB) {
171 assert(!PostDominatedByColdCall.count(BB));
172 const TerminatorInst *TI = BB->getTerminator();
173 if (TI->getNumSuccessors() == 0)
174 return;
175
176 // If all of successor are post dominated then BB is also done.
177 if (llvm::all_of(successors(BB), [&](const BasicBlock *SuccBB) {
178 return PostDominatedByColdCall.count(SuccBB);
179 })) {
180 PostDominatedByColdCall.insert(BB);
181 return;
182 }
183
184 // If the terminator is an InvokeInst, check only the normal destination
185 // block as the unwind edge of InvokeInst is also very unlikely taken.
186 if (auto *II = dyn_cast<InvokeInst>(TI))
187 if (PostDominatedByColdCall.count(II->getNormalDest())) {
188 PostDominatedByColdCall.insert(BB);
189 return;
190 }
191
192 // Otherwise, if the block itself contains a cold function, add it to the
193 // set of blocks post-dominated by a cold call.
194 for (auto &I : *BB)
195 if (const CallInst *CI = dyn_cast<CallInst>(&I))
196 if (CI->hasFnAttr(Attribute::Cold)) {
197 PostDominatedByColdCall.insert(BB);
198 return;
199 }
200}
201
202/// \brief Calculate edge weights for successors lead to unreachable.
203///
204/// Predict that a successor which leads necessarily to an
205/// unreachable-terminated block as extremely unlikely.
206bool BranchProbabilityInfo::calcUnreachableHeuristics(const BasicBlock *BB) {
207 const TerminatorInst *TI = BB->getTerminator();
208 if (TI->getNumSuccessors() == 0)
209 return false;
210
Manman Rencf104462012-08-24 18:14:27 +0000211 SmallVector<unsigned, 4> UnreachableEdges;
212 SmallVector<unsigned, 4> ReachableEdges;
Chandler Carruth7111f452011-10-24 12:01:08 +0000213
Serguei Katkovecebc3d2017-04-12 05:42:14 +0000214 for (succ_const_iterator I = succ_begin(BB), E = succ_end(BB); I != E; ++I)
Chandler Carruth7111f452011-10-24 12:01:08 +0000215 if (PostDominatedByUnreachable.count(*I))
Manman Rencf104462012-08-24 18:14:27 +0000216 UnreachableEdges.push_back(I.getSuccessorIndex());
Chandler Carruth7111f452011-10-24 12:01:08 +0000217 else
Manman Rencf104462012-08-24 18:14:27 +0000218 ReachableEdges.push_back(I.getSuccessorIndex());
Chandler Carruth7111f452011-10-24 12:01:08 +0000219
220 // Skip probabilities if this block has a single successor or if all were
221 // reachable.
222 if (TI->getNumSuccessors() == 1 || UnreachableEdges.empty())
223 return false;
224
Serguei Katkovecebc3d2017-04-12 05:42:14 +0000225 // Return false here so that edge weights for InvokeInst could be decided
226 // in calcInvokeHeuristics().
227 if (isa<InvokeInst>(TI))
228 return false;
Jun Bum Lima23e5f72015-12-21 22:00:51 +0000229
Cong Houe93b8e12015-12-22 18:56:14 +0000230 if (ReachableEdges.empty()) {
231 BranchProbability Prob(1, UnreachableEdges.size());
232 for (unsigned SuccIdx : UnreachableEdges)
233 setEdgeProbability(BB, SuccIdx, Prob);
Chandler Carruth7111f452011-10-24 12:01:08 +0000234 return true;
Cong Houe93b8e12015-12-22 18:56:14 +0000235 }
236
Serguei Katkov2616bbb2017-04-17 04:33:04 +0000237 auto UnreachableProb = getUnreachableProbability(UnreachableEdges.size());
238 auto ReachableProb = getReachableProbability(ReachableEdges.size());
Cong Houe93b8e12015-12-22 18:56:14 +0000239
240 for (unsigned SuccIdx : UnreachableEdges)
241 setEdgeProbability(BB, SuccIdx, UnreachableProb);
242 for (unsigned SuccIdx : ReachableEdges)
243 setEdgeProbability(BB, SuccIdx, ReachableProb);
Chandler Carruth7111f452011-10-24 12:01:08 +0000244
245 return true;
246}
247
Chandler Carruthd27a7a92011-10-19 10:30:30 +0000248// Propagate existing explicit probabilities from either profile data or
Serguei Katkov2616bbb2017-04-17 04:33:04 +0000249// 'expect' intrinsic processing. Examine metadata against unreachable
250// heuristic. The probability of the edge coming to unreachable block is
251// set to min of metadata and unreachable heuristic.
Mehdi Aminia7978772016-04-07 21:59:28 +0000252bool BranchProbabilityInfo::calcMetadataWeights(const BasicBlock *BB) {
253 const TerminatorInst *TI = BB->getTerminator();
Serguei Katkov2616bbb2017-04-17 04:33:04 +0000254 if (TI->getNumSuccessors() <= 1)
Chandler Carruthdeac50c2011-10-19 10:32:19 +0000255 return false;
256 if (!isa<BranchInst>(TI) && !isa<SwitchInst>(TI))
Chandler Carruthd27a7a92011-10-19 10:30:30 +0000257 return false;
258
Duncan P. N. Exon Smithde36e802014-11-11 21:30:22 +0000259 MDNode *WeightsNode = TI->getMetadata(LLVMContext::MD_prof);
Chandler Carruthdeac50c2011-10-19 10:32:19 +0000260 if (!WeightsNode)
Chandler Carruthd27a7a92011-10-19 10:30:30 +0000261 return false;
262
Diego Novillode5b8012015-05-07 17:22:06 +0000263 // Check that the number of successors is manageable.
264 assert(TI->getNumSuccessors() < UINT32_MAX && "Too many successors");
265
Chandler Carruthdeac50c2011-10-19 10:32:19 +0000266 // Ensure there are weights for all of the successors. Note that the first
267 // operand to the metadata node is a name, not a weight.
268 if (WeightsNode->getNumOperands() != TI->getNumSuccessors() + 1)
Chandler Carruthd27a7a92011-10-19 10:30:30 +0000269 return false;
270
Diego Novillode5b8012015-05-07 17:22:06 +0000271 // Build up the final weights that will be used in a temporary buffer.
272 // Compute the sum of all weights to later decide whether they need to
273 // be scaled to fit in 32 bits.
274 uint64_t WeightSum = 0;
Chandler Carruthdeac50c2011-10-19 10:32:19 +0000275 SmallVector<uint32_t, 2> Weights;
Serguei Katkov2616bbb2017-04-17 04:33:04 +0000276 SmallVector<unsigned, 2> UnreachableIdxs;
277 SmallVector<unsigned, 2> ReachableIdxs;
Chandler Carruthdeac50c2011-10-19 10:32:19 +0000278 Weights.reserve(TI->getNumSuccessors());
279 for (unsigned i = 1, e = WeightsNode->getNumOperands(); i != e; ++i) {
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000280 ConstantInt *Weight =
281 mdconst::dyn_extract<ConstantInt>(WeightsNode->getOperand(i));
Chandler Carruthdeac50c2011-10-19 10:32:19 +0000282 if (!Weight)
283 return false;
Diego Novillode5b8012015-05-07 17:22:06 +0000284 assert(Weight->getValue().getActiveBits() <= 32 &&
285 "Too many bits for uint32_t");
286 Weights.push_back(Weight->getZExtValue());
287 WeightSum += Weights.back();
Serguei Katkov2616bbb2017-04-17 04:33:04 +0000288 if (PostDominatedByUnreachable.count(TI->getSuccessor(i - 1)))
289 UnreachableIdxs.push_back(i - 1);
290 else
291 ReachableIdxs.push_back(i - 1);
Chandler Carruthdeac50c2011-10-19 10:32:19 +0000292 }
293 assert(Weights.size() == TI->getNumSuccessors() && "Checked above");
Diego Novillode5b8012015-05-07 17:22:06 +0000294
295 // If the sum of weights does not fit in 32 bits, scale every weight down
296 // accordingly.
297 uint64_t ScalingFactor =
298 (WeightSum > UINT32_MAX) ? WeightSum / UINT32_MAX + 1 : 1;
299
Serguei Katkov2616bbb2017-04-17 04:33:04 +0000300 if (ScalingFactor > 1) {
301 WeightSum = 0;
302 for (unsigned i = 0, e = TI->getNumSuccessors(); i != e; ++i) {
303 Weights[i] /= ScalingFactor;
304 WeightSum += Weights[i];
305 }
Diego Novillode5b8012015-05-07 17:22:06 +0000306 }
Cong Hou6a2c71a2015-12-22 23:45:55 +0000307
Serguei Katkov2616bbb2017-04-17 04:33:04 +0000308 if (WeightSum == 0 || ReachableIdxs.size() == 0) {
Cong Hou6a2c71a2015-12-22 23:45:55 +0000309 for (unsigned i = 0, e = TI->getNumSuccessors(); i != e; ++i)
Serguei Katkov2616bbb2017-04-17 04:33:04 +0000310 Weights[i] = 1;
311 WeightSum = TI->getNumSuccessors();
Cong Hou6a2c71a2015-12-22 23:45:55 +0000312 }
Cong Houe93b8e12015-12-22 18:56:14 +0000313
Serguei Katkov2616bbb2017-04-17 04:33:04 +0000314 // Set the probability.
315 SmallVector<BranchProbability, 2> BP;
316 for (unsigned i = 0, e = TI->getNumSuccessors(); i != e; ++i)
317 BP.push_back({ Weights[i], static_cast<uint32_t>(WeightSum) });
318
319 // Examine the metadata against unreachable heuristic.
320 // If the unreachable heuristic is more strong then we use it for this edge.
321 if (UnreachableIdxs.size() > 0 && ReachableIdxs.size() > 0) {
322 auto ToDistribute = BranchProbability::getZero();
323 auto UnreachableProb = getUnreachableProbability(UnreachableIdxs.size());
324 for (auto i : UnreachableIdxs)
325 if (UnreachableProb < BP[i]) {
326 ToDistribute += BP[i] - UnreachableProb;
327 BP[i] = UnreachableProb;
328 }
329
330 // If we modified the probability of some edges then we must distribute
331 // the difference between reachable blocks.
332 if (ToDistribute > BranchProbability::getZero()) {
333 BranchProbability PerEdge = ToDistribute / ReachableIdxs.size();
334 for (auto i : ReachableIdxs) {
335 BP[i] += PerEdge;
336 ToDistribute -= PerEdge;
337 }
338 // Tail goes to the first reachable edge.
339 BP[ReachableIdxs[0]] += ToDistribute;
340 }
341 }
342
343 for (unsigned i = 0, e = TI->getNumSuccessors(); i != e; ++i)
344 setEdgeProbability(BB, i, BP[i]);
345
Diego Novillode5b8012015-05-07 17:22:06 +0000346 assert(WeightSum <= UINT32_MAX &&
347 "Expected weights to scale down to 32 bits");
Chandler Carruthd27a7a92011-10-19 10:30:30 +0000348
349 return true;
350}
351
Diego Novilloc6399532013-05-24 12:26:52 +0000352/// \brief Calculate edge weights for edges leading to cold blocks.
353///
354/// A cold block is one post-dominated by a block with a call to a
355/// cold function. Those edges are unlikely to be taken, so we give
356/// them relatively low weight.
357///
358/// Return true if we could compute the weights for cold edges.
359/// Return false, otherwise.
Mehdi Aminia7978772016-04-07 21:59:28 +0000360bool BranchProbabilityInfo::calcColdCallHeuristics(const BasicBlock *BB) {
361 const TerminatorInst *TI = BB->getTerminator();
Diego Novilloc6399532013-05-24 12:26:52 +0000362 if (TI->getNumSuccessors() == 0)
363 return false;
364
365 // Determine which successors are post-dominated by a cold block.
366 SmallVector<unsigned, 4> ColdEdges;
Diego Novilloc6399532013-05-24 12:26:52 +0000367 SmallVector<unsigned, 4> NormalEdges;
Mehdi Aminia7978772016-04-07 21:59:28 +0000368 for (succ_const_iterator I = succ_begin(BB), E = succ_end(BB); I != E; ++I)
Diego Novilloc6399532013-05-24 12:26:52 +0000369 if (PostDominatedByColdCall.count(*I))
370 ColdEdges.push_back(I.getSuccessorIndex());
371 else
372 NormalEdges.push_back(I.getSuccessorIndex());
373
Serguei Katkovecebc3d2017-04-12 05:42:14 +0000374 // Return false here so that edge weights for InvokeInst could be decided
375 // in calcInvokeHeuristics().
376 if (isa<InvokeInst>(TI))
Jun Bum Lim38229392016-09-23 17:26:14 +0000377 return false;
Jun Bum Lim38229392016-09-23 17:26:14 +0000378
Diego Novilloc6399532013-05-24 12:26:52 +0000379 // Skip probabilities if this block has a single successor.
380 if (TI->getNumSuccessors() == 1 || ColdEdges.empty())
381 return false;
382
Cong Houe93b8e12015-12-22 18:56:14 +0000383 if (NormalEdges.empty()) {
384 BranchProbability Prob(1, ColdEdges.size());
385 for (unsigned SuccIdx : ColdEdges)
386 setEdgeProbability(BB, SuccIdx, Prob);
Diego Novilloc6399532013-05-24 12:26:52 +0000387 return true;
Cong Houe93b8e12015-12-22 18:56:14 +0000388 }
389
Vedant Kumara4bd1462016-12-17 01:02:08 +0000390 auto ColdProb = BranchProbability::getBranchProbability(
391 CC_TAKEN_WEIGHT,
392 (CC_TAKEN_WEIGHT + CC_NONTAKEN_WEIGHT) * uint64_t(ColdEdges.size()));
393 auto NormalProb = BranchProbability::getBranchProbability(
394 CC_NONTAKEN_WEIGHT,
395 (CC_TAKEN_WEIGHT + CC_NONTAKEN_WEIGHT) * uint64_t(NormalEdges.size()));
Cong Houe93b8e12015-12-22 18:56:14 +0000396
397 for (unsigned SuccIdx : ColdEdges)
398 setEdgeProbability(BB, SuccIdx, ColdProb);
399 for (unsigned SuccIdx : NormalEdges)
400 setEdgeProbability(BB, SuccIdx, NormalProb);
Diego Novilloc6399532013-05-24 12:26:52 +0000401
402 return true;
403}
404
Andrew Trick49371f32011-06-04 01:16:30 +0000405// Calculate Edge Weights using "Pointer Heuristics". Predict a comparsion
406// between two pointer or pointer and NULL will fail.
Mehdi Aminia7978772016-04-07 21:59:28 +0000407bool BranchProbabilityInfo::calcPointerHeuristics(const BasicBlock *BB) {
408 const BranchInst *BI = dyn_cast<BranchInst>(BB->getTerminator());
Andrew Trick49371f32011-06-04 01:16:30 +0000409 if (!BI || !BI->isConditional())
Jakub Staszakd07b2e12011-07-28 21:45:07 +0000410 return false;
Andrew Trick49371f32011-06-04 01:16:30 +0000411
412 Value *Cond = BI->getCondition();
413 ICmpInst *CI = dyn_cast<ICmpInst>(Cond);
Jakub Staszakabb236f2011-07-15 20:51:06 +0000414 if (!CI || !CI->isEquality())
Jakub Staszakd07b2e12011-07-28 21:45:07 +0000415 return false;
Andrew Trick49371f32011-06-04 01:16:30 +0000416
417 Value *LHS = CI->getOperand(0);
Andrew Trick49371f32011-06-04 01:16:30 +0000418
419 if (!LHS->getType()->isPointerTy())
Jakub Staszakd07b2e12011-07-28 21:45:07 +0000420 return false;
Andrew Trick49371f32011-06-04 01:16:30 +0000421
Nick Lewycky75b20532011-06-04 02:07:10 +0000422 assert(CI->getOperand(1)->getType()->isPointerTy());
Andrew Trick49371f32011-06-04 01:16:30 +0000423
Andrew Trick49371f32011-06-04 01:16:30 +0000424 // p != 0 -> isProb = true
425 // p == 0 -> isProb = false
426 // p != q -> isProb = true
427 // p == q -> isProb = false;
Manman Rencf104462012-08-24 18:14:27 +0000428 unsigned TakenIdx = 0, NonTakenIdx = 1;
Jakub Staszakabb236f2011-07-15 20:51:06 +0000429 bool isProb = CI->getPredicate() == ICmpInst::ICMP_NE;
Andrew Trick49371f32011-06-04 01:16:30 +0000430 if (!isProb)
Manman Rencf104462012-08-24 18:14:27 +0000431 std::swap(TakenIdx, NonTakenIdx);
Andrew Trick49371f32011-06-04 01:16:30 +0000432
Cong Houe93b8e12015-12-22 18:56:14 +0000433 BranchProbability TakenProb(PH_TAKEN_WEIGHT,
434 PH_TAKEN_WEIGHT + PH_NONTAKEN_WEIGHT);
435 setEdgeProbability(BB, TakenIdx, TakenProb);
436 setEdgeProbability(BB, NonTakenIdx, TakenProb.getCompl());
Jakub Staszakd07b2e12011-07-28 21:45:07 +0000437 return true;
Andrew Trick49371f32011-06-04 01:16:30 +0000438}
439
440// Calculate Edge Weights using "Loop Branch Heuristics". Predict backedges
441// as taken, exiting edges as not-taken.
Mehdi Aminia7978772016-04-07 21:59:28 +0000442bool BranchProbabilityInfo::calcLoopBranchHeuristics(const BasicBlock *BB,
Cong Houab23bfb2015-07-15 22:48:29 +0000443 const LoopInfo &LI) {
444 Loop *L = LI.getLoopFor(BB);
Andrew Trick49371f32011-06-04 01:16:30 +0000445 if (!L)
Jakub Staszakd07b2e12011-07-28 21:45:07 +0000446 return false;
Andrew Trick49371f32011-06-04 01:16:30 +0000447
Manman Rencf104462012-08-24 18:14:27 +0000448 SmallVector<unsigned, 8> BackEdges;
449 SmallVector<unsigned, 8> ExitingEdges;
450 SmallVector<unsigned, 8> InEdges; // Edges from header to the loop.
Jakub Staszakbcb3c652011-07-28 21:33:46 +0000451
Mehdi Aminia7978772016-04-07 21:59:28 +0000452 for (succ_const_iterator I = succ_begin(BB), E = succ_end(BB); I != E; ++I) {
Chandler Carruth32f46e72011-10-25 09:47:41 +0000453 if (!L->contains(*I))
Manman Rencf104462012-08-24 18:14:27 +0000454 ExitingEdges.push_back(I.getSuccessorIndex());
Chandler Carruth32f46e72011-10-25 09:47:41 +0000455 else if (L->getHeader() == *I)
Manman Rencf104462012-08-24 18:14:27 +0000456 BackEdges.push_back(I.getSuccessorIndex());
Chandler Carruth32f46e72011-10-25 09:47:41 +0000457 else
Manman Rencf104462012-08-24 18:14:27 +0000458 InEdges.push_back(I.getSuccessorIndex());
Andrew Trick49371f32011-06-04 01:16:30 +0000459 }
460
Akira Hatanaka5638b892014-04-14 16:56:19 +0000461 if (BackEdges.empty() && ExitingEdges.empty())
462 return false;
463
Cong Houe93b8e12015-12-22 18:56:14 +0000464 // Collect the sum of probabilities of back-edges/in-edges/exiting-edges, and
465 // normalize them so that they sum up to one.
Benjamin Kramer1d67ac52016-06-17 13:15:10 +0000466 BranchProbability Probs[] = {BranchProbability::getZero(),
467 BranchProbability::getZero(),
468 BranchProbability::getZero()};
Cong Houe93b8e12015-12-22 18:56:14 +0000469 unsigned Denom = (BackEdges.empty() ? 0 : LBH_TAKEN_WEIGHT) +
470 (InEdges.empty() ? 0 : LBH_TAKEN_WEIGHT) +
471 (ExitingEdges.empty() ? 0 : LBH_NONTAKEN_WEIGHT);
472 if (!BackEdges.empty())
473 Probs[0] = BranchProbability(LBH_TAKEN_WEIGHT, Denom);
474 if (!InEdges.empty())
475 Probs[1] = BranchProbability(LBH_TAKEN_WEIGHT, Denom);
476 if (!ExitingEdges.empty())
477 Probs[2] = BranchProbability(LBH_NONTAKEN_WEIGHT, Denom);
Andrew Trick49371f32011-06-04 01:16:30 +0000478
Cong Houe93b8e12015-12-22 18:56:14 +0000479 if (uint32_t numBackEdges = BackEdges.size()) {
480 auto Prob = Probs[0] / numBackEdges;
481 for (unsigned SuccIdx : BackEdges)
482 setEdgeProbability(BB, SuccIdx, Prob);
Andrew Trick49371f32011-06-04 01:16:30 +0000483 }
484
Jakub Staszakbcb3c652011-07-28 21:33:46 +0000485 if (uint32_t numInEdges = InEdges.size()) {
Cong Houe93b8e12015-12-22 18:56:14 +0000486 auto Prob = Probs[1] / numInEdges;
487 for (unsigned SuccIdx : InEdges)
488 setEdgeProbability(BB, SuccIdx, Prob);
Jakub Staszakbcb3c652011-07-28 21:33:46 +0000489 }
490
Chandler Carruth32f46e72011-10-25 09:47:41 +0000491 if (uint32_t numExitingEdges = ExitingEdges.size()) {
Cong Houe93b8e12015-12-22 18:56:14 +0000492 auto Prob = Probs[2] / numExitingEdges;
493 for (unsigned SuccIdx : ExitingEdges)
494 setEdgeProbability(BB, SuccIdx, Prob);
Andrew Trick49371f32011-06-04 01:16:30 +0000495 }
Jakub Staszakd07b2e12011-07-28 21:45:07 +0000496
497 return true;
Andrew Trick49371f32011-06-04 01:16:30 +0000498}
499
Mehdi Aminia7978772016-04-07 21:59:28 +0000500bool BranchProbabilityInfo::calcZeroHeuristics(const BasicBlock *BB) {
501 const BranchInst *BI = dyn_cast<BranchInst>(BB->getTerminator());
Jakub Staszak17af66a2011-07-31 03:27:24 +0000502 if (!BI || !BI->isConditional())
503 return false;
504
505 Value *Cond = BI->getCondition();
506 ICmpInst *CI = dyn_cast<ICmpInst>(Cond);
507 if (!CI)
508 return false;
509
Jakub Staszak17af66a2011-07-31 03:27:24 +0000510 Value *RHS = CI->getOperand(1);
Jakub Staszakbfb1ae22011-07-31 04:47:20 +0000511 ConstantInt *CV = dyn_cast<ConstantInt>(RHS);
Benjamin Kramer0ca1ad02011-09-04 23:53:04 +0000512 if (!CV)
Jakub Staszak17af66a2011-07-31 03:27:24 +0000513 return false;
514
Daniel Jaspera73f3d52015-04-15 06:24:07 +0000515 // If the LHS is the result of AND'ing a value with a single bit bitmask,
516 // we don't have information about probabilities.
517 if (Instruction *LHS = dyn_cast<Instruction>(CI->getOperand(0)))
518 if (LHS->getOpcode() == Instruction::And)
519 if (ConstantInt *AndRHS = dyn_cast<ConstantInt>(LHS->getOperand(1)))
520 if (AndRHS->getUniqueInteger().isPowerOf2())
521 return false;
522
Jakub Staszak17af66a2011-07-31 03:27:24 +0000523 bool isProb;
Benjamin Kramer0ca1ad02011-09-04 23:53:04 +0000524 if (CV->isZero()) {
525 switch (CI->getPredicate()) {
526 case CmpInst::ICMP_EQ:
527 // X == 0 -> Unlikely
528 isProb = false;
529 break;
530 case CmpInst::ICMP_NE:
531 // X != 0 -> Likely
532 isProb = true;
533 break;
534 case CmpInst::ICMP_SLT:
535 // X < 0 -> Unlikely
536 isProb = false;
537 break;
538 case CmpInst::ICMP_SGT:
539 // X > 0 -> Likely
540 isProb = true;
541 break;
542 default:
543 return false;
544 }
545 } else if (CV->isOne() && CI->getPredicate() == CmpInst::ICMP_SLT) {
546 // InstCombine canonicalizes X <= 0 into X < 1.
547 // X <= 0 -> Unlikely
Jakub Staszak17af66a2011-07-31 03:27:24 +0000548 isProb = false;
Hal Finkel4d949302013-11-01 10:58:22 +0000549 } else if (CV->isAllOnesValue()) {
550 switch (CI->getPredicate()) {
551 case CmpInst::ICMP_EQ:
552 // X == -1 -> Unlikely
553 isProb = false;
554 break;
555 case CmpInst::ICMP_NE:
556 // X != -1 -> Likely
557 isProb = true;
558 break;
559 case CmpInst::ICMP_SGT:
560 // InstCombine canonicalizes X >= 0 into X > -1.
561 // X >= 0 -> Likely
562 isProb = true;
563 break;
564 default:
565 return false;
566 }
Benjamin Kramer0ca1ad02011-09-04 23:53:04 +0000567 } else {
Jakub Staszak17af66a2011-07-31 03:27:24 +0000568 return false;
Benjamin Kramer0ca1ad02011-09-04 23:53:04 +0000569 }
Jakub Staszak17af66a2011-07-31 03:27:24 +0000570
Manman Rencf104462012-08-24 18:14:27 +0000571 unsigned TakenIdx = 0, NonTakenIdx = 1;
Jakub Staszak17af66a2011-07-31 03:27:24 +0000572
573 if (!isProb)
Manman Rencf104462012-08-24 18:14:27 +0000574 std::swap(TakenIdx, NonTakenIdx);
Jakub Staszak17af66a2011-07-31 03:27:24 +0000575
Cong Houe93b8e12015-12-22 18:56:14 +0000576 BranchProbability TakenProb(ZH_TAKEN_WEIGHT,
577 ZH_TAKEN_WEIGHT + ZH_NONTAKEN_WEIGHT);
578 setEdgeProbability(BB, TakenIdx, TakenProb);
579 setEdgeProbability(BB, NonTakenIdx, TakenProb.getCompl());
Jakub Staszak17af66a2011-07-31 03:27:24 +0000580 return true;
581}
582
Mehdi Aminia7978772016-04-07 21:59:28 +0000583bool BranchProbabilityInfo::calcFloatingPointHeuristics(const BasicBlock *BB) {
584 const BranchInst *BI = dyn_cast<BranchInst>(BB->getTerminator());
Benjamin Kramer1e731a12011-10-21 20:12:47 +0000585 if (!BI || !BI->isConditional())
586 return false;
587
588 Value *Cond = BI->getCondition();
589 FCmpInst *FCmp = dyn_cast<FCmpInst>(Cond);
Benjamin Kramer606a50a2011-10-21 21:13:47 +0000590 if (!FCmp)
Benjamin Kramer1e731a12011-10-21 20:12:47 +0000591 return false;
592
Benjamin Kramer606a50a2011-10-21 21:13:47 +0000593 bool isProb;
594 if (FCmp->isEquality()) {
595 // f1 == f2 -> Unlikely
596 // f1 != f2 -> Likely
597 isProb = !FCmp->isTrueWhenEqual();
598 } else if (FCmp->getPredicate() == FCmpInst::FCMP_ORD) {
599 // !isnan -> Likely
600 isProb = true;
601 } else if (FCmp->getPredicate() == FCmpInst::FCMP_UNO) {
602 // isnan -> Unlikely
603 isProb = false;
604 } else {
605 return false;
606 }
607
Manman Rencf104462012-08-24 18:14:27 +0000608 unsigned TakenIdx = 0, NonTakenIdx = 1;
Benjamin Kramer1e731a12011-10-21 20:12:47 +0000609
Benjamin Kramer606a50a2011-10-21 21:13:47 +0000610 if (!isProb)
Manman Rencf104462012-08-24 18:14:27 +0000611 std::swap(TakenIdx, NonTakenIdx);
Benjamin Kramer1e731a12011-10-21 20:12:47 +0000612
Cong Houe93b8e12015-12-22 18:56:14 +0000613 BranchProbability TakenProb(FPH_TAKEN_WEIGHT,
614 FPH_TAKEN_WEIGHT + FPH_NONTAKEN_WEIGHT);
615 setEdgeProbability(BB, TakenIdx, TakenProb);
616 setEdgeProbability(BB, NonTakenIdx, TakenProb.getCompl());
Benjamin Kramer1e731a12011-10-21 20:12:47 +0000617 return true;
618}
Jakub Staszak17af66a2011-07-31 03:27:24 +0000619
Mehdi Aminia7978772016-04-07 21:59:28 +0000620bool BranchProbabilityInfo::calcInvokeHeuristics(const BasicBlock *BB) {
621 const InvokeInst *II = dyn_cast<InvokeInst>(BB->getTerminator());
Bill Wendlinge1c54262012-08-15 12:22:35 +0000622 if (!II)
623 return false;
624
Cong Houe93b8e12015-12-22 18:56:14 +0000625 BranchProbability TakenProb(IH_TAKEN_WEIGHT,
626 IH_TAKEN_WEIGHT + IH_NONTAKEN_WEIGHT);
627 setEdgeProbability(BB, 0 /*Index for Normal*/, TakenProb);
628 setEdgeProbability(BB, 1 /*Index for Unwind*/, TakenProb.getCompl());
Bill Wendlinge1c54262012-08-15 12:22:35 +0000629 return true;
630}
631
Pete Cooperb9d2e342015-05-28 19:43:06 +0000632void BranchProbabilityInfo::releaseMemory() {
Cong Houe93b8e12015-12-22 18:56:14 +0000633 Probs.clear();
Pete Cooperb9d2e342015-05-28 19:43:06 +0000634}
635
Cong Houab23bfb2015-07-15 22:48:29 +0000636void BranchProbabilityInfo::print(raw_ostream &OS) const {
Chandler Carruth1c8ace02011-10-23 21:21:50 +0000637 OS << "---- Branch Probabilities ----\n";
638 // We print the probabilities from the last function the analysis ran over,
639 // or the function it is currently running over.
640 assert(LastF && "Cannot print prior to running over a function");
Duncan P. N. Exon Smith5a82c912015-10-10 00:53:03 +0000641 for (const auto &BI : *LastF) {
642 for (succ_const_iterator SI = succ_begin(&BI), SE = succ_end(&BI); SI != SE;
643 ++SI) {
644 printEdgeProbability(OS << " ", &BI, *SI);
Duncan P. N. Exon Smith6c990152014-07-21 17:06:51 +0000645 }
646 }
Chandler Carruth1c8ace02011-10-23 21:21:50 +0000647}
648
Jakub Staszakefd94c82011-07-29 19:30:00 +0000649bool BranchProbabilityInfo::
650isEdgeHot(const BasicBlock *Src, const BasicBlock *Dst) const {
Andrew Trick3d4e64b2011-06-11 01:05:22 +0000651 // Hot probability is at least 4/5 = 80%
Benjamin Kramer929f53f2011-10-23 11:19:14 +0000652 // FIXME: Compare against a static "hot" BranchProbability.
653 return getEdgeProbability(Src, Dst) > BranchProbability(4, 5);
Andrew Trick49371f32011-06-04 01:16:30 +0000654}
655
Mehdi Aminia7978772016-04-07 21:59:28 +0000656const BasicBlock *
657BranchProbabilityInfo::getHotSucc(const BasicBlock *BB) const {
Cong Houe93b8e12015-12-22 18:56:14 +0000658 auto MaxProb = BranchProbability::getZero();
Mehdi Aminia7978772016-04-07 21:59:28 +0000659 const BasicBlock *MaxSucc = nullptr;
Andrew Trick49371f32011-06-04 01:16:30 +0000660
Mehdi Aminia7978772016-04-07 21:59:28 +0000661 for (succ_const_iterator I = succ_begin(BB), E = succ_end(BB); I != E; ++I) {
662 const BasicBlock *Succ = *I;
Cong Houe93b8e12015-12-22 18:56:14 +0000663 auto Prob = getEdgeProbability(BB, Succ);
664 if (Prob > MaxProb) {
665 MaxProb = Prob;
Andrew Trick49371f32011-06-04 01:16:30 +0000666 MaxSucc = Succ;
667 }
668 }
669
Benjamin Kramer929f53f2011-10-23 11:19:14 +0000670 // Hot probability is at least 4/5 = 80%
Cong Houe93b8e12015-12-22 18:56:14 +0000671 if (MaxProb > BranchProbability(4, 5))
Andrew Trick49371f32011-06-04 01:16:30 +0000672 return MaxSucc;
673
Craig Topper9f008862014-04-15 04:59:12 +0000674 return nullptr;
Andrew Trick49371f32011-06-04 01:16:30 +0000675}
676
Cong Houe93b8e12015-12-22 18:56:14 +0000677/// Get the raw edge probability for the edge. If can't find it, return a
678/// default probability 1/N where N is the number of successors. Here an edge is
679/// specified using PredBlock and an
680/// index to the successors.
681BranchProbability
682BranchProbabilityInfo::getEdgeProbability(const BasicBlock *Src,
683 unsigned IndexInSuccessors) const {
684 auto I = Probs.find(std::make_pair(Src, IndexInSuccessors));
Andrew Trick49371f32011-06-04 01:16:30 +0000685
Cong Houe93b8e12015-12-22 18:56:14 +0000686 if (I != Probs.end())
Andrew Trick49371f32011-06-04 01:16:30 +0000687 return I->second;
688
Cong Houe93b8e12015-12-22 18:56:14 +0000689 return {1,
690 static_cast<uint32_t>(std::distance(succ_begin(Src), succ_end(Src)))};
Andrew Trick49371f32011-06-04 01:16:30 +0000691}
692
Cong Houd97c1002015-12-01 05:29:22 +0000693BranchProbability
694BranchProbabilityInfo::getEdgeProbability(const BasicBlock *Src,
695 succ_const_iterator Dst) const {
696 return getEdgeProbability(Src, Dst.getSuccessorIndex());
697}
698
Cong Houe93b8e12015-12-22 18:56:14 +0000699/// Get the raw edge probability calculated for the block pair. This returns the
700/// sum of all raw edge probabilities from Src to Dst.
701BranchProbability
702BranchProbabilityInfo::getEdgeProbability(const BasicBlock *Src,
703 const BasicBlock *Dst) const {
704 auto Prob = BranchProbability::getZero();
705 bool FoundProb = false;
706 for (succ_const_iterator I = succ_begin(Src), E = succ_end(Src); I != E; ++I)
707 if (*I == Dst) {
708 auto MapI = Probs.find(std::make_pair(Src, I.getSuccessorIndex()));
709 if (MapI != Probs.end()) {
710 FoundProb = true;
711 Prob += MapI->second;
712 }
713 }
714 uint32_t succ_num = std::distance(succ_begin(Src), succ_end(Src));
715 return FoundProb ? Prob : BranchProbability(1, succ_num);
716}
717
718/// Set the edge probability for a given edge specified by PredBlock and an
719/// index to the successors.
720void BranchProbabilityInfo::setEdgeProbability(const BasicBlock *Src,
721 unsigned IndexInSuccessors,
722 BranchProbability Prob) {
723 Probs[std::make_pair(Src, IndexInSuccessors)] = Prob;
Igor Laevskyee40d1e2016-07-15 14:31:16 +0000724 Handles.insert(BasicBlockCallbackVH(Src, this));
Cong Houe93b8e12015-12-22 18:56:14 +0000725 DEBUG(dbgs() << "set edge " << Src->getName() << " -> " << IndexInSuccessors
726 << " successor probability to " << Prob << "\n");
727}
728
Andrew Trick49371f32011-06-04 01:16:30 +0000729raw_ostream &
Chandler Carruth1c8ace02011-10-23 21:21:50 +0000730BranchProbabilityInfo::printEdgeProbability(raw_ostream &OS,
731 const BasicBlock *Src,
732 const BasicBlock *Dst) const {
Andrew Trick49371f32011-06-04 01:16:30 +0000733
Jakub Staszak12a43bd2011-06-16 20:22:37 +0000734 const BranchProbability Prob = getEdgeProbability(Src, Dst);
Benjamin Kramer1f97a5a2011-11-15 16:27:03 +0000735 OS << "edge " << Src->getName() << " -> " << Dst->getName()
Andrew Trick3d4e64b2011-06-11 01:05:22 +0000736 << " probability is " << Prob
737 << (isEdgeHot(Src, Dst) ? " [HOT edge]\n" : "\n");
Andrew Trick49371f32011-06-04 01:16:30 +0000738
739 return OS;
740}
Cong Houab23bfb2015-07-15 22:48:29 +0000741
Igor Laevskyee40d1e2016-07-15 14:31:16 +0000742void BranchProbabilityInfo::eraseBlock(const BasicBlock *BB) {
743 for (auto I = Probs.begin(), E = Probs.end(); I != E; ++I) {
744 auto Key = I->first;
745 if (Key.first == BB)
746 Probs.erase(Key);
747 }
748}
749
Mehdi Aminia7978772016-04-07 21:59:28 +0000750void BranchProbabilityInfo::calculate(const Function &F, const LoopInfo &LI) {
Cong Houab23bfb2015-07-15 22:48:29 +0000751 DEBUG(dbgs() << "---- Branch Probability Info : " << F.getName()
752 << " ----\n\n");
753 LastF = &F; // Store the last function we ran on for printing.
754 assert(PostDominatedByUnreachable.empty());
755 assert(PostDominatedByColdCall.empty());
756
757 // Walk the basic blocks in post-order so that we can build up state about
758 // the successors of a block iteratively.
759 for (auto BB : post_order(&F.getEntryBlock())) {
760 DEBUG(dbgs() << "Computing probabilities for " << BB->getName() << "\n");
Serguei Katkovecebc3d2017-04-12 05:42:14 +0000761 updatePostDominatedByUnreachable(BB);
762 updatePostDominatedByColdCall(BB);
Cong Houab23bfb2015-07-15 22:48:29 +0000763 if (calcMetadataWeights(BB))
764 continue;
Serguei Katkov2616bbb2017-04-17 04:33:04 +0000765 if (calcUnreachableHeuristics(BB))
766 continue;
Cong Houab23bfb2015-07-15 22:48:29 +0000767 if (calcColdCallHeuristics(BB))
768 continue;
769 if (calcLoopBranchHeuristics(BB, LI))
770 continue;
771 if (calcPointerHeuristics(BB))
772 continue;
773 if (calcZeroHeuristics(BB))
774 continue;
775 if (calcFloatingPointHeuristics(BB))
776 continue;
777 calcInvokeHeuristics(BB);
778 }
779
780 PostDominatedByUnreachable.clear();
781 PostDominatedByColdCall.clear();
782}
783
784void BranchProbabilityInfoWrapperPass::getAnalysisUsage(
785 AnalysisUsage &AU) const {
786 AU.addRequired<LoopInfoWrapperPass>();
787 AU.setPreservesAll();
788}
789
790bool BranchProbabilityInfoWrapperPass::runOnFunction(Function &F) {
791 const LoopInfo &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
792 BPI.calculate(F, LI);
793 return false;
794}
795
796void BranchProbabilityInfoWrapperPass::releaseMemory() { BPI.releaseMemory(); }
797
798void BranchProbabilityInfoWrapperPass::print(raw_ostream &OS,
799 const Module *) const {
800 BPI.print(OS);
801}
Xinliang David Li6e5dd412016-05-05 02:59:57 +0000802
Chandler Carruthdab4eae2016-11-23 17:53:26 +0000803AnalysisKey BranchProbabilityAnalysis::Key;
Xinliang David Li6e5dd412016-05-05 02:59:57 +0000804BranchProbabilityInfo
Sean Silva36e0d012016-08-09 00:28:15 +0000805BranchProbabilityAnalysis::run(Function &F, FunctionAnalysisManager &AM) {
Xinliang David Li6e5dd412016-05-05 02:59:57 +0000806 BranchProbabilityInfo BPI;
807 BPI.calculate(F, AM.getResult<LoopAnalysis>(F));
808 return BPI;
809}
810
811PreservedAnalyses
Sean Silva36e0d012016-08-09 00:28:15 +0000812BranchProbabilityPrinterPass::run(Function &F, FunctionAnalysisManager &AM) {
Xinliang David Li6e5dd412016-05-05 02:59:57 +0000813 OS << "Printing analysis results of BPI for function "
814 << "'" << F.getName() << "':"
815 << "\n";
816 AM.getResult<BranchProbabilityAnalysis>(F).print(OS);
817 return PreservedAnalyses::all();
818}