blob: 7f1d27abcdc124c2383366dd8d4884b6dd357aa6 [file] [log] [blame]
Eugene Zelenko38c02bc2017-07-21 21:37:46 +00001//===- BranchProbabilityInfo.cpp - Branch Probability Analysis ------------===//
Andrew Trick49371f32011-06-04 01:16:30 +00002//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Andrew Trick49371f32011-06-04 01:16:30 +00006//
7//===----------------------------------------------------------------------===//
8//
9// Loops should be simplified before this analysis.
10//
11//===----------------------------------------------------------------------===//
12
Chandler Carruthed0881b2012-12-03 16:50:05 +000013#include "llvm/Analysis/BranchProbabilityInfo.h"
14#include "llvm/ADT/PostOrderIterator.h"
Geoff Berryeed65312017-11-01 15:16:50 +000015#include "llvm/ADT/SCCIterator.h"
Eugene Zelenko38c02bc2017-07-21 21:37:46 +000016#include "llvm/ADT/STLExtras.h"
17#include "llvm/ADT/SmallVector.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000018#include "llvm/Analysis/LoopInfo.h"
Taewook Oh2da205d2019-12-02 10:15:22 -080019#include "llvm/Analysis/PostDominators.h"
John Brawnda4a68a2017-06-08 09:44:40 +000020#include "llvm/Analysis/TargetLibraryInfo.h"
Eugene Zelenko38c02bc2017-07-21 21:37:46 +000021#include "llvm/IR/Attributes.h"
22#include "llvm/IR/BasicBlock.h"
Chandler Carruth1305dc32014-03-04 11:45:46 +000023#include "llvm/IR/CFG.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000024#include "llvm/IR/Constants.h"
Mikael Holmen2ca16892018-05-17 09:05:40 +000025#include "llvm/IR/Dominators.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000026#include "llvm/IR/Function.h"
Eugene Zelenko38c02bc2017-07-21 21:37:46 +000027#include "llvm/IR/InstrTypes.h"
28#include "llvm/IR/Instruction.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000029#include "llvm/IR/Instructions.h"
30#include "llvm/IR/LLVMContext.h"
31#include "llvm/IR/Metadata.h"
Eugene Zelenko38c02bc2017-07-21 21:37:46 +000032#include "llvm/IR/PassManager.h"
33#include "llvm/IR/Type.h"
34#include "llvm/IR/Value.h"
Reid Kleckner05da2fe2019-11-13 13:15:01 -080035#include "llvm/InitializePasses.h"
Eugene Zelenko38c02bc2017-07-21 21:37:46 +000036#include "llvm/Pass.h"
37#include "llvm/Support/BranchProbability.h"
38#include "llvm/Support/Casting.h"
Reid Kleckner4c1a1d32019-11-14 15:15:48 -080039#include "llvm/Support/CommandLine.h"
Andrew Trick3d4e64b2011-06-11 01:05:22 +000040#include "llvm/Support/Debug.h"
Benjamin Kramer16132e62015-03-23 18:07:13 +000041#include "llvm/Support/raw_ostream.h"
Eugene Zelenko38c02bc2017-07-21 21:37:46 +000042#include <cassert>
43#include <cstdint>
44#include <iterator>
45#include <utility>
Andrew Trick49371f32011-06-04 01:16:30 +000046
47using namespace llvm;
48
Chandler Carruthf1221bd2014-04-22 02:48:03 +000049#define DEBUG_TYPE "branch-prob"
50
Hiroshi Yamauchi63e17eb2017-08-26 00:31:00 +000051static cl::opt<bool> PrintBranchProb(
52 "print-bpi", cl::init(false), cl::Hidden,
53 cl::desc("Print the branch probability info."));
54
55cl::opt<std::string> PrintBranchProbFuncName(
56 "print-bpi-func-name", cl::Hidden,
57 cl::desc("The option to specify the name of the function "
58 "whose branch probability info is printed."));
59
Cong Houab23bfb2015-07-15 22:48:29 +000060INITIALIZE_PASS_BEGIN(BranchProbabilityInfoWrapperPass, "branch-prob",
Andrew Trick49371f32011-06-04 01:16:30 +000061 "Branch Probability Analysis", false, true)
Chandler Carruth4f8f3072015-01-17 14:16:18 +000062INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass)
John Brawnda4a68a2017-06-08 09:44:40 +000063INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass)
Evgeniy Brevnov3e68a6672020-04-28 16:31:20 +070064INITIALIZE_PASS_DEPENDENCY(PostDominatorTreeWrapperPass)
Cong Houab23bfb2015-07-15 22:48:29 +000065INITIALIZE_PASS_END(BranchProbabilityInfoWrapperPass, "branch-prob",
Andrew Trick49371f32011-06-04 01:16:30 +000066 "Branch Probability Analysis", false, true)
67
Reid Kleckner05da2fe2019-11-13 13:15:01 -080068BranchProbabilityInfoWrapperPass::BranchProbabilityInfoWrapperPass()
69 : FunctionPass(ID) {
70 initializeBranchProbabilityInfoWrapperPassPass(
71 *PassRegistry::getPassRegistry());
72}
73
Cong Houab23bfb2015-07-15 22:48:29 +000074char BranchProbabilityInfoWrapperPass::ID = 0;
Andrew Trick49371f32011-06-04 01:16:30 +000075
Chandler Carruth7a0094a2011-10-24 01:40:45 +000076// Weights are for internal use only. They are used by heuristics to help to
77// estimate edges' probability. Example:
78//
79// Using "Loop Branch Heuristics" we predict weights of edges for the
80// block BB2.
81// ...
82// |
83// V
84// BB1<-+
85// | |
86// | | (Weight = 124)
87// V |
88// BB2--+
89// |
90// | (Weight = 4)
91// V
92// BB3
93//
94// Probability of the edge BB2->BB1 = 124 / (124 + 4) = 0.96875
95// Probability of the edge BB2->BB3 = 4 / (124 + 4) = 0.03125
96static const uint32_t LBH_TAKEN_WEIGHT = 124;
97static const uint32_t LBH_NONTAKEN_WEIGHT = 4;
John Brawn29bbed32018-02-23 17:17:31 +000098// Unlikely edges within a loop are half as likely as other edges
99static const uint32_t LBH_UNLIKELY_WEIGHT = 62;
Andrew Trick49371f32011-06-04 01:16:30 +0000100
Adrian Prantl5f8f34e42018-05-01 15:54:18 +0000101/// Unreachable-terminating branch taken probability.
Chandler Carruth7111f452011-10-24 12:01:08 +0000102///
Serguei Katkovba831f72017-05-18 06:11:56 +0000103/// This is the probability for a branch being taken to a block that terminates
Chandler Carruth7111f452011-10-24 12:01:08 +0000104/// (eventually) in unreachable. These are predicted as unlikely as possible.
Yevgeny Rouban07239c72020-06-02 11:28:12 +0700105/// All reachable probability will proportionally share the remaining part.
Serguei Katkovba831f72017-05-18 06:11:56 +0000106static const BranchProbability UR_TAKEN_PROB = BranchProbability::getRaw(1);
Serguei Katkov2616bbb2017-04-17 04:33:04 +0000107
Adrian Prantl5f8f34e42018-05-01 15:54:18 +0000108/// Weight for a branch taken going into a cold block.
Diego Novilloc6399532013-05-24 12:26:52 +0000109///
110/// This is the weight for a branch taken toward a block marked
111/// cold. A block is marked cold if it's postdominated by a
112/// block containing a call to a cold function. Cold functions
113/// are those marked with attribute 'cold'.
114static const uint32_t CC_TAKEN_WEIGHT = 4;
115
Adrian Prantl5f8f34e42018-05-01 15:54:18 +0000116/// Weight for a branch not-taken into a cold block.
Diego Novilloc6399532013-05-24 12:26:52 +0000117///
118/// This is the weight for a branch not taken toward a block marked
119/// cold.
120static const uint32_t CC_NONTAKEN_WEIGHT = 64;
121
Chandler Carruth7a0094a2011-10-24 01:40:45 +0000122static const uint32_t PH_TAKEN_WEIGHT = 20;
123static const uint32_t PH_NONTAKEN_WEIGHT = 12;
Andrew Trick49371f32011-06-04 01:16:30 +0000124
Chandler Carruth7a0094a2011-10-24 01:40:45 +0000125static const uint32_t ZH_TAKEN_WEIGHT = 20;
126static const uint32_t ZH_NONTAKEN_WEIGHT = 12;
Andrew Trick49371f32011-06-04 01:16:30 +0000127
Chandler Carruth7a0094a2011-10-24 01:40:45 +0000128static const uint32_t FPH_TAKEN_WEIGHT = 20;
129static const uint32_t FPH_NONTAKEN_WEIGHT = 12;
Andrew Trick49371f32011-06-04 01:16:30 +0000130
Guozhi Weib329e072019-09-10 17:25:11 +0000131/// This is the probability for an ordered floating point comparison.
132static const uint32_t FPH_ORD_WEIGHT = 1024 * 1024 - 1;
133/// This is the probability for an unordered floating point comparison, it means
134/// one or two of the operands are NaN. Usually it is used to test for an
135/// exceptional case, so the result is unlikely.
136static const uint32_t FPH_UNO_WEIGHT = 1;
137
Adrian Prantl5f8f34e42018-05-01 15:54:18 +0000138/// Invoke-terminating normal branch taken weight
Bill Wendlinge1c54262012-08-15 12:22:35 +0000139///
140/// This is the weight for branching to the normal destination of an invoke
141/// instruction. We expect this to happen most of the time. Set the weight to an
142/// absurdly high value so that nested loops subsume it.
143static const uint32_t IH_TAKEN_WEIGHT = 1024 * 1024 - 1;
144
Adrian Prantl5f8f34e42018-05-01 15:54:18 +0000145/// Invoke-terminating normal branch not-taken weight.
Bill Wendlinge1c54262012-08-15 12:22:35 +0000146///
147/// This is the weight for branching to the unwind destination of an invoke
148/// instruction. This is essentially never taken.
149static const uint32_t IH_NONTAKEN_WEIGHT = 1;
150
Taewook Oh2da205d2019-12-02 10:15:22 -0800151static void UpdatePDTWorklist(const BasicBlock *BB, PostDominatorTree *PDT,
152 SmallVectorImpl<const BasicBlock *> &WorkList,
153 SmallPtrSetImpl<const BasicBlock *> &TargetSet) {
154 SmallVector<BasicBlock *, 8> Descendants;
155 SmallPtrSet<const BasicBlock *, 16> NewItems;
Chandler Carruth7111f452011-10-24 12:01:08 +0000156
Taewook Oh2da205d2019-12-02 10:15:22 -0800157 PDT->getDescendants(const_cast<BasicBlock *>(BB), Descendants);
158 for (auto *BB : Descendants)
159 if (TargetSet.insert(BB).second)
160 for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI)
161 if (!TargetSet.count(*PI))
162 NewItems.insert(*PI);
163 WorkList.insert(WorkList.end(), NewItems.begin(), NewItems.end());
Serguei Katkovecebc3d2017-04-12 05:42:14 +0000164}
165
Taewook Oh2da205d2019-12-02 10:15:22 -0800166/// Compute a set of basic blocks that are post-dominated by unreachables.
167void BranchProbabilityInfo::computePostDominatedByUnreachable(
168 const Function &F, PostDominatorTree *PDT) {
169 SmallVector<const BasicBlock *, 8> WorkList;
170 for (auto &BB : F) {
171 const Instruction *TI = BB.getTerminator();
172 if (TI->getNumSuccessors() == 0) {
173 if (isa<UnreachableInst>(TI) ||
174 // If this block is terminated by a call to
175 // @llvm.experimental.deoptimize then treat it like an unreachable
176 // since the @llvm.experimental.deoptimize call is expected to
177 // practically never execute.
178 BB.getTerminatingDeoptimizeCall())
179 UpdatePDTWorklist(&BB, PDT, WorkList, PostDominatedByUnreachable);
180 }
Serguei Katkovecebc3d2017-04-12 05:42:14 +0000181 }
182
Taewook Oh2da205d2019-12-02 10:15:22 -0800183 while (!WorkList.empty()) {
184 const BasicBlock *BB = WorkList.pop_back_val();
185 if (PostDominatedByUnreachable.count(BB))
186 continue;
187 // If the terminator is an InvokeInst, check only the normal destination
188 // block as the unwind edge of InvokeInst is also very unlikely taken.
189 if (auto *II = dyn_cast<InvokeInst>(BB->getTerminator())) {
190 if (PostDominatedByUnreachable.count(II->getNormalDest()))
191 UpdatePDTWorklist(BB, PDT, WorkList, PostDominatedByUnreachable);
Serguei Katkovecebc3d2017-04-12 05:42:14 +0000192 }
Taewook Oh2da205d2019-12-02 10:15:22 -0800193 // If all the successors are unreachable, BB is unreachable as well.
194 else if (!successors(BB).empty() &&
195 llvm::all_of(successors(BB), [this](const BasicBlock *Succ) {
196 return PostDominatedByUnreachable.count(Succ);
197 }))
198 UpdatePDTWorklist(BB, PDT, WorkList, PostDominatedByUnreachable);
199 }
200}
Serguei Katkovecebc3d2017-04-12 05:42:14 +0000201
Taewook Oh2da205d2019-12-02 10:15:22 -0800202/// compute a set of basic blocks that are post-dominated by ColdCalls.
203void BranchProbabilityInfo::computePostDominatedByColdCall(
204 const Function &F, PostDominatorTree *PDT) {
205 SmallVector<const BasicBlock *, 8> WorkList;
206 for (auto &BB : F)
207 for (auto &I : BB)
208 if (const CallInst *CI = dyn_cast<CallInst>(&I))
209 if (CI->hasFnAttr(Attribute::Cold))
210 UpdatePDTWorklist(&BB, PDT, WorkList, PostDominatedByColdCall);
211
212 while (!WorkList.empty()) {
213 const BasicBlock *BB = WorkList.pop_back_val();
214
215 // If the terminator is an InvokeInst, check only the normal destination
216 // block as the unwind edge of InvokeInst is also very unlikely taken.
217 if (auto *II = dyn_cast<InvokeInst>(BB->getTerminator())) {
218 if (PostDominatedByColdCall.count(II->getNormalDest()))
219 UpdatePDTWorklist(BB, PDT, WorkList, PostDominatedByColdCall);
220 }
221 // If all of successor are post dominated then BB is also done.
222 else if (!successors(BB).empty() &&
223 llvm::all_of(successors(BB), [this](const BasicBlock *Succ) {
224 return PostDominatedByColdCall.count(Succ);
225 }))
226 UpdatePDTWorklist(BB, PDT, WorkList, PostDominatedByColdCall);
227 }
Serguei Katkovecebc3d2017-04-12 05:42:14 +0000228}
229
Adrian Prantl5f8f34e42018-05-01 15:54:18 +0000230/// Calculate edge weights for successors lead to unreachable.
Serguei Katkovecebc3d2017-04-12 05:42:14 +0000231///
232/// Predict that a successor which leads necessarily to an
233/// unreachable-terminated block as extremely unlikely.
234bool BranchProbabilityInfo::calcUnreachableHeuristics(const BasicBlock *BB) {
Chandler Carruthedb12a82018-10-15 10:04:59 +0000235 const Instruction *TI = BB->getTerminator();
Artur Pilipenko4d063e72018-06-08 13:03:21 +0000236 (void) TI;
Serguei Katkov11d9c4f2017-04-17 06:39:47 +0000237 assert(TI->getNumSuccessors() > 1 && "expected more than one successor!");
Artur Pilipenko4d063e72018-06-08 13:03:21 +0000238 assert(!isa<InvokeInst>(TI) &&
239 "Invokes should have already been handled by calcInvokeHeuristics");
Serguei Katkovecebc3d2017-04-12 05:42:14 +0000240
Manman Rencf104462012-08-24 18:14:27 +0000241 SmallVector<unsigned, 4> UnreachableEdges;
242 SmallVector<unsigned, 4> ReachableEdges;
Chandler Carruth7111f452011-10-24 12:01:08 +0000243
Alina Sbirlea3abcbf92020-03-10 11:33:02 -0700244 for (const_succ_iterator I = succ_begin(BB), E = succ_end(BB); I != E; ++I)
Chandler Carruth7111f452011-10-24 12:01:08 +0000245 if (PostDominatedByUnreachable.count(*I))
Manman Rencf104462012-08-24 18:14:27 +0000246 UnreachableEdges.push_back(I.getSuccessorIndex());
Chandler Carruth7111f452011-10-24 12:01:08 +0000247 else
Manman Rencf104462012-08-24 18:14:27 +0000248 ReachableEdges.push_back(I.getSuccessorIndex());
Chandler Carruth7111f452011-10-24 12:01:08 +0000249
Serguei Katkov11d9c4f2017-04-17 06:39:47 +0000250 // Skip probabilities if all were reachable.
251 if (UnreachableEdges.empty())
Serguei Katkovecebc3d2017-04-12 05:42:14 +0000252 return false;
Jun Bum Lima23e5f72015-12-21 22:00:51 +0000253
Yevgeny Rouban81384872020-05-21 11:49:11 +0700254 SmallVector<BranchProbability, 4> EdgeProbabilities(
255 BB->getTerminator()->getNumSuccessors(), BranchProbability::getUnknown());
Cong Houe93b8e12015-12-22 18:56:14 +0000256 if (ReachableEdges.empty()) {
257 BranchProbability Prob(1, UnreachableEdges.size());
258 for (unsigned SuccIdx : UnreachableEdges)
Yevgeny Rouban81384872020-05-21 11:49:11 +0700259 EdgeProbabilities[SuccIdx] = Prob;
260 setEdgeProbability(BB, EdgeProbabilities);
Chandler Carruth7111f452011-10-24 12:01:08 +0000261 return true;
Cong Houe93b8e12015-12-22 18:56:14 +0000262 }
263
Serguei Katkovba831f72017-05-18 06:11:56 +0000264 auto UnreachableProb = UR_TAKEN_PROB;
265 auto ReachableProb =
266 (BranchProbability::getOne() - UR_TAKEN_PROB * UnreachableEdges.size()) /
267 ReachableEdges.size();
Cong Houe93b8e12015-12-22 18:56:14 +0000268
269 for (unsigned SuccIdx : UnreachableEdges)
Yevgeny Rouban81384872020-05-21 11:49:11 +0700270 EdgeProbabilities[SuccIdx] = UnreachableProb;
Cong Houe93b8e12015-12-22 18:56:14 +0000271 for (unsigned SuccIdx : ReachableEdges)
Yevgeny Rouban81384872020-05-21 11:49:11 +0700272 EdgeProbabilities[SuccIdx] = ReachableProb;
Chandler Carruth7111f452011-10-24 12:01:08 +0000273
Yevgeny Rouban81384872020-05-21 11:49:11 +0700274 setEdgeProbability(BB, EdgeProbabilities);
Chandler Carruth7111f452011-10-24 12:01:08 +0000275 return true;
276}
277
Chandler Carruthd27a7a92011-10-19 10:30:30 +0000278// Propagate existing explicit probabilities from either profile data or
Serguei Katkov2616bbb2017-04-17 04:33:04 +0000279// 'expect' intrinsic processing. Examine metadata against unreachable
280// heuristic. The probability of the edge coming to unreachable block is
281// set to min of metadata and unreachable heuristic.
Mehdi Aminia7978772016-04-07 21:59:28 +0000282bool BranchProbabilityInfo::calcMetadataWeights(const BasicBlock *BB) {
Chandler Carruthedb12a82018-10-15 10:04:59 +0000283 const Instruction *TI = BB->getTerminator();
Serguei Katkov11d9c4f2017-04-17 06:39:47 +0000284 assert(TI->getNumSuccessors() > 1 && "expected more than one successor!");
Rong Xu15848e52017-08-23 21:36:02 +0000285 if (!(isa<BranchInst>(TI) || isa<SwitchInst>(TI) || isa<IndirectBrInst>(TI)))
Chandler Carruthd27a7a92011-10-19 10:30:30 +0000286 return false;
287
Duncan P. N. Exon Smithde36e802014-11-11 21:30:22 +0000288 MDNode *WeightsNode = TI->getMetadata(LLVMContext::MD_prof);
Chandler Carruthdeac50c2011-10-19 10:32:19 +0000289 if (!WeightsNode)
Chandler Carruthd27a7a92011-10-19 10:30:30 +0000290 return false;
291
Diego Novillode5b8012015-05-07 17:22:06 +0000292 // Check that the number of successors is manageable.
293 assert(TI->getNumSuccessors() < UINT32_MAX && "Too many successors");
294
Chandler Carruthdeac50c2011-10-19 10:32:19 +0000295 // Ensure there are weights for all of the successors. Note that the first
296 // operand to the metadata node is a name, not a weight.
297 if (WeightsNode->getNumOperands() != TI->getNumSuccessors() + 1)
Chandler Carruthd27a7a92011-10-19 10:30:30 +0000298 return false;
299
Diego Novillode5b8012015-05-07 17:22:06 +0000300 // Build up the final weights that will be used in a temporary buffer.
301 // Compute the sum of all weights to later decide whether they need to
302 // be scaled to fit in 32 bits.
303 uint64_t WeightSum = 0;
Chandler Carruthdeac50c2011-10-19 10:32:19 +0000304 SmallVector<uint32_t, 2> Weights;
Serguei Katkov2616bbb2017-04-17 04:33:04 +0000305 SmallVector<unsigned, 2> UnreachableIdxs;
306 SmallVector<unsigned, 2> ReachableIdxs;
Chandler Carruthdeac50c2011-10-19 10:32:19 +0000307 Weights.reserve(TI->getNumSuccessors());
Yevgeny Rouban3bb0d952020-06-02 10:55:27 +0700308 for (unsigned I = 1, E = WeightsNode->getNumOperands(); I != E; ++I) {
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000309 ConstantInt *Weight =
Yevgeny Rouban3bb0d952020-06-02 10:55:27 +0700310 mdconst::dyn_extract<ConstantInt>(WeightsNode->getOperand(I));
Chandler Carruthdeac50c2011-10-19 10:32:19 +0000311 if (!Weight)
312 return false;
Diego Novillode5b8012015-05-07 17:22:06 +0000313 assert(Weight->getValue().getActiveBits() <= 32 &&
314 "Too many bits for uint32_t");
315 Weights.push_back(Weight->getZExtValue());
316 WeightSum += Weights.back();
Yevgeny Rouban3bb0d952020-06-02 10:55:27 +0700317 if (PostDominatedByUnreachable.count(TI->getSuccessor(I - 1)))
318 UnreachableIdxs.push_back(I - 1);
Serguei Katkov2616bbb2017-04-17 04:33:04 +0000319 else
Yevgeny Rouban3bb0d952020-06-02 10:55:27 +0700320 ReachableIdxs.push_back(I - 1);
Chandler Carruthdeac50c2011-10-19 10:32:19 +0000321 }
322 assert(Weights.size() == TI->getNumSuccessors() && "Checked above");
Diego Novillode5b8012015-05-07 17:22:06 +0000323
324 // If the sum of weights does not fit in 32 bits, scale every weight down
325 // accordingly.
326 uint64_t ScalingFactor =
327 (WeightSum > UINT32_MAX) ? WeightSum / UINT32_MAX + 1 : 1;
328
Serguei Katkov2616bbb2017-04-17 04:33:04 +0000329 if (ScalingFactor > 1) {
330 WeightSum = 0;
Yevgeny Rouban3bb0d952020-06-02 10:55:27 +0700331 for (unsigned I = 0, E = TI->getNumSuccessors(); I != E; ++I) {
332 Weights[I] /= ScalingFactor;
333 WeightSum += Weights[I];
Serguei Katkov2616bbb2017-04-17 04:33:04 +0000334 }
Diego Novillode5b8012015-05-07 17:22:06 +0000335 }
Serguei Katkov63c9c812017-05-12 07:50:06 +0000336 assert(WeightSum <= UINT32_MAX &&
337 "Expected weights to scale down to 32 bits");
Cong Hou6a2c71a2015-12-22 23:45:55 +0000338
Serguei Katkov2616bbb2017-04-17 04:33:04 +0000339 if (WeightSum == 0 || ReachableIdxs.size() == 0) {
Yevgeny Rouban3bb0d952020-06-02 10:55:27 +0700340 for (unsigned I = 0, E = TI->getNumSuccessors(); I != E; ++I)
341 Weights[I] = 1;
Serguei Katkov2616bbb2017-04-17 04:33:04 +0000342 WeightSum = TI->getNumSuccessors();
Cong Hou6a2c71a2015-12-22 23:45:55 +0000343 }
Cong Houe93b8e12015-12-22 18:56:14 +0000344
Serguei Katkov2616bbb2017-04-17 04:33:04 +0000345 // Set the probability.
346 SmallVector<BranchProbability, 2> BP;
Yevgeny Rouban3bb0d952020-06-02 10:55:27 +0700347 for (unsigned I = 0, E = TI->getNumSuccessors(); I != E; ++I)
348 BP.push_back({ Weights[I], static_cast<uint32_t>(WeightSum) });
Serguei Katkov2616bbb2017-04-17 04:33:04 +0000349
350 // Examine the metadata against unreachable heuristic.
351 // If the unreachable heuristic is more strong then we use it for this edge.
Yevgeny Rouban07239c72020-06-02 11:28:12 +0700352 if (UnreachableIdxs.size() == 0 || ReachableIdxs.size() == 0) {
353 setEdgeProbability(BB, BP);
354 return true;
355 }
Serguei Katkov2616bbb2017-04-17 04:33:04 +0000356
Yevgeny Rouban07239c72020-06-02 11:28:12 +0700357 auto UnreachableProb = UR_TAKEN_PROB;
358 for (auto I : UnreachableIdxs)
359 if (UnreachableProb < BP[I]) {
360 BP[I] = UnreachableProb;
361 }
Yevgeny Rouban81384872020-05-21 11:49:11 +0700362
Yevgeny Rouban07239c72020-06-02 11:28:12 +0700363 // Sum of all edge probabilities must be 1.0. If we modified the probability
364 // of some edges then we must distribute the introduced difference over the
365 // reachable blocks.
366 //
367 // Proportional distribution: the relation between probabilities of the
368 // reachable edges is kept unchanged. That is for any reachable edges i and j:
369 // newBP[i] / newBP[j] == oldBP[i] / oldBP[j] =>
370 // newBP[i] / oldBP[i] == newBP[j] / oldBP[j] == K
371 // Where K is independent of i,j.
372 // newBP[i] == oldBP[i] * K
373 // We need to find K.
374 // Make sum of all reachables of the left and right parts:
375 // sum_of_reachable(newBP) == K * sum_of_reachable(oldBP)
376 // Sum of newBP must be equal to 1.0:
377 // sum_of_reachable(newBP) + sum_of_unreachable(newBP) == 1.0 =>
378 // sum_of_reachable(newBP) = 1.0 - sum_of_unreachable(newBP)
379 // Where sum_of_unreachable(newBP) is what has been just changed.
380 // Finally:
381 // K == sum_of_reachable(newBP) / sum_of_reachable(oldBP) =>
382 // K == (1.0 - sum_of_unreachable(newBP)) / sum_of_reachable(oldBP)
383 BranchProbability NewUnreachableSum = BranchProbability::getZero();
384 for (auto I : UnreachableIdxs)
385 NewUnreachableSum += BP[I];
386
387 BranchProbability NewReachableSum =
388 BranchProbability::getOne() - NewUnreachableSum;
389
390 BranchProbability OldReachableSum = BranchProbability::getZero();
391 for (auto I : ReachableIdxs)
392 OldReachableSum += BP[I];
393
394 if (OldReachableSum != NewReachableSum) { // Anything to dsitribute?
395 if (OldReachableSum.isZero()) {
396 // If all oldBP[i] are zeroes then the proportional distribution results
397 // in all zero probabilities and the error stays big. In this case we
398 // evenly spread NewReachableSum over the reachable edges.
399 BranchProbability PerEdge = NewReachableSum / ReachableIdxs.size();
Yevgeny Rouban3bb0d952020-06-02 10:55:27 +0700400 for (auto I : ReachableIdxs)
Yevgeny Rouban07239c72020-06-02 11:28:12 +0700401 BP[I] = PerEdge;
402 } else {
403 for (auto I : ReachableIdxs) {
404 // We use uint64_t to avoid double rounding error of the following
405 // calculation: BP[i] = BP[i] * NewReachableSum / OldReachableSum
406 // The formula is taken from the private constructor
407 // BranchProbability(uint32_t Numerator, uint32_t Denominator)
408 uint64_t Mul = static_cast<uint64_t>(NewReachableSum.getNumerator()) *
409 BP[I].getNumerator();
410 uint32_t Div = static_cast<uint32_t>(
411 divideNearest(Mul, OldReachableSum.getNumerator()));
412 BP[I] = BranchProbability::getRaw(Div);
413 }
414 }
Serguei Katkov2616bbb2017-04-17 04:33:04 +0000415 }
416
Yevgeny Rouban81384872020-05-21 11:49:11 +0700417 setEdgeProbability(BB, BP);
Serguei Katkov2616bbb2017-04-17 04:33:04 +0000418
Chandler Carruthd27a7a92011-10-19 10:30:30 +0000419 return true;
420}
421
Adrian Prantl5f8f34e42018-05-01 15:54:18 +0000422/// Calculate edge weights for edges leading to cold blocks.
Diego Novilloc6399532013-05-24 12:26:52 +0000423///
424/// A cold block is one post-dominated by a block with a call to a
425/// cold function. Those edges are unlikely to be taken, so we give
426/// them relatively low weight.
427///
428/// Return true if we could compute the weights for cold edges.
429/// Return false, otherwise.
Mehdi Aminia7978772016-04-07 21:59:28 +0000430bool BranchProbabilityInfo::calcColdCallHeuristics(const BasicBlock *BB) {
Chandler Carruthedb12a82018-10-15 10:04:59 +0000431 const Instruction *TI = BB->getTerminator();
Artur Pilipenko4d063e72018-06-08 13:03:21 +0000432 (void) TI;
Serguei Katkov11d9c4f2017-04-17 06:39:47 +0000433 assert(TI->getNumSuccessors() > 1 && "expected more than one successor!");
Artur Pilipenko4d063e72018-06-08 13:03:21 +0000434 assert(!isa<InvokeInst>(TI) &&
435 "Invokes should have already been handled by calcInvokeHeuristics");
Diego Novilloc6399532013-05-24 12:26:52 +0000436
437 // Determine which successors are post-dominated by a cold block.
438 SmallVector<unsigned, 4> ColdEdges;
Diego Novilloc6399532013-05-24 12:26:52 +0000439 SmallVector<unsigned, 4> NormalEdges;
Alina Sbirlea3abcbf92020-03-10 11:33:02 -0700440 for (const_succ_iterator I = succ_begin(BB), E = succ_end(BB); I != E; ++I)
Diego Novilloc6399532013-05-24 12:26:52 +0000441 if (PostDominatedByColdCall.count(*I))
442 ColdEdges.push_back(I.getSuccessorIndex());
443 else
444 NormalEdges.push_back(I.getSuccessorIndex());
445
Serguei Katkov11d9c4f2017-04-17 06:39:47 +0000446 // Skip probabilities if no cold edges.
447 if (ColdEdges.empty())
Diego Novilloc6399532013-05-24 12:26:52 +0000448 return false;
449
Yevgeny Rouban81384872020-05-21 11:49:11 +0700450 SmallVector<BranchProbability, 4> EdgeProbabilities(
451 BB->getTerminator()->getNumSuccessors(), BranchProbability::getUnknown());
Cong Houe93b8e12015-12-22 18:56:14 +0000452 if (NormalEdges.empty()) {
453 BranchProbability Prob(1, ColdEdges.size());
454 for (unsigned SuccIdx : ColdEdges)
Yevgeny Rouban81384872020-05-21 11:49:11 +0700455 EdgeProbabilities[SuccIdx] = Prob;
456 setEdgeProbability(BB, EdgeProbabilities);
Diego Novilloc6399532013-05-24 12:26:52 +0000457 return true;
Cong Houe93b8e12015-12-22 18:56:14 +0000458 }
459
Vedant Kumara4bd1462016-12-17 01:02:08 +0000460 auto ColdProb = BranchProbability::getBranchProbability(
461 CC_TAKEN_WEIGHT,
462 (CC_TAKEN_WEIGHT + CC_NONTAKEN_WEIGHT) * uint64_t(ColdEdges.size()));
463 auto NormalProb = BranchProbability::getBranchProbability(
464 CC_NONTAKEN_WEIGHT,
465 (CC_TAKEN_WEIGHT + CC_NONTAKEN_WEIGHT) * uint64_t(NormalEdges.size()));
Cong Houe93b8e12015-12-22 18:56:14 +0000466
467 for (unsigned SuccIdx : ColdEdges)
Yevgeny Rouban81384872020-05-21 11:49:11 +0700468 EdgeProbabilities[SuccIdx] = ColdProb;
Cong Houe93b8e12015-12-22 18:56:14 +0000469 for (unsigned SuccIdx : NormalEdges)
Yevgeny Rouban81384872020-05-21 11:49:11 +0700470 EdgeProbabilities[SuccIdx] = NormalProb;
Diego Novilloc6399532013-05-24 12:26:52 +0000471
Yevgeny Rouban81384872020-05-21 11:49:11 +0700472 setEdgeProbability(BB, EdgeProbabilities);
Diego Novilloc6399532013-05-24 12:26:52 +0000473 return true;
474}
475
Vedant Kumar1a8456d2018-03-02 18:57:02 +0000476// Calculate Edge Weights using "Pointer Heuristics". Predict a comparison
Andrew Trick49371f32011-06-04 01:16:30 +0000477// between two pointer or pointer and NULL will fail.
Mehdi Aminia7978772016-04-07 21:59:28 +0000478bool BranchProbabilityInfo::calcPointerHeuristics(const BasicBlock *BB) {
479 const BranchInst *BI = dyn_cast<BranchInst>(BB->getTerminator());
Andrew Trick49371f32011-06-04 01:16:30 +0000480 if (!BI || !BI->isConditional())
Jakub Staszakd07b2e12011-07-28 21:45:07 +0000481 return false;
Andrew Trick49371f32011-06-04 01:16:30 +0000482
483 Value *Cond = BI->getCondition();
484 ICmpInst *CI = dyn_cast<ICmpInst>(Cond);
Jakub Staszakabb236f2011-07-15 20:51:06 +0000485 if (!CI || !CI->isEquality())
Jakub Staszakd07b2e12011-07-28 21:45:07 +0000486 return false;
Andrew Trick49371f32011-06-04 01:16:30 +0000487
488 Value *LHS = CI->getOperand(0);
Andrew Trick49371f32011-06-04 01:16:30 +0000489
490 if (!LHS->getType()->isPointerTy())
Jakub Staszakd07b2e12011-07-28 21:45:07 +0000491 return false;
Andrew Trick49371f32011-06-04 01:16:30 +0000492
Nick Lewycky75b20532011-06-04 02:07:10 +0000493 assert(CI->getOperand(1)->getType()->isPointerTy());
Andrew Trick49371f32011-06-04 01:16:30 +0000494
Yevgeny Rouban81384872020-05-21 11:49:11 +0700495 BranchProbability TakenProb(PH_TAKEN_WEIGHT,
496 PH_TAKEN_WEIGHT + PH_NONTAKEN_WEIGHT);
497 BranchProbability UntakenProb(PH_NONTAKEN_WEIGHT,
498 PH_TAKEN_WEIGHT + PH_NONTAKEN_WEIGHT);
499
Andrew Trick49371f32011-06-04 01:16:30 +0000500 // p != 0 -> isProb = true
501 // p == 0 -> isProb = false
502 // p != q -> isProb = true
503 // p == q -> isProb = false;
Jakub Staszakabb236f2011-07-15 20:51:06 +0000504 bool isProb = CI->getPredicate() == ICmpInst::ICMP_NE;
Andrew Trick49371f32011-06-04 01:16:30 +0000505 if (!isProb)
Yevgeny Rouban81384872020-05-21 11:49:11 +0700506 std::swap(TakenProb, UntakenProb);
Andrew Trick49371f32011-06-04 01:16:30 +0000507
Yevgeny Rouban81384872020-05-21 11:49:11 +0700508 setEdgeProbability(
509 BB, SmallVector<BranchProbability, 2>({TakenProb, UntakenProb}));
Jakub Staszakd07b2e12011-07-28 21:45:07 +0000510 return true;
Andrew Trick49371f32011-06-04 01:16:30 +0000511}
512
Geoff Berryeed65312017-11-01 15:16:50 +0000513static int getSCCNum(const BasicBlock *BB,
514 const BranchProbabilityInfo::SccInfo &SccI) {
515 auto SccIt = SccI.SccNums.find(BB);
516 if (SccIt == SccI.SccNums.end())
517 return -1;
518 return SccIt->second;
519}
520
521// Consider any block that is an entry point to the SCC as a header.
522static bool isSCCHeader(const BasicBlock *BB, int SccNum,
523 BranchProbabilityInfo::SccInfo &SccI) {
524 assert(getSCCNum(BB, SccI) == SccNum);
525
526 // Lazily compute the set of headers for a given SCC and cache the results
527 // in the SccHeaderMap.
528 if (SccI.SccHeaders.size() <= static_cast<unsigned>(SccNum))
529 SccI.SccHeaders.resize(SccNum + 1);
530 auto &HeaderMap = SccI.SccHeaders[SccNum];
531 bool Inserted;
532 BranchProbabilityInfo::SccHeaderMap::iterator HeaderMapIt;
533 std::tie(HeaderMapIt, Inserted) = HeaderMap.insert(std::make_pair(BB, false));
534 if (Inserted) {
535 bool IsHeader = llvm::any_of(make_range(pred_begin(BB), pred_end(BB)),
536 [&](const BasicBlock *Pred) {
537 return getSCCNum(Pred, SccI) != SccNum;
538 });
539 HeaderMapIt->second = IsHeader;
540 return IsHeader;
541 } else
542 return HeaderMapIt->second;
543}
544
John Brawn29bbed32018-02-23 17:17:31 +0000545// Compute the unlikely successors to the block BB in the loop L, specifically
546// those that are unlikely because this is a loop, and add them to the
547// UnlikelyBlocks set.
548static void
549computeUnlikelySuccessors(const BasicBlock *BB, Loop *L,
550 SmallPtrSetImpl<const BasicBlock*> &UnlikelyBlocks) {
551 // Sometimes in a loop we have a branch whose condition is made false by
552 // taking it. This is typically something like
553 // int n = 0;
554 // while (...) {
555 // if (++n >= MAX) {
556 // n = 0;
557 // }
558 // }
559 // In this sort of situation taking the branch means that at the very least it
560 // won't be taken again in the next iteration of the loop, so we should
561 // consider it less likely than a typical branch.
562 //
563 // We detect this by looking back through the graph of PHI nodes that sets the
564 // value that the condition depends on, and seeing if we can reach a successor
565 // block which can be determined to make the condition false.
566 //
567 // FIXME: We currently consider unlikely blocks to be half as likely as other
568 // blocks, but if we consider the example above the likelyhood is actually
569 // 1/MAX. We could therefore be more precise in how unlikely we consider
570 // blocks to be, but it would require more careful examination of the form
571 // of the comparison expression.
572 const BranchInst *BI = dyn_cast<BranchInst>(BB->getTerminator());
573 if (!BI || !BI->isConditional())
574 return;
575
576 // Check if the branch is based on an instruction compared with a constant
577 CmpInst *CI = dyn_cast<CmpInst>(BI->getCondition());
578 if (!CI || !isa<Instruction>(CI->getOperand(0)) ||
579 !isa<Constant>(CI->getOperand(1)))
580 return;
581
582 // Either the instruction must be a PHI, or a chain of operations involving
583 // constants that ends in a PHI which we can then collapse into a single value
584 // if the PHI value is known.
585 Instruction *CmpLHS = dyn_cast<Instruction>(CI->getOperand(0));
586 PHINode *CmpPHI = dyn_cast<PHINode>(CmpLHS);
587 Constant *CmpConst = dyn_cast<Constant>(CI->getOperand(1));
588 // Collect the instructions until we hit a PHI
Benjamin Kramer7f68a302018-06-15 21:06:43 +0000589 SmallVector<BinaryOperator *, 1> InstChain;
John Brawn29bbed32018-02-23 17:17:31 +0000590 while (!CmpPHI && CmpLHS && isa<BinaryOperator>(CmpLHS) &&
591 isa<Constant>(CmpLHS->getOperand(1))) {
592 // Stop if the chain extends outside of the loop
593 if (!L->contains(CmpLHS))
594 return;
Benjamin Kramer7f68a302018-06-15 21:06:43 +0000595 InstChain.push_back(cast<BinaryOperator>(CmpLHS));
John Brawn29bbed32018-02-23 17:17:31 +0000596 CmpLHS = dyn_cast<Instruction>(CmpLHS->getOperand(0));
597 if (CmpLHS)
598 CmpPHI = dyn_cast<PHINode>(CmpLHS);
599 }
600 if (!CmpPHI || !L->contains(CmpPHI))
601 return;
602
603 // Trace the phi node to find all values that come from successors of BB
604 SmallPtrSet<PHINode*, 8> VisitedInsts;
605 SmallVector<PHINode*, 8> WorkList;
606 WorkList.push_back(CmpPHI);
607 VisitedInsts.insert(CmpPHI);
608 while (!WorkList.empty()) {
609 PHINode *P = WorkList.back();
610 WorkList.pop_back();
611 for (BasicBlock *B : P->blocks()) {
612 // Skip blocks that aren't part of the loop
613 if (!L->contains(B))
614 continue;
615 Value *V = P->getIncomingValueForBlock(B);
616 // If the source is a PHI add it to the work list if we haven't
617 // already visited it.
618 if (PHINode *PN = dyn_cast<PHINode>(V)) {
619 if (VisitedInsts.insert(PN).second)
620 WorkList.push_back(PN);
621 continue;
622 }
623 // If this incoming value is a constant and B is a successor of BB, then
624 // we can constant-evaluate the compare to see if it makes the branch be
625 // taken or not.
626 Constant *CmpLHSConst = dyn_cast<Constant>(V);
627 if (!CmpLHSConst ||
628 std::find(succ_begin(BB), succ_end(BB), B) == succ_end(BB))
629 continue;
630 // First collapse InstChain
Benjamin Kramer7f68a302018-06-15 21:06:43 +0000631 for (Instruction *I : llvm::reverse(InstChain)) {
John Brawn29bbed32018-02-23 17:17:31 +0000632 CmpLHSConst = ConstantExpr::get(I->getOpcode(), CmpLHSConst,
Benjamin Kramer7f68a302018-06-15 21:06:43 +0000633 cast<Constant>(I->getOperand(1)), true);
John Brawn29bbed32018-02-23 17:17:31 +0000634 if (!CmpLHSConst)
635 break;
636 }
637 if (!CmpLHSConst)
638 continue;
639 // Now constant-evaluate the compare
640 Constant *Result = ConstantExpr::getCompare(CI->getPredicate(),
641 CmpLHSConst, CmpConst, true);
642 // If the result means we don't branch to the block then that block is
643 // unlikely.
644 if (Result &&
645 ((Result->isZeroValue() && B == BI->getSuccessor(0)) ||
646 (Result->isOneValue() && B == BI->getSuccessor(1))))
647 UnlikelyBlocks.insert(B);
648 }
649 }
650}
651
Andrew Trick49371f32011-06-04 01:16:30 +0000652// Calculate Edge Weights using "Loop Branch Heuristics". Predict backedges
653// as taken, exiting edges as not-taken.
Mehdi Aminia7978772016-04-07 21:59:28 +0000654bool BranchProbabilityInfo::calcLoopBranchHeuristics(const BasicBlock *BB,
Geoff Berryeed65312017-11-01 15:16:50 +0000655 const LoopInfo &LI,
656 SccInfo &SccI) {
657 int SccNum;
Cong Houab23bfb2015-07-15 22:48:29 +0000658 Loop *L = LI.getLoopFor(BB);
Geoff Berryeed65312017-11-01 15:16:50 +0000659 if (!L) {
660 SccNum = getSCCNum(BB, SccI);
661 if (SccNum < 0)
662 return false;
663 }
Andrew Trick49371f32011-06-04 01:16:30 +0000664
John Brawn29bbed32018-02-23 17:17:31 +0000665 SmallPtrSet<const BasicBlock*, 8> UnlikelyBlocks;
666 if (L)
667 computeUnlikelySuccessors(BB, L, UnlikelyBlocks);
668
Manman Rencf104462012-08-24 18:14:27 +0000669 SmallVector<unsigned, 8> BackEdges;
670 SmallVector<unsigned, 8> ExitingEdges;
671 SmallVector<unsigned, 8> InEdges; // Edges from header to the loop.
John Brawn29bbed32018-02-23 17:17:31 +0000672 SmallVector<unsigned, 8> UnlikelyEdges;
Jakub Staszakbcb3c652011-07-28 21:33:46 +0000673
Alina Sbirlea3abcbf92020-03-10 11:33:02 -0700674 for (const_succ_iterator I = succ_begin(BB), E = succ_end(BB); I != E; ++I) {
Geoff Berryeed65312017-11-01 15:16:50 +0000675 // Use LoopInfo if we have it, otherwise fall-back to SCC info to catch
676 // irreducible loops.
677 if (L) {
John Brawn29bbed32018-02-23 17:17:31 +0000678 if (UnlikelyBlocks.count(*I) != 0)
679 UnlikelyEdges.push_back(I.getSuccessorIndex());
680 else if (!L->contains(*I))
Geoff Berryeed65312017-11-01 15:16:50 +0000681 ExitingEdges.push_back(I.getSuccessorIndex());
682 else if (L->getHeader() == *I)
683 BackEdges.push_back(I.getSuccessorIndex());
684 else
685 InEdges.push_back(I.getSuccessorIndex());
686 } else {
687 if (getSCCNum(*I, SccI) != SccNum)
688 ExitingEdges.push_back(I.getSuccessorIndex());
689 else if (isSCCHeader(*I, SccNum, SccI))
690 BackEdges.push_back(I.getSuccessorIndex());
691 else
692 InEdges.push_back(I.getSuccessorIndex());
693 }
Andrew Trick49371f32011-06-04 01:16:30 +0000694 }
695
John Brawn29bbed32018-02-23 17:17:31 +0000696 if (BackEdges.empty() && ExitingEdges.empty() && UnlikelyEdges.empty())
Akira Hatanaka5638b892014-04-14 16:56:19 +0000697 return false;
698
Cong Houe93b8e12015-12-22 18:56:14 +0000699 // Collect the sum of probabilities of back-edges/in-edges/exiting-edges, and
700 // normalize them so that they sum up to one.
Cong Houe93b8e12015-12-22 18:56:14 +0000701 unsigned Denom = (BackEdges.empty() ? 0 : LBH_TAKEN_WEIGHT) +
702 (InEdges.empty() ? 0 : LBH_TAKEN_WEIGHT) +
John Brawn29bbed32018-02-23 17:17:31 +0000703 (UnlikelyEdges.empty() ? 0 : LBH_UNLIKELY_WEIGHT) +
Cong Houe93b8e12015-12-22 18:56:14 +0000704 (ExitingEdges.empty() ? 0 : LBH_NONTAKEN_WEIGHT);
Andrew Trick49371f32011-06-04 01:16:30 +0000705
Yevgeny Rouban81384872020-05-21 11:49:11 +0700706 SmallVector<BranchProbability, 4> EdgeProbabilities(
707 BB->getTerminator()->getNumSuccessors(), BranchProbability::getUnknown());
Cong Houe93b8e12015-12-22 18:56:14 +0000708 if (uint32_t numBackEdges = BackEdges.size()) {
John Brawn29bbed32018-02-23 17:17:31 +0000709 BranchProbability TakenProb = BranchProbability(LBH_TAKEN_WEIGHT, Denom);
710 auto Prob = TakenProb / numBackEdges;
Cong Houe93b8e12015-12-22 18:56:14 +0000711 for (unsigned SuccIdx : BackEdges)
Yevgeny Rouban81384872020-05-21 11:49:11 +0700712 EdgeProbabilities[SuccIdx] = Prob;
Andrew Trick49371f32011-06-04 01:16:30 +0000713 }
714
Jakub Staszakbcb3c652011-07-28 21:33:46 +0000715 if (uint32_t numInEdges = InEdges.size()) {
John Brawn29bbed32018-02-23 17:17:31 +0000716 BranchProbability TakenProb = BranchProbability(LBH_TAKEN_WEIGHT, Denom);
717 auto Prob = TakenProb / numInEdges;
Cong Houe93b8e12015-12-22 18:56:14 +0000718 for (unsigned SuccIdx : InEdges)
Yevgeny Rouban81384872020-05-21 11:49:11 +0700719 EdgeProbabilities[SuccIdx] = Prob;
Jakub Staszakbcb3c652011-07-28 21:33:46 +0000720 }
721
Chandler Carruth32f46e72011-10-25 09:47:41 +0000722 if (uint32_t numExitingEdges = ExitingEdges.size()) {
John Brawn29bbed32018-02-23 17:17:31 +0000723 BranchProbability NotTakenProb = BranchProbability(LBH_NONTAKEN_WEIGHT,
724 Denom);
725 auto Prob = NotTakenProb / numExitingEdges;
Cong Houe93b8e12015-12-22 18:56:14 +0000726 for (unsigned SuccIdx : ExitingEdges)
Yevgeny Rouban81384872020-05-21 11:49:11 +0700727 EdgeProbabilities[SuccIdx] = Prob;
Andrew Trick49371f32011-06-04 01:16:30 +0000728 }
Jakub Staszakd07b2e12011-07-28 21:45:07 +0000729
John Brawn29bbed32018-02-23 17:17:31 +0000730 if (uint32_t numUnlikelyEdges = UnlikelyEdges.size()) {
731 BranchProbability UnlikelyProb = BranchProbability(LBH_UNLIKELY_WEIGHT,
732 Denom);
733 auto Prob = UnlikelyProb / numUnlikelyEdges;
734 for (unsigned SuccIdx : UnlikelyEdges)
Yevgeny Rouban81384872020-05-21 11:49:11 +0700735 EdgeProbabilities[SuccIdx] = Prob;
John Brawn29bbed32018-02-23 17:17:31 +0000736 }
737
Yevgeny Rouban81384872020-05-21 11:49:11 +0700738 setEdgeProbability(BB, EdgeProbabilities);
Jakub Staszakd07b2e12011-07-28 21:45:07 +0000739 return true;
Andrew Trick49371f32011-06-04 01:16:30 +0000740}
741
John Brawnda4a68a2017-06-08 09:44:40 +0000742bool BranchProbabilityInfo::calcZeroHeuristics(const BasicBlock *BB,
743 const TargetLibraryInfo *TLI) {
Mehdi Aminia7978772016-04-07 21:59:28 +0000744 const BranchInst *BI = dyn_cast<BranchInst>(BB->getTerminator());
Jakub Staszak17af66a2011-07-31 03:27:24 +0000745 if (!BI || !BI->isConditional())
746 return false;
747
748 Value *Cond = BI->getCondition();
749 ICmpInst *CI = dyn_cast<ICmpInst>(Cond);
750 if (!CI)
751 return false;
752
Sam Parker0b53e842019-02-15 11:50:21 +0000753 auto GetConstantInt = [](Value *V) {
754 if (auto *I = dyn_cast<BitCastInst>(V))
755 return dyn_cast<ConstantInt>(I->getOperand(0));
756 return dyn_cast<ConstantInt>(V);
757 };
758
Jakub Staszak17af66a2011-07-31 03:27:24 +0000759 Value *RHS = CI->getOperand(1);
Sam Parker0b53e842019-02-15 11:50:21 +0000760 ConstantInt *CV = GetConstantInt(RHS);
Benjamin Kramer0ca1ad02011-09-04 23:53:04 +0000761 if (!CV)
Jakub Staszak17af66a2011-07-31 03:27:24 +0000762 return false;
763
Daniel Jaspera73f3d52015-04-15 06:24:07 +0000764 // If the LHS is the result of AND'ing a value with a single bit bitmask,
765 // we don't have information about probabilities.
766 if (Instruction *LHS = dyn_cast<Instruction>(CI->getOperand(0)))
767 if (LHS->getOpcode() == Instruction::And)
768 if (ConstantInt *AndRHS = dyn_cast<ConstantInt>(LHS->getOperand(1)))
Craig Topper4e22ee62017-08-04 16:59:29 +0000769 if (AndRHS->getValue().isPowerOf2())
Daniel Jaspera73f3d52015-04-15 06:24:07 +0000770 return false;
771
John Brawnda4a68a2017-06-08 09:44:40 +0000772 // Check if the LHS is the return value of a library function
773 LibFunc Func = NumLibFuncs;
774 if (TLI)
775 if (CallInst *Call = dyn_cast<CallInst>(CI->getOperand(0)))
776 if (Function *CalledFn = Call->getCalledFunction())
777 TLI->getLibFunc(*CalledFn, Func);
778
Jakub Staszak17af66a2011-07-31 03:27:24 +0000779 bool isProb;
John Brawnda4a68a2017-06-08 09:44:40 +0000780 if (Func == LibFunc_strcasecmp ||
781 Func == LibFunc_strcmp ||
782 Func == LibFunc_strncasecmp ||
783 Func == LibFunc_strncmp ||
784 Func == LibFunc_memcmp) {
785 // strcmp and similar functions return zero, negative, or positive, if the
786 // first string is equal, less, or greater than the second. We consider it
787 // likely that the strings are not equal, so a comparison with zero is
788 // probably false, but also a comparison with any other number is also
789 // probably false given that what exactly is returned for nonzero values is
790 // not specified. Any kind of comparison other than equality we know
791 // nothing about.
792 switch (CI->getPredicate()) {
793 case CmpInst::ICMP_EQ:
794 isProb = false;
795 break;
796 case CmpInst::ICMP_NE:
797 isProb = true;
798 break;
799 default:
800 return false;
801 }
802 } else if (CV->isZero()) {
Benjamin Kramer0ca1ad02011-09-04 23:53:04 +0000803 switch (CI->getPredicate()) {
804 case CmpInst::ICMP_EQ:
805 // X == 0 -> Unlikely
806 isProb = false;
807 break;
808 case CmpInst::ICMP_NE:
809 // X != 0 -> Likely
810 isProb = true;
811 break;
812 case CmpInst::ICMP_SLT:
813 // X < 0 -> Unlikely
814 isProb = false;
815 break;
816 case CmpInst::ICMP_SGT:
817 // X > 0 -> Likely
818 isProb = true;
819 break;
820 default:
821 return false;
822 }
823 } else if (CV->isOne() && CI->getPredicate() == CmpInst::ICMP_SLT) {
824 // InstCombine canonicalizes X <= 0 into X < 1.
825 // X <= 0 -> Unlikely
Jakub Staszak17af66a2011-07-31 03:27:24 +0000826 isProb = false;
Craig Topper79ab6432017-07-06 18:39:47 +0000827 } else if (CV->isMinusOne()) {
Hal Finkel4d949302013-11-01 10:58:22 +0000828 switch (CI->getPredicate()) {
829 case CmpInst::ICMP_EQ:
830 // X == -1 -> Unlikely
831 isProb = false;
832 break;
833 case CmpInst::ICMP_NE:
834 // X != -1 -> Likely
835 isProb = true;
836 break;
837 case CmpInst::ICMP_SGT:
838 // InstCombine canonicalizes X >= 0 into X > -1.
839 // X >= 0 -> Likely
840 isProb = true;
841 break;
842 default:
843 return false;
844 }
Benjamin Kramer0ca1ad02011-09-04 23:53:04 +0000845 } else {
Jakub Staszak17af66a2011-07-31 03:27:24 +0000846 return false;
Benjamin Kramer0ca1ad02011-09-04 23:53:04 +0000847 }
Jakub Staszak17af66a2011-07-31 03:27:24 +0000848
Cong Houe93b8e12015-12-22 18:56:14 +0000849 BranchProbability TakenProb(ZH_TAKEN_WEIGHT,
850 ZH_TAKEN_WEIGHT + ZH_NONTAKEN_WEIGHT);
Yevgeny Rouban81384872020-05-21 11:49:11 +0700851 BranchProbability UntakenProb(ZH_NONTAKEN_WEIGHT,
852 ZH_TAKEN_WEIGHT + ZH_NONTAKEN_WEIGHT);
853 if (!isProb)
854 std::swap(TakenProb, UntakenProb);
855
856 setEdgeProbability(
857 BB, SmallVector<BranchProbability, 2>({TakenProb, UntakenProb}));
Jakub Staszak17af66a2011-07-31 03:27:24 +0000858 return true;
859}
860
Mehdi Aminia7978772016-04-07 21:59:28 +0000861bool BranchProbabilityInfo::calcFloatingPointHeuristics(const BasicBlock *BB) {
862 const BranchInst *BI = dyn_cast<BranchInst>(BB->getTerminator());
Benjamin Kramer1e731a12011-10-21 20:12:47 +0000863 if (!BI || !BI->isConditional())
864 return false;
865
866 Value *Cond = BI->getCondition();
867 FCmpInst *FCmp = dyn_cast<FCmpInst>(Cond);
Benjamin Kramer606a50a2011-10-21 21:13:47 +0000868 if (!FCmp)
Benjamin Kramer1e731a12011-10-21 20:12:47 +0000869 return false;
870
Guozhi Weib329e072019-09-10 17:25:11 +0000871 uint32_t TakenWeight = FPH_TAKEN_WEIGHT;
872 uint32_t NontakenWeight = FPH_NONTAKEN_WEIGHT;
Benjamin Kramer606a50a2011-10-21 21:13:47 +0000873 bool isProb;
874 if (FCmp->isEquality()) {
875 // f1 == f2 -> Unlikely
876 // f1 != f2 -> Likely
877 isProb = !FCmp->isTrueWhenEqual();
878 } else if (FCmp->getPredicate() == FCmpInst::FCMP_ORD) {
879 // !isnan -> Likely
880 isProb = true;
Guozhi Weib329e072019-09-10 17:25:11 +0000881 TakenWeight = FPH_ORD_WEIGHT;
882 NontakenWeight = FPH_UNO_WEIGHT;
Benjamin Kramer606a50a2011-10-21 21:13:47 +0000883 } else if (FCmp->getPredicate() == FCmpInst::FCMP_UNO) {
884 // isnan -> Unlikely
885 isProb = false;
Guozhi Weib329e072019-09-10 17:25:11 +0000886 TakenWeight = FPH_ORD_WEIGHT;
887 NontakenWeight = FPH_UNO_WEIGHT;
Benjamin Kramer606a50a2011-10-21 21:13:47 +0000888 } else {
889 return false;
890 }
891
Reid Kleckner13707572020-05-13 08:23:09 -0700892 BranchProbability TakenProb(TakenWeight, TakenWeight + NontakenWeight);
Yevgeny Rouban81384872020-05-21 11:49:11 +0700893 BranchProbability UntakenProb(NontakenWeight, TakenWeight + NontakenWeight);
894 if (!isProb)
895 std::swap(TakenProb, UntakenProb);
896
897 setEdgeProbability(
898 BB, SmallVector<BranchProbability, 2>({TakenProb, UntakenProb}));
Benjamin Kramer1e731a12011-10-21 20:12:47 +0000899 return true;
900}
Jakub Staszak17af66a2011-07-31 03:27:24 +0000901
Mehdi Aminia7978772016-04-07 21:59:28 +0000902bool BranchProbabilityInfo::calcInvokeHeuristics(const BasicBlock *BB) {
903 const InvokeInst *II = dyn_cast<InvokeInst>(BB->getTerminator());
Bill Wendlinge1c54262012-08-15 12:22:35 +0000904 if (!II)
905 return false;
906
Cong Houe93b8e12015-12-22 18:56:14 +0000907 BranchProbability TakenProb(IH_TAKEN_WEIGHT,
908 IH_TAKEN_WEIGHT + IH_NONTAKEN_WEIGHT);
Yevgeny Rouban81384872020-05-21 11:49:11 +0700909 setEdgeProbability(
910 BB, SmallVector<BranchProbability, 2>({TakenProb, TakenProb.getCompl()}));
Bill Wendlinge1c54262012-08-15 12:22:35 +0000911 return true;
912}
913
Pete Cooperb9d2e342015-05-28 19:43:06 +0000914void BranchProbabilityInfo::releaseMemory() {
Cong Houe93b8e12015-12-22 18:56:14 +0000915 Probs.clear();
Nikita Popovfe8abbf2020-04-07 21:21:30 +0200916 Handles.clear();
Pete Cooperb9d2e342015-05-28 19:43:06 +0000917}
918
Alina Sbirlea62a50a92020-01-15 14:02:33 -0800919bool BranchProbabilityInfo::invalidate(Function &, const PreservedAnalyses &PA,
920 FunctionAnalysisManager::Invalidator &) {
921 // Check whether the analysis, all analyses on functions, or the function's
922 // CFG have been preserved.
923 auto PAC = PA.getChecker<BranchProbabilityAnalysis>();
924 return !(PAC.preserved() || PAC.preservedSet<AllAnalysesOn<Function>>() ||
925 PAC.preservedSet<CFGAnalyses>());
926}
927
Cong Houab23bfb2015-07-15 22:48:29 +0000928void BranchProbabilityInfo::print(raw_ostream &OS) const {
Chandler Carruth1c8ace02011-10-23 21:21:50 +0000929 OS << "---- Branch Probabilities ----\n";
930 // We print the probabilities from the last function the analysis ran over,
931 // or the function it is currently running over.
932 assert(LastF && "Cannot print prior to running over a function");
Duncan P. N. Exon Smith5a82c912015-10-10 00:53:03 +0000933 for (const auto &BI : *LastF) {
Alina Sbirlea3abcbf92020-03-10 11:33:02 -0700934 for (const_succ_iterator SI = succ_begin(&BI), SE = succ_end(&BI); SI != SE;
Duncan P. N. Exon Smith5a82c912015-10-10 00:53:03 +0000935 ++SI) {
936 printEdgeProbability(OS << " ", &BI, *SI);
Duncan P. N. Exon Smith6c990152014-07-21 17:06:51 +0000937 }
938 }
Chandler Carruth1c8ace02011-10-23 21:21:50 +0000939}
940
Jakub Staszakefd94c82011-07-29 19:30:00 +0000941bool BranchProbabilityInfo::
942isEdgeHot(const BasicBlock *Src, const BasicBlock *Dst) const {
Andrew Trick3d4e64b2011-06-11 01:05:22 +0000943 // Hot probability is at least 4/5 = 80%
Benjamin Kramer929f53f2011-10-23 11:19:14 +0000944 // FIXME: Compare against a static "hot" BranchProbability.
945 return getEdgeProbability(Src, Dst) > BranchProbability(4, 5);
Andrew Trick49371f32011-06-04 01:16:30 +0000946}
947
Mehdi Aminia7978772016-04-07 21:59:28 +0000948const BasicBlock *
949BranchProbabilityInfo::getHotSucc(const BasicBlock *BB) const {
Cong Houe93b8e12015-12-22 18:56:14 +0000950 auto MaxProb = BranchProbability::getZero();
Mehdi Aminia7978772016-04-07 21:59:28 +0000951 const BasicBlock *MaxSucc = nullptr;
Andrew Trick49371f32011-06-04 01:16:30 +0000952
Alina Sbirlea3abcbf92020-03-10 11:33:02 -0700953 for (const_succ_iterator I = succ_begin(BB), E = succ_end(BB); I != E; ++I) {
Mehdi Aminia7978772016-04-07 21:59:28 +0000954 const BasicBlock *Succ = *I;
Cong Houe93b8e12015-12-22 18:56:14 +0000955 auto Prob = getEdgeProbability(BB, Succ);
956 if (Prob > MaxProb) {
957 MaxProb = Prob;
Andrew Trick49371f32011-06-04 01:16:30 +0000958 MaxSucc = Succ;
959 }
960 }
961
Benjamin Kramer929f53f2011-10-23 11:19:14 +0000962 // Hot probability is at least 4/5 = 80%
Cong Houe93b8e12015-12-22 18:56:14 +0000963 if (MaxProb > BranchProbability(4, 5))
Andrew Trick49371f32011-06-04 01:16:30 +0000964 return MaxSucc;
965
Craig Topper9f008862014-04-15 04:59:12 +0000966 return nullptr;
Andrew Trick49371f32011-06-04 01:16:30 +0000967}
968
Cong Houe93b8e12015-12-22 18:56:14 +0000969/// Get the raw edge probability for the edge. If can't find it, return a
970/// default probability 1/N where N is the number of successors. Here an edge is
971/// specified using PredBlock and an
972/// index to the successors.
973BranchProbability
974BranchProbabilityInfo::getEdgeProbability(const BasicBlock *Src,
975 unsigned IndexInSuccessors) const {
976 auto I = Probs.find(std::make_pair(Src, IndexInSuccessors));
Andrew Trick49371f32011-06-04 01:16:30 +0000977
Cong Houe93b8e12015-12-22 18:56:14 +0000978 if (I != Probs.end())
Andrew Trick49371f32011-06-04 01:16:30 +0000979 return I->second;
980
Vedant Kumare0b5f862018-05-10 23:01:54 +0000981 return {1, static_cast<uint32_t>(succ_size(Src))};
Andrew Trick49371f32011-06-04 01:16:30 +0000982}
983
Cong Houd97c1002015-12-01 05:29:22 +0000984BranchProbability
985BranchProbabilityInfo::getEdgeProbability(const BasicBlock *Src,
Alina Sbirlea3abcbf92020-03-10 11:33:02 -0700986 const_succ_iterator Dst) const {
Cong Houd97c1002015-12-01 05:29:22 +0000987 return getEdgeProbability(Src, Dst.getSuccessorIndex());
988}
989
Cong Houe93b8e12015-12-22 18:56:14 +0000990/// Get the raw edge probability calculated for the block pair. This returns the
991/// sum of all raw edge probabilities from Src to Dst.
992BranchProbability
993BranchProbabilityInfo::getEdgeProbability(const BasicBlock *Src,
994 const BasicBlock *Dst) const {
995 auto Prob = BranchProbability::getZero();
996 bool FoundProb = false;
Evgeniy Brevnovbb0842a2020-04-29 14:08:01 +0700997 uint32_t EdgeCount = 0;
Alina Sbirlea3abcbf92020-03-10 11:33:02 -0700998 for (const_succ_iterator I = succ_begin(Src), E = succ_end(Src); I != E; ++I)
Cong Houe93b8e12015-12-22 18:56:14 +0000999 if (*I == Dst) {
Evgeniy Brevnovbb0842a2020-04-29 14:08:01 +07001000 ++EdgeCount;
Cong Houe93b8e12015-12-22 18:56:14 +00001001 auto MapI = Probs.find(std::make_pair(Src, I.getSuccessorIndex()));
1002 if (MapI != Probs.end()) {
1003 FoundProb = true;
1004 Prob += MapI->second;
1005 }
1006 }
1007 uint32_t succ_num = std::distance(succ_begin(Src), succ_end(Src));
Evgeniy Brevnovbb0842a2020-04-29 14:08:01 +07001008 return FoundProb ? Prob : BranchProbability(EdgeCount, succ_num);
Cong Houe93b8e12015-12-22 18:56:14 +00001009}
1010
1011/// Set the edge probability for a given edge specified by PredBlock and an
1012/// index to the successors.
1013void BranchProbabilityInfo::setEdgeProbability(const BasicBlock *Src,
1014 unsigned IndexInSuccessors,
1015 BranchProbability Prob) {
1016 Probs[std::make_pair(Src, IndexInSuccessors)] = Prob;
Igor Laevskyee40d1e2016-07-15 14:31:16 +00001017 Handles.insert(BasicBlockCallbackVH(Src, this));
Nicola Zaghend34e60c2018-05-14 12:53:11 +00001018 LLVM_DEBUG(dbgs() << "set edge " << Src->getName() << " -> "
1019 << IndexInSuccessors << " successor probability to " << Prob
1020 << "\n");
Cong Houe93b8e12015-12-22 18:56:14 +00001021}
1022
Yevgeny Rouban81384872020-05-21 11:49:11 +07001023/// Set the edge probability for all edges at once.
1024void BranchProbabilityInfo::setEdgeProbability(
1025 const BasicBlock *Src, const SmallVectorImpl<BranchProbability> &Probs) {
1026 assert(Src->getTerminator()->getNumSuccessors() == Probs.size());
1027 if (Probs.size() == 0)
1028 return; // Nothing to set.
1029
1030 uint64_t TotalNumerator = 0;
1031 for (unsigned SuccIdx = 0; SuccIdx < Probs.size(); ++SuccIdx) {
1032 setEdgeProbability(Src, SuccIdx, Probs[SuccIdx]);
1033 TotalNumerator += Probs[SuccIdx].getNumerator();
1034 }
1035
1036 // Because of rounding errors the total probability cannot be checked to be
1037 // 1.0 exactly. That is TotalNumerator == BranchProbability::getDenominator.
1038 // Instead, every single probability in Probs must be as accurate as possible.
1039 // This results in error 1/denominator at most, thus the total absolute error
1040 // should be within Probs.size / BranchProbability::getDenominator.
1041 assert(TotalNumerator <= BranchProbability::getDenominator() + Probs.size());
1042 assert(TotalNumerator >= BranchProbability::getDenominator() - Probs.size());
1043}
1044
Andrew Trick49371f32011-06-04 01:16:30 +00001045raw_ostream &
Chandler Carruth1c8ace02011-10-23 21:21:50 +00001046BranchProbabilityInfo::printEdgeProbability(raw_ostream &OS,
1047 const BasicBlock *Src,
1048 const BasicBlock *Dst) const {
Jakub Staszak12a43bd2011-06-16 20:22:37 +00001049 const BranchProbability Prob = getEdgeProbability(Src, Dst);
Benjamin Kramer1f97a5a2011-11-15 16:27:03 +00001050 OS << "edge " << Src->getName() << " -> " << Dst->getName()
Andrew Trick3d4e64b2011-06-11 01:05:22 +00001051 << " probability is " << Prob
1052 << (isEdgeHot(Src, Dst) ? " [HOT edge]\n" : "\n");
Andrew Trick49371f32011-06-04 01:16:30 +00001053
1054 return OS;
1055}
Cong Houab23bfb2015-07-15 22:48:29 +00001056
Igor Laevskyee40d1e2016-07-15 14:31:16 +00001057void BranchProbabilityInfo::eraseBlock(const BasicBlock *BB) {
1058 for (auto I = Probs.begin(), E = Probs.end(); I != E; ++I) {
1059 auto Key = I->first;
1060 if (Key.first == BB)
1061 Probs.erase(Key);
1062 }
1063}
1064
John Brawnda4a68a2017-06-08 09:44:40 +00001065void BranchProbabilityInfo::calculate(const Function &F, const LoopInfo &LI,
Evgeniy Brevnov3e68a6672020-04-28 16:31:20 +07001066 const TargetLibraryInfo *TLI,
1067 PostDominatorTree *PDT) {
Nicola Zaghend34e60c2018-05-14 12:53:11 +00001068 LLVM_DEBUG(dbgs() << "---- Branch Probability Info : " << F.getName()
1069 << " ----\n\n");
Cong Houab23bfb2015-07-15 22:48:29 +00001070 LastF = &F; // Store the last function we ran on for printing.
1071 assert(PostDominatedByUnreachable.empty());
1072 assert(PostDominatedByColdCall.empty());
1073
Geoff Berryeed65312017-11-01 15:16:50 +00001074 // Record SCC numbers of blocks in the CFG to identify irreducible loops.
1075 // FIXME: We could only calculate this if the CFG is known to be irreducible
1076 // (perhaps cache this info in LoopInfo if we can easily calculate it there?).
1077 int SccNum = 0;
1078 SccInfo SccI;
1079 for (scc_iterator<const Function *> It = scc_begin(&F); !It.isAtEnd();
1080 ++It, ++SccNum) {
1081 // Ignore single-block SCCs since they either aren't loops or LoopInfo will
1082 // catch them.
1083 const std::vector<const BasicBlock *> &Scc = *It;
1084 if (Scc.size() == 1)
1085 continue;
1086
Nicola Zaghend34e60c2018-05-14 12:53:11 +00001087 LLVM_DEBUG(dbgs() << "BPI: SCC " << SccNum << ":");
Geoff Berryeed65312017-11-01 15:16:50 +00001088 for (auto *BB : Scc) {
Nicola Zaghend34e60c2018-05-14 12:53:11 +00001089 LLVM_DEBUG(dbgs() << " " << BB->getName());
Geoff Berryeed65312017-11-01 15:16:50 +00001090 SccI.SccNums[BB] = SccNum;
1091 }
Nicola Zaghend34e60c2018-05-14 12:53:11 +00001092 LLVM_DEBUG(dbgs() << "\n");
Geoff Berryeed65312017-11-01 15:16:50 +00001093 }
1094
Evgeniy Brevnov3e68a6672020-04-28 16:31:20 +07001095 std::unique_ptr<PostDominatorTree> PDTPtr;
1096
1097 if (!PDT) {
1098 PDTPtr = std::make_unique<PostDominatorTree>(const_cast<Function &>(F));
1099 PDT = PDTPtr.get();
1100 }
1101
1102 computePostDominatedByUnreachable(F, PDT);
1103 computePostDominatedByColdCall(F, PDT);
Taewook Oh2da205d2019-12-02 10:15:22 -08001104
Cong Houab23bfb2015-07-15 22:48:29 +00001105 // Walk the basic blocks in post-order so that we can build up state about
1106 // the successors of a block iteratively.
1107 for (auto BB : post_order(&F.getEntryBlock())) {
Nicola Zaghend34e60c2018-05-14 12:53:11 +00001108 LLVM_DEBUG(dbgs() << "Computing probabilities for " << BB->getName()
1109 << "\n");
Serguei Katkov11d9c4f2017-04-17 06:39:47 +00001110 // If there is no at least two successors, no sense to set probability.
1111 if (BB->getTerminator()->getNumSuccessors() < 2)
1112 continue;
Cong Houab23bfb2015-07-15 22:48:29 +00001113 if (calcMetadataWeights(BB))
1114 continue;
Artur Pilipenko4d063e72018-06-08 13:03:21 +00001115 if (calcInvokeHeuristics(BB))
1116 continue;
Serguei Katkov2616bbb2017-04-17 04:33:04 +00001117 if (calcUnreachableHeuristics(BB))
1118 continue;
Cong Houab23bfb2015-07-15 22:48:29 +00001119 if (calcColdCallHeuristics(BB))
1120 continue;
Geoff Berryeed65312017-11-01 15:16:50 +00001121 if (calcLoopBranchHeuristics(BB, LI, SccI))
Cong Houab23bfb2015-07-15 22:48:29 +00001122 continue;
1123 if (calcPointerHeuristics(BB))
1124 continue;
John Brawnda4a68a2017-06-08 09:44:40 +00001125 if (calcZeroHeuristics(BB, TLI))
Cong Houab23bfb2015-07-15 22:48:29 +00001126 continue;
1127 if (calcFloatingPointHeuristics(BB))
1128 continue;
Cong Houab23bfb2015-07-15 22:48:29 +00001129 }
1130
1131 PostDominatedByUnreachable.clear();
1132 PostDominatedByColdCall.clear();
Hiroshi Yamauchi63e17eb2017-08-26 00:31:00 +00001133
1134 if (PrintBranchProb &&
1135 (PrintBranchProbFuncName.empty() ||
1136 F.getName().equals(PrintBranchProbFuncName))) {
1137 print(dbgs());
1138 }
Cong Houab23bfb2015-07-15 22:48:29 +00001139}
1140
1141void BranchProbabilityInfoWrapperPass::getAnalysisUsage(
1142 AnalysisUsage &AU) const {
Mikael Holmen2ca16892018-05-17 09:05:40 +00001143 // We require DT so it's available when LI is available. The LI updating code
1144 // asserts that DT is also present so if we don't make sure that we have DT
1145 // here, that assert will trigger.
1146 AU.addRequired<DominatorTreeWrapperPass>();
Cong Houab23bfb2015-07-15 22:48:29 +00001147 AU.addRequired<LoopInfoWrapperPass>();
John Brawnda4a68a2017-06-08 09:44:40 +00001148 AU.addRequired<TargetLibraryInfoWrapperPass>();
Evgeniy Brevnov3e68a6672020-04-28 16:31:20 +07001149 AU.addRequired<PostDominatorTreeWrapperPass>();
Cong Houab23bfb2015-07-15 22:48:29 +00001150 AU.setPreservesAll();
1151}
1152
1153bool BranchProbabilityInfoWrapperPass::runOnFunction(Function &F) {
1154 const LoopInfo &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
Teresa Johnson9c27b592019-09-07 03:09:36 +00001155 const TargetLibraryInfo &TLI =
1156 getAnalysis<TargetLibraryInfoWrapperPass>().getTLI(F);
Evgeniy Brevnov3e68a6672020-04-28 16:31:20 +07001157 PostDominatorTree &PDT =
1158 getAnalysis<PostDominatorTreeWrapperPass>().getPostDomTree();
1159 BPI.calculate(F, LI, &TLI, &PDT);
Cong Houab23bfb2015-07-15 22:48:29 +00001160 return false;
1161}
1162
1163void BranchProbabilityInfoWrapperPass::releaseMemory() { BPI.releaseMemory(); }
1164
1165void BranchProbabilityInfoWrapperPass::print(raw_ostream &OS,
1166 const Module *) const {
1167 BPI.print(OS);
1168}
Xinliang David Li6e5dd412016-05-05 02:59:57 +00001169
Chandler Carruthdab4eae2016-11-23 17:53:26 +00001170AnalysisKey BranchProbabilityAnalysis::Key;
Xinliang David Li6e5dd412016-05-05 02:59:57 +00001171BranchProbabilityInfo
Sean Silva36e0d012016-08-09 00:28:15 +00001172BranchProbabilityAnalysis::run(Function &F, FunctionAnalysisManager &AM) {
Xinliang David Li6e5dd412016-05-05 02:59:57 +00001173 BranchProbabilityInfo BPI;
Evgeniy Brevnov3e68a6672020-04-28 16:31:20 +07001174 BPI.calculate(F, AM.getResult<LoopAnalysis>(F),
1175 &AM.getResult<TargetLibraryAnalysis>(F),
1176 &AM.getResult<PostDominatorTreeAnalysis>(F));
Xinliang David Li6e5dd412016-05-05 02:59:57 +00001177 return BPI;
1178}
1179
1180PreservedAnalyses
Sean Silva36e0d012016-08-09 00:28:15 +00001181BranchProbabilityPrinterPass::run(Function &F, FunctionAnalysisManager &AM) {
Xinliang David Li6e5dd412016-05-05 02:59:57 +00001182 OS << "Printing analysis results of BPI for function "
1183 << "'" << F.getName() << "':"
1184 << "\n";
1185 AM.getResult<BranchProbabilityAnalysis>(F).print(OS);
1186 return PreservedAnalyses::all();
1187}