LLVM 23.0.0git
BranchProbabilityInfo.cpp
Go to the documentation of this file.
1//===- BranchProbabilityInfo.cpp - Branch Probability Analysis ------------===//
2//
3// 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
6//
7//===----------------------------------------------------------------------===//
8//
9// Loops should be simplified before this analysis.
10//
11//===----------------------------------------------------------------------===//
12
16#include "llvm/ADT/STLExtras.h"
22#include "llvm/IR/Attributes.h"
23#include "llvm/IR/BasicBlock.h"
24#include "llvm/IR/CFG.h"
25#include "llvm/IR/Constants.h"
26#include "llvm/IR/Dominators.h"
27#include "llvm/IR/Function.h"
28#include "llvm/IR/InstrTypes.h"
29#include "llvm/IR/Instruction.h"
31#include "llvm/IR/LLVMContext.h"
32#include "llvm/IR/Metadata.h"
33#include "llvm/IR/PassManager.h"
35#include "llvm/IR/Type.h"
36#include "llvm/IR/Value.h"
38#include "llvm/Pass.h"
42#include "llvm/Support/Debug.h"
44#include <cassert>
45#include <cstdint>
46#include <map>
47#include <utility>
48
49using namespace llvm;
50
51#define DEBUG_TYPE "branch-prob"
52
54 "print-bpi", cl::init(false), cl::Hidden,
55 cl::desc("Print the branch probability info."));
56
58 "print-bpi-func-name", cl::Hidden,
59 cl::desc("The option to specify the name of the function "
60 "whose branch probability info is printed."));
61
63 "Branch Probability Analysis", false, true)
69 "Branch Probability Analysis", false, true)
70
73
75
76// 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;
98
99/// Unreachable-terminating branch taken probability.
100///
101/// This is the probability for a branch being taken to a block that terminates
102/// (eventually) in unreachable. These are predicted as unlikely as possible.
103/// All reachable probability will proportionally share the remaining part.
105
106/// Heuristics and lookup tables for non-loop branches:
107/// Pointer Heuristics (PH)
108static const uint32_t PH_TAKEN_WEIGHT = 20;
109static const uint32_t PH_NONTAKEN_WEIGHT = 12;
110static const BranchProbability
112static const BranchProbability
114
116using ProbabilityTable = std::map<CmpInst::Predicate, ProbabilityList>;
117
118/// Pointer comparisons:
120 {ICmpInst::ICMP_NE, {PtrTakenProb, PtrUntakenProb}}, /// p != q -> Likely
121 {ICmpInst::ICMP_EQ, {PtrUntakenProb, PtrTakenProb}}, /// p == q -> Unlikely
122};
123
124/// Zero Heuristics (ZH)
125static const uint32_t ZH_TAKEN_WEIGHT = 20;
126static const uint32_t ZH_NONTAKEN_WEIGHT = 12;
127static const BranchProbability
129static const BranchProbability
131
132/// Integer compares with 0:
134 {CmpInst::ICMP_EQ, {ZeroUntakenProb, ZeroTakenProb}}, /// X == 0 -> Unlikely
135 {CmpInst::ICMP_NE, {ZeroTakenProb, ZeroUntakenProb}}, /// X != 0 -> Likely
136 {CmpInst::ICMP_SLT, {ZeroUntakenProb, ZeroTakenProb}}, /// X < 0 -> Unlikely
137 {CmpInst::ICMP_SGT, {ZeroTakenProb, ZeroUntakenProb}}, /// X > 0 -> Likely
138};
139
140/// Integer compares with -1:
142 {CmpInst::ICMP_EQ, {ZeroUntakenProb, ZeroTakenProb}}, /// X == -1 -> Unlikely
143 {CmpInst::ICMP_NE, {ZeroTakenProb, ZeroUntakenProb}}, /// X != -1 -> Likely
144 // InstCombine canonicalizes X >= 0 into X > -1
145 {CmpInst::ICMP_SGT, {ZeroTakenProb, ZeroUntakenProb}}, /// X >= 0 -> Likely
146};
147
148/// Integer compares with 1:
150 // InstCombine canonicalizes X <= 0 into X < 1
151 {CmpInst::ICMP_SLT, {ZeroUntakenProb, ZeroTakenProb}}, /// X <= 0 -> Unlikely
152};
153
154/// strcmp and similar functions return zero, negative, or positive, if the
155/// first string is equal, less, or greater than the second. We consider it
156/// likely that the strings are not equal, so a comparison with zero is
157/// probably false, but also a comparison with any other number is also
158/// probably false given that what exactly is returned for nonzero values is
159/// not specified. Any kind of comparison other than equality we know
160/// nothing about.
165
166// Floating-Point Heuristics (FPH)
167static const uint32_t FPH_TAKEN_WEIGHT = 20;
169
170/// This is the probability for an ordered floating point comparison.
171static const uint32_t FPH_ORD_WEIGHT = 1024 * 1024 - 1;
172/// This is the probability for an unordered floating point comparison, it means
173/// one or two of the operands are NaN. Usually it is used to test for an
174/// exceptional case, so the result is unlikely.
175static const uint32_t FPH_UNO_WEIGHT = 1;
176
179static const BranchProbability
181static const BranchProbability
183static const BranchProbability
185
186/// Floating-Point compares:
188 {FCmpInst::FCMP_ORD, {FPOrdTakenProb, FPOrdUntakenProb}}, /// !isnan -> Likely
189 {FCmpInst::FCMP_UNO, {FPOrdUntakenProb, FPOrdTakenProb}}, /// isnan -> Unlikely
190};
191
192/// Set of dedicated "absolute" execution weights for a block. These weights are
193/// meaningful relative to each other and their derivatives only.
194enum class BlockExecWeight : std::uint32_t {
195 /// Special weight used for cases with exact zero probability.
196 ZERO = 0x0,
197 /// Minimal possible non zero weight.
199 /// Weight to an 'unreachable' block.
201 /// Weight to a block containing non returning call.
203 /// Weight to 'unwind' block of an invoke instruction.
205 /// Weight to a 'cold' block. Cold blocks are the ones containing calls marked
206 /// with attribute 'cold'.
207 COLD = 0xffff,
208 /// Default weight is used in cases when there is no dedicated execution
209 /// weight set. It is not propagated through the domination line either.
210 DEFAULT = 0xfffff
211};
212
213namespace {
214class BPIConstruction {
215public:
216 BPIConstruction(BranchProbabilityInfo &BPI) : BPI(BPI) {}
217 void calculate(const Function &F, const LoopInfo &LI,
218 const TargetLibraryInfo *TLI, DominatorTree *DT,
219 PostDominatorTree *PDT);
220
221private:
222 // Data structure to track SCCs for handling irreducible loops.
223 class SccInfo {
224 // Enum of types to classify basic blocks in SCC. Basic block belonging to
225 // SCC is 'Inner' until it is either 'Header' or 'Exiting'. Note that a
226 // basic block can be 'Header' and 'Exiting' at the same time.
227 enum SccBlockType {
228 Inner = 0x0,
229 Header = 0x1,
230 Exiting = 0x2,
231 };
232 // Map of basic blocks to SCC IDs they belong to. If basic block doesn't
233 // belong to any SCC it is not in the map.
234 using SccMap = DenseMap<const BasicBlock *, int>;
235 // Each basic block in SCC is attributed with one or several types from
236 // SccBlockType. Map value has uint32_t type (instead of SccBlockType)
237 // since basic block may be for example "Header" and "Exiting" at the same
238 // time and we need to be able to keep more than one value from
239 // SccBlockType.
240 using SccBlockTypeMap = DenseMap<const BasicBlock *, uint32_t>;
241 // Vector containing classification of basic blocks for all SCCs where i'th
242 // vector element corresponds to SCC with ID equal to i.
243 using SccBlockTypeMaps = std::vector<SccBlockTypeMap>;
244
245 SccMap SccNums;
246 SccBlockTypeMaps SccBlocks;
247
248 public:
249 LLVM_ABI explicit SccInfo(const Function &F);
250
251 /// If \p BB belongs to some SCC then ID of that SCC is returned, otherwise
252 /// -1 is returned. If \p BB belongs to more than one SCC at the same time
253 /// result is undefined.
254 LLVM_ABI int getSCCNum(const BasicBlock *BB) const;
255 /// Returns true if \p BB is a 'header' block in SCC with \p SccNum ID,
256 /// false otherwise.
257 bool isSCCHeader(const BasicBlock *BB, int SccNum) const {
258 return getSccBlockType(BB, SccNum) & Header;
259 }
260 /// Returns true if \p BB is an 'exiting' block in SCC with \p SccNum ID,
261 /// false otherwise.
262 bool isSCCExitingBlock(const BasicBlock *BB, int SccNum) const {
263 return getSccBlockType(BB, SccNum) & Exiting;
264 }
265 /// Fills in \p Enters vector with all such blocks that don't belong to
266 /// SCC with \p SccNum ID but there is an edge to a block belonging to the
267 /// SCC.
268 LLVM_ABI void
269 getSccEnterBlocks(int SccNum, SmallVectorImpl<BasicBlock *> &Enters) const;
270 /// Fills in \p Exits vector with all such blocks that don't belong to
271 /// SCC with \p SccNum ID but there is an edge from a block belonging to the
272 /// SCC.
273 LLVM_ABI void getSccExitBlocks(int SccNum,
274 SmallVectorImpl<BasicBlock *> &Exits) const;
275
276 private:
277 /// Returns \p BB's type according to classification given by SccBlockType
278 /// enum. Please note that \p BB must belong to SSC with \p SccNum ID.
279 LLVM_ABI uint32_t getSccBlockType(const BasicBlock *BB, int SccNum) const;
280 /// Calculates \p BB's type and stores it in internal data structures for
281 /// future use. Please note that \p BB must belong to SSC with \p SccNum ID.
282 void calculateSccBlockType(const BasicBlock *BB, int SccNum);
283 };
284
285 /// Pair of Loop and SCC ID number. Used to unify handling of normal and
286 /// SCC based loop representations.
287 using LoopData = std::pair<Loop *, int>;
288 /// Helper class to keep basic block along with its loop data information.
289 class LoopBlock {
290 public:
291 LLVM_ABI explicit LoopBlock(const BasicBlock *BB, const LoopInfo &LI,
292 const SccInfo &SccI);
293
294 const BasicBlock *getBlock() const { return BB; }
295 BasicBlock *getBlock() { return const_cast<BasicBlock *>(BB); }
296 LoopData getLoopData() const { return LD; }
297 Loop *getLoop() const { return LD.first; }
298 int getSccNum() const { return LD.second; }
299
300 bool belongsToLoop() const { return getLoop() || getSccNum() != -1; }
301 bool belongsToSameLoop(const LoopBlock &LB) const {
302 return (LB.getLoop() && getLoop() == LB.getLoop()) ||
303 (LB.getSccNum() != -1 && getSccNum() == LB.getSccNum());
304 }
305
306 private:
307 const BasicBlock *const BB = nullptr;
308 LoopData LD = {nullptr, -1};
309 };
310
311 // Pair of LoopBlocks representing an edge from first to second block.
312 using LoopEdge = std::pair<const LoopBlock &, const LoopBlock &>;
313
314 /// Helper to construct LoopBlock for \p BB.
315 LoopBlock getLoopBlock(const BasicBlock *BB) const {
316 return LoopBlock(BB, *LI, *SccI);
317 }
318
319 /// Returns true if destination block belongs to some loop and source block is
320 /// either doesn't belong to any loop or belongs to a loop which is not inner
321 /// relative to the destination block.
322 bool isLoopEnteringEdge(const LoopEdge &Edge) const;
323 /// Returns true if source block belongs to some loop and destination block is
324 /// either doesn't belong to any loop or belongs to a loop which is not inner
325 /// relative to the source block.
326 bool isLoopExitingEdge(const LoopEdge &Edge) const;
327 /// Returns true if \p Edge is either enters to or exits from some loop, false
328 /// in all other cases.
329 bool isLoopEnteringExitingEdge(const LoopEdge &Edge) const;
330 /// Returns true if source and destination blocks belongs to the same loop and
331 /// destination block is loop header.
332 bool isLoopBackEdge(const LoopEdge &Edge) const;
333 // Fills in \p Enters vector with all "enter" blocks to a loop \LB belongs to.
334 void getLoopEnterBlocks(const LoopBlock &LB,
335 SmallVectorImpl<BasicBlock *> &Enters) const;
336 // Fills in \p Exits vector with all "exit" blocks from a loop \LB belongs to.
337 void getLoopExitBlocks(const LoopBlock &LB,
338 SmallVectorImpl<BasicBlock *> &Exits) const;
339
340 /// Returns estimated weight for \p BB. std::nullopt if \p BB has no estimated
341 /// weight.
342 std::optional<uint32_t> getEstimatedBlockWeight(const BasicBlock *BB) const;
343
344 /// Returns estimated weight to enter \p L. In other words it is weight of
345 /// loop's header block not scaled by trip count. Returns std::nullopt if \p L
346 /// has no no estimated weight.
347 std::optional<uint32_t> getEstimatedLoopWeight(const LoopData &L) const;
348
349 /// Return estimated weight for \p Edge. Returns std::nullopt if estimated
350 /// weight is unknown.
351 std::optional<uint32_t> getEstimatedEdgeWeight(const LoopEdge &Edge) const;
352
353 /// Iterates over all edges leading from \p SrcBB to \p Successors and
354 /// returns maximum of all estimated weights. If at least one edge has unknown
355 /// estimated weight std::nullopt is returned.
356 template <class IterT>
357 std::optional<uint32_t>
358 getMaxEstimatedEdgeWeight(const LoopBlock &SrcBB,
359 iterator_range<IterT> Successors) const;
360
361 /// If \p LoopBB has no estimated weight then set it to \p BBWeight and
362 /// return true. Otherwise \p BB's weight remains unchanged and false is
363 /// returned. In addition all blocks/loops that might need their weight to be
364 /// re-estimated are put into BlockWorkList/LoopWorkList.
365 bool updateEstimatedBlockWeight(LoopBlock &LoopBB, uint32_t BBWeight,
366 SmallVectorImpl<BasicBlock *> &BlockWorkList,
367 SmallVectorImpl<LoopBlock> &LoopWorkList);
368
369 /// Starting from \p LoopBB (including \p LoopBB itself) propagate \p BBWeight
370 /// up the domination tree.
371 void propagateEstimatedBlockWeight(const LoopBlock &LoopBB, DominatorTree *DT,
372 PostDominatorTree *PDT, uint32_t BBWeight,
373 SmallVectorImpl<BasicBlock *> &WorkList,
374 SmallVectorImpl<LoopBlock> &LoopWorkList);
375
376 /// Returns block's weight encoded in the IR.
377 std::optional<uint32_t> getInitialEstimatedBlockWeight(const BasicBlock *BB);
378
379 // Computes estimated weights for all blocks in \p F.
380 void estimateBlockWeights(const Function &F, DominatorTree *DT,
381 PostDominatorTree *PDT);
382
383 /// Based on computed weights by \p computeEstimatedBlockWeight set
384 /// probabilities on branches.
385 bool calcEstimatedHeuristics(const BasicBlock *BB);
386 bool calcMetadataWeights(const BasicBlock *BB);
387 bool calcPointerHeuristics(const BasicBlock *BB);
388 bool calcZeroHeuristics(const BasicBlock *BB, const TargetLibraryInfo *TLI);
389 bool calcFloatingPointHeuristics(const BasicBlock *BB);
390
391 BranchProbabilityInfo &BPI;
392
393 const LoopInfo *LI = nullptr;
394
395 /// Keeps information about all SCCs in a function.
396 std::unique_ptr<const SccInfo> SccI;
397
398 /// Keeps mapping of a basic block to its estimated weight.
399 SmallDenseMap<const BasicBlock *, uint32_t> EstimatedBlockWeight;
400
401 /// Keeps mapping of a loop to estimated weight to enter the loop.
402 SmallDenseMap<LoopData, uint32_t> EstimatedLoopWeight;
403};
404
405BPIConstruction::SccInfo::SccInfo(const Function &F) {
406 // Record SCC numbers of blocks in the CFG to identify irreducible loops.
407 // FIXME: We could only calculate this if the CFG is known to be irreducible
408 // (perhaps cache this info in LoopInfo if we can easily calculate it there?).
409 int SccNum = 0;
410 for (scc_iterator<const Function *> It = scc_begin(&F); !It.isAtEnd();
411 ++It, ++SccNum) {
412 // Ignore single-block SCCs since they either aren't loops or LoopInfo will
413 // catch them.
414 const std::vector<const BasicBlock *> &Scc = *It;
415 if (Scc.size() == 1)
416 continue;
417
418 LLVM_DEBUG(dbgs() << "BPI: SCC " << SccNum << ":");
419 for (const auto *BB : Scc) {
420 LLVM_DEBUG(dbgs() << " " << BB->getName());
421 SccNums[BB] = SccNum;
422 calculateSccBlockType(BB, SccNum);
423 }
424 LLVM_DEBUG(dbgs() << "\n");
425 }
426}
427
428int BPIConstruction::SccInfo::getSCCNum(const BasicBlock *BB) const {
429 auto SccIt = SccNums.find(BB);
430 if (SccIt == SccNums.end())
431 return -1;
432 return SccIt->second;
433}
434
435void BPIConstruction::SccInfo::getSccEnterBlocks(
436 int SccNum, SmallVectorImpl<BasicBlock *> &Enters) const {
437
438 for (auto MapIt : SccBlocks[SccNum]) {
439 const auto *BB = MapIt.first;
440 if (isSCCHeader(BB, SccNum))
441 for (const auto *Pred : predecessors(BB))
442 if (getSCCNum(Pred) != SccNum)
443 Enters.push_back(const_cast<BasicBlock *>(BB));
444 }
445}
446
447void BPIConstruction::SccInfo::getSccExitBlocks(
448 int SccNum, SmallVectorImpl<BasicBlock *> &Exits) const {
449 for (auto MapIt : SccBlocks[SccNum]) {
450 const auto *BB = MapIt.first;
451 if (isSCCExitingBlock(BB, SccNum))
452 for (const auto *Succ : successors(BB))
453 if (getSCCNum(Succ) != SccNum)
454 Exits.push_back(const_cast<BasicBlock *>(Succ));
455 }
456}
457
458uint32_t BPIConstruction::SccInfo::getSccBlockType(const BasicBlock *BB,
459 int SccNum) const {
460 assert(getSCCNum(BB) == SccNum);
461
462 assert(SccBlocks.size() > static_cast<unsigned>(SccNum) && "Unknown SCC");
463 const auto &SccBlockTypes = SccBlocks[SccNum];
464
465 auto It = SccBlockTypes.find(BB);
466 if (It != SccBlockTypes.end()) {
467 return It->second;
468 }
469 return Inner;
470}
471
472void BPIConstruction::SccInfo::calculateSccBlockType(const BasicBlock *BB,
473 int SccNum) {
474 assert(getSCCNum(BB) == SccNum);
475 uint32_t BlockType = Inner;
476
477 if (llvm::any_of(predecessors(BB), [&](const BasicBlock *Pred) {
478 // Consider any block that is an entry point to the SCC as
479 // a header.
480 return getSCCNum(Pred) != SccNum;
481 }))
482 BlockType |= Header;
483
484 if (llvm::any_of(successors(BB), [&](const BasicBlock *Succ) {
485 return getSCCNum(Succ) != SccNum;
486 }))
487 BlockType |= Exiting;
488
489 // Lazily compute the set of headers for a given SCC and cache the results
490 // in the SccHeaderMap.
491 if (SccBlocks.size() <= static_cast<unsigned>(SccNum))
492 SccBlocks.resize(SccNum + 1);
493 auto &SccBlockTypes = SccBlocks[SccNum];
494
495 if (BlockType != Inner) {
496 bool IsInserted;
497 std::tie(std::ignore, IsInserted) =
498 SccBlockTypes.insert(std::make_pair(BB, BlockType));
499 assert(IsInserted && "Duplicated block in SCC");
500 }
501}
502
503BPIConstruction::LoopBlock::LoopBlock(const BasicBlock *BB, const LoopInfo &LI,
504 const SccInfo &SccI)
505 : BB(BB) {
506 LD.first = LI.getLoopFor(BB);
507 if (!LD.first) {
508 LD.second = SccI.getSCCNum(BB);
509 }
510}
511
512bool BPIConstruction::isLoopEnteringEdge(const LoopEdge &Edge) const {
513 const auto &SrcBlock = Edge.first;
514 const auto &DstBlock = Edge.second;
515 return (DstBlock.getLoop() &&
516 !DstBlock.getLoop()->contains(SrcBlock.getLoop())) ||
517 // Assume that SCCs can't be nested.
518 (DstBlock.getSccNum() != -1 &&
519 SrcBlock.getSccNum() != DstBlock.getSccNum());
520}
521
522bool BPIConstruction::isLoopExitingEdge(const LoopEdge &Edge) const {
523 return isLoopEnteringEdge({Edge.second, Edge.first});
524}
525
526bool BPIConstruction::isLoopEnteringExitingEdge(const LoopEdge &Edge) const {
527 return isLoopEnteringEdge(Edge) || isLoopExitingEdge(Edge);
528}
529
530bool BPIConstruction::isLoopBackEdge(const LoopEdge &Edge) const {
531 const auto &SrcBlock = Edge.first;
532 const auto &DstBlock = Edge.second;
533 return SrcBlock.belongsToSameLoop(DstBlock) &&
534 ((DstBlock.getLoop() &&
535 DstBlock.getLoop()->getHeader() == DstBlock.getBlock()) ||
536 (DstBlock.getSccNum() != -1 &&
537 SccI->isSCCHeader(DstBlock.getBlock(), DstBlock.getSccNum())));
538}
539
540void BPIConstruction::getLoopEnterBlocks(
541 const LoopBlock &LB, SmallVectorImpl<BasicBlock *> &Enters) const {
542 if (LB.getLoop()) {
543 auto *Header = LB.getLoop()->getHeader();
544 Enters.append(pred_begin(Header), pred_end(Header));
545 } else {
546 assert(LB.getSccNum() != -1 && "LB doesn't belong to any loop?");
547 SccI->getSccEnterBlocks(LB.getSccNum(), Enters);
548 }
549}
550
551void BPIConstruction::getLoopExitBlocks(
552 const LoopBlock &LB, SmallVectorImpl<BasicBlock *> &Exits) const {
553 if (LB.getLoop()) {
554 LB.getLoop()->getExitBlocks(Exits);
555 } else {
556 assert(LB.getSccNum() != -1 && "LB doesn't belong to any loop?");
557 SccI->getSccExitBlocks(LB.getSccNum(), Exits);
558 }
559}
560
561// Propagate existing explicit probabilities from either profile data or
562// 'expect' intrinsic processing. Examine metadata against unreachable
563// heuristic. The probability of the edge coming to unreachable block is
564// set to min of metadata and unreachable heuristic.
565bool BPIConstruction::calcMetadataWeights(const BasicBlock *BB) {
566 const Instruction *TI = BB->getTerminator();
567 assert(TI->getNumSuccessors() > 1 && "expected more than one successor!");
568 if (!(isa<CondBrInst>(TI) || isa<SwitchInst>(TI) || isa<IndirectBrInst>(TI) ||
570 return false;
571
572 MDNode *WeightsNode = getValidBranchWeightMDNode(*TI);
573 if (!WeightsNode)
574 return false;
575
576 // Check that the number of successors is manageable.
577 assert(TI->getNumSuccessors() < UINT32_MAX && "Too many successors");
578
579 // Build up the final weights that will be used in a temporary buffer.
580 // Compute the sum of all weights to later decide whether they need to
581 // be scaled to fit in 32 bits.
582 uint64_t WeightSum = 0;
584 SmallVector<unsigned, 2> UnreachableIdxs;
585 SmallVector<unsigned, 2> ReachableIdxs;
586
587 extractBranchWeights(WeightsNode, Weights);
588 auto Succs = succ_begin(TI);
589 for (unsigned I = 0, E = Weights.size(); I != E; ++I) {
590 WeightSum += Weights[I];
591 const LoopBlock SrcLoopBB = getLoopBlock(BB);
592 const LoopBlock DstLoopBB = getLoopBlock(*Succs++);
593 auto EstimatedWeight = getEstimatedEdgeWeight({SrcLoopBB, DstLoopBB});
594 if (EstimatedWeight &&
595 *EstimatedWeight <= static_cast<uint32_t>(BlockExecWeight::UNREACHABLE))
596 UnreachableIdxs.push_back(I);
597 else
598 ReachableIdxs.push_back(I);
599 }
600 assert(Weights.size() == TI->getNumSuccessors() && "Checked above");
601
602 // If the sum of weights does not fit in 32 bits, scale every weight down
603 // accordingly.
604 uint64_t ScalingFactor =
605 (WeightSum > UINT32_MAX) ? WeightSum / UINT32_MAX + 1 : 1;
606
607 if (ScalingFactor > 1) {
608 WeightSum = 0;
609 for (unsigned I = 0, E = TI->getNumSuccessors(); I != E; ++I) {
610 Weights[I] /= ScalingFactor;
611 WeightSum += Weights[I];
612 }
613 }
614 assert(WeightSum <= UINT32_MAX &&
615 "Expected weights to scale down to 32 bits");
616
617 if (WeightSum == 0 || ReachableIdxs.size() == 0) {
618 for (unsigned I = 0, E = TI->getNumSuccessors(); I != E; ++I)
619 Weights[I] = 1;
620 WeightSum = TI->getNumSuccessors();
621 }
622
623 // Set the probability.
625 for (unsigned I = 0, E = TI->getNumSuccessors(); I != E; ++I)
626 BP.push_back({ Weights[I], static_cast<uint32_t>(WeightSum) });
627
628 // Examine the metadata against unreachable heuristic.
629 // If the unreachable heuristic is more strong then we use it for this edge.
630 if (UnreachableIdxs.size() == 0 || ReachableIdxs.size() == 0) {
631 BPI.setEdgeProbability(BB, BP);
632 return true;
633 }
634
635 auto UnreachableProb = UR_TAKEN_PROB;
636 for (auto I : UnreachableIdxs)
637 if (UnreachableProb < BP[I]) {
638 BP[I] = UnreachableProb;
639 }
640
641 // Sum of all edge probabilities must be 1.0. If we modified the probability
642 // of some edges then we must distribute the introduced difference over the
643 // reachable blocks.
644 //
645 // Proportional distribution: the relation between probabilities of the
646 // reachable edges is kept unchanged. That is for any reachable edges i and j:
647 // newBP[i] / newBP[j] == oldBP[i] / oldBP[j] =>
648 // newBP[i] / oldBP[i] == newBP[j] / oldBP[j] == K
649 // Where K is independent of i,j.
650 // newBP[i] == oldBP[i] * K
651 // We need to find K.
652 // Make sum of all reachables of the left and right parts:
653 // sum_of_reachable(newBP) == K * sum_of_reachable(oldBP)
654 // Sum of newBP must be equal to 1.0:
655 // sum_of_reachable(newBP) + sum_of_unreachable(newBP) == 1.0 =>
656 // sum_of_reachable(newBP) = 1.0 - sum_of_unreachable(newBP)
657 // Where sum_of_unreachable(newBP) is what has been just changed.
658 // Finally:
659 // K == sum_of_reachable(newBP) / sum_of_reachable(oldBP) =>
660 // K == (1.0 - sum_of_unreachable(newBP)) / sum_of_reachable(oldBP)
661 BranchProbability NewUnreachableSum = BranchProbability::getZero();
662 for (auto I : UnreachableIdxs)
663 NewUnreachableSum += BP[I];
664
665 BranchProbability NewReachableSum =
666 BranchProbability::getOne() - NewUnreachableSum;
667
668 BranchProbability OldReachableSum = BranchProbability::getZero();
669 for (auto I : ReachableIdxs)
670 OldReachableSum += BP[I];
671
672 if (OldReachableSum != NewReachableSum) { // Anything to dsitribute?
673 if (OldReachableSum.isZero()) {
674 // If all oldBP[i] are zeroes then the proportional distribution results
675 // in all zero probabilities and the error stays big. In this case we
676 // evenly spread NewReachableSum over the reachable edges.
677 BranchProbability PerEdge = NewReachableSum / ReachableIdxs.size();
678 for (auto I : ReachableIdxs)
679 BP[I] = PerEdge;
680 } else {
681 for (auto I : ReachableIdxs) {
682 // We use uint64_t to avoid double rounding error of the following
683 // calculation: BP[i] = BP[i] * NewReachableSum / OldReachableSum
684 // The formula is taken from the private constructor
685 // BranchProbability(uint32_t Numerator, uint32_t Denominator)
686 uint64_t Mul = static_cast<uint64_t>(NewReachableSum.getNumerator()) *
687 BP[I].getNumerator();
688 uint32_t Div = static_cast<uint32_t>(
689 divideNearest(Mul, OldReachableSum.getNumerator()));
690 BP[I] = BranchProbability::getRaw(Div);
691 }
692 }
693 }
694
695 BPI.setEdgeProbability(BB, BP);
696
697 return true;
698}
699
700// Calculate Edge Weights using "Pointer Heuristics". Predict a comparison
701// between two pointer or pointer and NULL will fail.
702bool BPIConstruction::calcPointerHeuristics(const BasicBlock *BB) {
703 const CondBrInst *BI = dyn_cast<CondBrInst>(BB->getTerminator());
704 if (!BI)
705 return false;
706
707 Value *Cond = BI->getCondition();
708 ICmpInst *CI = dyn_cast<ICmpInst>(Cond);
709 if (!CI || !CI->isEquality())
710 return false;
711
712 Value *LHS = CI->getOperand(0);
713
714 if (!LHS->getType()->isPointerTy())
715 return false;
716
717 assert(CI->getOperand(1)->getType()->isPointerTy());
718
719 auto Search = PointerTable.find(CI->getPredicate());
720 if (Search == PointerTable.end())
721 return false;
722 BPI.setEdgeProbability(BB, Search->second);
723 return true;
724}
725
726// Compute the unlikely successors to the block BB in the loop L, specifically
727// those that are unlikely because this is a loop, and add them to the
728// UnlikelyBlocks set.
729static void
730computeUnlikelySuccessors(const BasicBlock *BB, Loop *L,
731 SmallPtrSetImpl<const BasicBlock*> &UnlikelyBlocks) {
732 // Sometimes in a loop we have a branch whose condition is made false by
733 // taking it. This is typically something like
734 // int n = 0;
735 // while (...) {
736 // if (++n >= MAX) {
737 // n = 0;
738 // }
739 // }
740 // In this sort of situation taking the branch means that at the very least it
741 // won't be taken again in the next iteration of the loop, so we should
742 // consider it less likely than a typical branch.
743 //
744 // We detect this by looking back through the graph of PHI nodes that sets the
745 // value that the condition depends on, and seeing if we can reach a successor
746 // block which can be determined to make the condition false.
747 //
748 // FIXME: We currently consider unlikely blocks to be half as likely as other
749 // blocks, but if we consider the example above the likelyhood is actually
750 // 1/MAX. We could therefore be more precise in how unlikely we consider
751 // blocks to be, but it would require more careful examination of the form
752 // of the comparison expression.
753 const CondBrInst *BI = dyn_cast<CondBrInst>(BB->getTerminator());
754 if (!BI)
755 return;
756
757 // Check if the branch is based on an instruction compared with a constant
758 CmpInst *CI = dyn_cast<CmpInst>(BI->getCondition());
759 if (!CI || !isa<Instruction>(CI->getOperand(0)) ||
760 !isa<Constant>(CI->getOperand(1)))
761 return;
762
763 // Either the instruction must be a PHI, or a chain of operations involving
764 // constants that ends in a PHI which we can then collapse into a single value
765 // if the PHI value is known.
767 PHINode *CmpPHI = dyn_cast<PHINode>(CmpLHS);
768 Constant *CmpConst = dyn_cast<Constant>(CI->getOperand(1));
769 // Collect the instructions until we hit a PHI
771 while (!CmpPHI && CmpLHS && isa<BinaryOperator>(CmpLHS) &&
772 isa<Constant>(CmpLHS->getOperand(1))) {
773 // Stop if the chain extends outside of the loop
774 if (!L->contains(CmpLHS))
775 return;
776 InstChain.push_back(cast<BinaryOperator>(CmpLHS));
777 CmpLHS = dyn_cast<Instruction>(CmpLHS->getOperand(0));
778 if (CmpLHS)
779 CmpPHI = dyn_cast<PHINode>(CmpLHS);
780 }
781 if (!CmpPHI || !L->contains(CmpPHI))
782 return;
783
784 // Trace the phi node to find all values that come from successors of BB
785 SmallPtrSet<PHINode*, 8> VisitedInsts;
787 WorkList.push_back(CmpPHI);
788 VisitedInsts.insert(CmpPHI);
789 while (!WorkList.empty()) {
790 PHINode *P = WorkList.pop_back_val();
791 for (BasicBlock *B : P->blocks()) {
792 // Skip blocks that aren't part of the loop
793 if (!L->contains(B))
794 continue;
795 Value *V = P->getIncomingValueForBlock(B);
796 // If the source is a PHI add it to the work list if we haven't
797 // already visited it.
798 if (PHINode *PN = dyn_cast<PHINode>(V)) {
799 if (VisitedInsts.insert(PN).second)
800 WorkList.push_back(PN);
801 continue;
802 }
803 // If this incoming value is a constant and B is a successor of BB, then
804 // we can constant-evaluate the compare to see if it makes the branch be
805 // taken or not.
806 Constant *CmpLHSConst = dyn_cast<Constant>(V);
807 if (!CmpLHSConst || !llvm::is_contained(successors(BB), B))
808 continue;
809 // First collapse InstChain
810 const DataLayout &DL = BB->getDataLayout();
811 for (Instruction *I : llvm::reverse(InstChain)) {
812 CmpLHSConst = ConstantFoldBinaryOpOperands(
813 I->getOpcode(), CmpLHSConst, cast<Constant>(I->getOperand(1)), DL);
814 if (!CmpLHSConst)
815 break;
816 }
817 if (!CmpLHSConst)
818 continue;
819 // Now constant-evaluate the compare
821 CI->getPredicate(), CmpLHSConst, CmpConst, DL);
822 // If the result means we don't branch to the block then that block is
823 // unlikely.
824 if (Result && ((Result->isNullValue() && B == BI->getSuccessor(0)) ||
825 (Result->isOneValue() && B == BI->getSuccessor(1))))
826 UnlikelyBlocks.insert(B);
827 }
828 }
829}
830
831std::optional<uint32_t>
832BPIConstruction::getEstimatedBlockWeight(const BasicBlock *BB) const {
833 auto WeightIt = EstimatedBlockWeight.find(BB);
834 if (WeightIt == EstimatedBlockWeight.end())
835 return std::nullopt;
836 return WeightIt->second;
837}
838
839std::optional<uint32_t>
840BPIConstruction::getEstimatedLoopWeight(const LoopData &L) const {
841 auto WeightIt = EstimatedLoopWeight.find(L);
842 if (WeightIt == EstimatedLoopWeight.end())
843 return std::nullopt;
844 return WeightIt->second;
845}
846
847std::optional<uint32_t>
848BPIConstruction::getEstimatedEdgeWeight(const LoopEdge &Edge) const {
849 // For edges entering a loop take weight of a loop rather than an individual
850 // block in the loop.
851 return isLoopEnteringEdge(Edge)
852 ? getEstimatedLoopWeight(Edge.second.getLoopData())
853 : getEstimatedBlockWeight(Edge.second.getBlock());
854}
855
856template <class IterT>
857std::optional<uint32_t> BPIConstruction::getMaxEstimatedEdgeWeight(
858 const LoopBlock &SrcLoopBB, iterator_range<IterT> Successors) const {
859 std::optional<uint32_t> MaxWeight;
860 for (const BasicBlock *DstBB : Successors) {
861 const LoopBlock DstLoopBB = getLoopBlock(DstBB);
862 auto Weight = getEstimatedEdgeWeight({SrcLoopBB, DstLoopBB});
863
864 if (!Weight)
865 return std::nullopt;
866
867 if (!MaxWeight || *MaxWeight < *Weight)
868 MaxWeight = Weight;
869 }
870
871 return MaxWeight;
872}
873
874// Updates \p LoopBB's weight and returns true. If \p LoopBB has already
875// an associated weight it is unchanged and false is returned.
876//
877// Please note by the algorithm the weight is not expected to change once set
878// thus 'false' status is used to track visited blocks.
879bool BPIConstruction::updateEstimatedBlockWeight(
880 LoopBlock &LoopBB, uint32_t BBWeight,
881 SmallVectorImpl<BasicBlock *> &BlockWorkList,
882 SmallVectorImpl<LoopBlock> &LoopWorkList) {
883 BasicBlock *BB = LoopBB.getBlock();
884
885 // In general, weight is assigned to a block when it has final value and
886 // can't/shouldn't be changed. However, there are cases when a block
887 // inherently has several (possibly "contradicting") weights. For example,
888 // "unwind" block may also contain "cold" call. In that case the first
889 // set weight is favored and all consequent weights are ignored.
890 if (!EstimatedBlockWeight.insert({BB, BBWeight}).second)
891 return false;
892
893 for (BasicBlock *PredBlock : predecessors(BB)) {
894 LoopBlock PredLoop = getLoopBlock(PredBlock);
895 // Add affected block/loop to a working list.
896 if (isLoopExitingEdge({PredLoop, LoopBB})) {
897 if (!EstimatedLoopWeight.count(PredLoop.getLoopData()))
898 LoopWorkList.push_back(PredLoop);
899 } else if (!EstimatedBlockWeight.count(PredBlock))
900 BlockWorkList.push_back(PredBlock);
901 }
902 return true;
903}
904
905// Starting from \p BB traverse through dominator blocks and assign \p BBWeight
906// to all such blocks that are post dominated by \BB. In other words to all
907// blocks that the one is executed if and only if another one is executed.
908// Importantly, we skip loops here for two reasons. First weights of blocks in
909// a loop should be scaled by trip count (yet possibly unknown). Second there is
910// no any value in doing that because that doesn't give any additional
911// information regarding distribution of probabilities inside the loop.
912// Exception is loop 'enter' and 'exit' edges that are handled in a special way
913// at calcEstimatedHeuristics.
914//
915// In addition, \p WorkList is populated with basic blocks if at leas one
916// successor has updated estimated weight.
917void BPIConstruction::propagateEstimatedBlockWeight(
918 const LoopBlock &LoopBB, DominatorTree *DT, PostDominatorTree *PDT,
919 uint32_t BBWeight, SmallVectorImpl<BasicBlock *> &BlockWorkList,
920 SmallVectorImpl<LoopBlock> &LoopWorkList) {
921 const BasicBlock *BB = LoopBB.getBlock();
922 const auto *DTStartNode = DT->getNode(BB);
923 const auto *PDTStartNode = PDT->getNode(BB);
924
925 // TODO: Consider propagating weight down the domination line as well.
926 for (const auto *DTNode = DTStartNode; DTNode != nullptr;
927 DTNode = DTNode->getIDom()) {
928 auto *DomBB = DTNode->getBlock();
929 // Consider blocks which lie on one 'line'.
930 if (!PDT->dominates(PDTStartNode, PDT->getNode(DomBB)))
931 // If BB doesn't post dominate DomBB it will not post dominate dominators
932 // of DomBB as well.
933 break;
934
935 LoopBlock DomLoopBB = getLoopBlock(DomBB);
936 const LoopEdge Edge{DomLoopBB, LoopBB};
937 // Don't propagate weight to blocks belonging to different loops.
938 if (!isLoopEnteringExitingEdge(Edge)) {
939 if (!updateEstimatedBlockWeight(DomLoopBB, BBWeight, BlockWorkList,
940 LoopWorkList))
941 // If DomBB has weight set then all it's predecessors are already
942 // processed (since we propagate weight up to the top of IR each time).
943 break;
944 } else if (isLoopExitingEdge(Edge)) {
945 LoopWorkList.push_back(DomLoopBB);
946 }
947 }
948}
949
950std::optional<uint32_t>
951BPIConstruction::getInitialEstimatedBlockWeight(const BasicBlock *BB) {
952 // Returns true if \p BB has call marked with "NoReturn" attribute.
953 auto hasNoReturn = [&](const BasicBlock *BB) {
954 for (const auto &I : reverse(*BB))
955 if (const CallInst *CI = dyn_cast<CallInst>(&I))
956 if (CI->hasFnAttr(Attribute::NoReturn))
957 return true;
958
959 return false;
960 };
961
962 // Important note regarding the order of checks. They are ordered by weight
963 // from lowest to highest. Doing that allows to avoid "unstable" results
964 // when several conditions heuristics can be applied simultaneously.
966 // If this block is terminated by a call to
967 // @llvm.experimental.deoptimize then treat it like an unreachable
968 // since it is expected to practically never execute.
969 // TODO: Should we actually treat as never returning call?
971 return hasNoReturn(BB)
972 ? static_cast<uint32_t>(BlockExecWeight::NORETURN)
973 : static_cast<uint32_t>(BlockExecWeight::UNREACHABLE);
974
975 // Check if the block is an exception handling block.
976 if (BB->isEHPad())
977 return static_cast<uint32_t>(BlockExecWeight::UNWIND);
978
979 // Check if the block contains 'cold' call.
980 for (const auto &I : *BB)
981 if (const CallInst *CI = dyn_cast<CallInst>(&I))
982 if (CI->hasFnAttr(Attribute::Cold))
983 return static_cast<uint32_t>(BlockExecWeight::COLD);
984
985 return std::nullopt;
986}
987
988// Does RPO traversal over all blocks in \p F and assigns weights to
989// 'unreachable', 'noreturn', 'cold', 'unwind' blocks. In addition it does its
990// best to propagate the weight to up/down the IR.
991void BPIConstruction::estimateBlockWeights(const Function &F, DominatorTree *DT,
992 PostDominatorTree *PDT) {
993 SmallVector<BasicBlock *, 8> BlockWorkList;
994 SmallVector<LoopBlock, 8> LoopWorkList;
995 SmallDenseMap<LoopData, SmallVector<BasicBlock *, 4>> LoopExitBlocks;
996
997 // By doing RPO we make sure that all predecessors already have weights
998 // calculated before visiting theirs successors.
999 ReversePostOrderTraversal<const Function *> RPOT(&F);
1000 for (const auto *BB : RPOT)
1001 if (auto BBWeight = getInitialEstimatedBlockWeight(BB))
1002 // If we were able to find estimated weight for the block set it to this
1003 // block and propagate up the IR.
1004 propagateEstimatedBlockWeight(getLoopBlock(BB), DT, PDT, *BBWeight,
1005 BlockWorkList, LoopWorkList);
1006
1007 // BlockWorklist/LoopWorkList contains blocks/loops with at least one
1008 // successor/exit having estimated weight. Try to propagate weight to such
1009 // blocks/loops from successors/exits.
1010 // Process loops and blocks. Order is not important.
1011 do {
1012 while (!LoopWorkList.empty()) {
1013 const LoopBlock LoopBB = LoopWorkList.pop_back_val();
1014 const LoopData LD = LoopBB.getLoopData();
1015 if (EstimatedLoopWeight.count(LD))
1016 continue;
1017
1018 auto Res = LoopExitBlocks.try_emplace(LD);
1019 SmallVectorImpl<BasicBlock *> &Exits = Res.first->second;
1020 if (Res.second)
1021 getLoopExitBlocks(LoopBB, Exits);
1022 auto LoopWeight = getMaxEstimatedEdgeWeight(
1023 LoopBB, make_range(Exits.begin(), Exits.end()));
1024
1025 if (LoopWeight) {
1026 // If we never exit the loop then we can enter it once at maximum.
1027 if (LoopWeight <= static_cast<uint32_t>(BlockExecWeight::UNREACHABLE))
1028 LoopWeight = static_cast<uint32_t>(BlockExecWeight::LOWEST_NON_ZERO);
1029
1030 EstimatedLoopWeight.insert({LD, *LoopWeight});
1031 // Add all blocks entering the loop into working list.
1032 getLoopEnterBlocks(LoopBB, BlockWorkList);
1033 }
1034 }
1035
1036 while (!BlockWorkList.empty()) {
1037 // We can reach here only if BlockWorkList is not empty.
1038 const BasicBlock *BB = BlockWorkList.pop_back_val();
1039 if (EstimatedBlockWeight.count(BB))
1040 continue;
1041
1042 // We take maximum over all weights of successors. In other words we take
1043 // weight of "hot" path. In theory we can probably find a better function
1044 // which gives higher accuracy results (comparing to "maximum") but I
1045 // can't
1046 // think of any right now. And I doubt it will make any difference in
1047 // practice.
1048 const LoopBlock LoopBB = getLoopBlock(BB);
1049 auto MaxWeight = getMaxEstimatedEdgeWeight(LoopBB, successors(BB));
1050
1051 if (MaxWeight)
1052 propagateEstimatedBlockWeight(LoopBB, DT, PDT, *MaxWeight,
1053 BlockWorkList, LoopWorkList);
1054 }
1055 } while (!BlockWorkList.empty() || !LoopWorkList.empty());
1056}
1057
1058// Calculate edge probabilities based on block's estimated weight.
1059// Note that gathered weights were not scaled for loops. Thus edges entering
1060// and exiting loops requires special processing.
1061bool BPIConstruction::calcEstimatedHeuristics(const BasicBlock *BB) {
1062 assert(BB->getTerminator()->getNumSuccessors() > 1 &&
1063 "expected more than one successor!");
1064
1065 const LoopBlock LoopBB = getLoopBlock(BB);
1066
1067 SmallPtrSet<const BasicBlock *, 8> UnlikelyBlocks;
1068 uint32_t TC = LBH_TAKEN_WEIGHT / LBH_NONTAKEN_WEIGHT;
1069 if (LoopBB.getLoop())
1070 computeUnlikelySuccessors(BB, LoopBB.getLoop(), UnlikelyBlocks);
1071
1072 // Changed to 'true' if at least one successor has estimated weight.
1073 bool FoundEstimatedWeight = false;
1074 SmallVector<uint32_t, 4> SuccWeights;
1075 uint64_t TotalWeight = 0;
1076 // Go over all successors of BB and put their weights into SuccWeights.
1077 for (const BasicBlock *SuccBB : successors(BB)) {
1078 std::optional<uint32_t> Weight;
1079 const LoopBlock SuccLoopBB = getLoopBlock(SuccBB);
1080 const LoopEdge Edge{LoopBB, SuccLoopBB};
1081
1082 Weight = getEstimatedEdgeWeight(Edge);
1083
1084 if (isLoopExitingEdge(Edge) &&
1085 // Avoid adjustment of ZERO weight since it should remain unchanged.
1086 Weight != static_cast<uint32_t>(BlockExecWeight::ZERO)) {
1087 // Scale down loop exiting weight by trip count.
1088 Weight = std::max(
1089 static_cast<uint32_t>(BlockExecWeight::LOWEST_NON_ZERO),
1090 Weight.value_or(static_cast<uint32_t>(BlockExecWeight::DEFAULT)) /
1091 TC);
1092 }
1093 bool IsUnlikelyEdge = LoopBB.getLoop() && UnlikelyBlocks.contains(SuccBB);
1094 if (IsUnlikelyEdge &&
1095 // Avoid adjustment of ZERO weight since it should remain unchanged.
1096 Weight != static_cast<uint32_t>(BlockExecWeight::ZERO)) {
1097 // 'Unlikely' blocks have twice lower weight.
1098 Weight = std::max(
1099 static_cast<uint32_t>(BlockExecWeight::LOWEST_NON_ZERO),
1100 Weight.value_or(static_cast<uint32_t>(BlockExecWeight::DEFAULT)) / 2);
1101 }
1102
1103 if (Weight)
1104 FoundEstimatedWeight = true;
1105
1106 auto WeightVal =
1107 Weight.value_or(static_cast<uint32_t>(BlockExecWeight::DEFAULT));
1108 TotalWeight += WeightVal;
1109 SuccWeights.push_back(WeightVal);
1110 }
1111
1112 // If non of blocks have estimated weight bail out.
1113 // If TotalWeight is 0 that means weight of each successor is 0 as well and
1114 // equally likely. Bail out early to not deal with devision by zero.
1115 if (!FoundEstimatedWeight || TotalWeight == 0)
1116 return false;
1117
1118 assert(SuccWeights.size() == succ_size(BB) && "Missed successor?");
1119 const unsigned SuccCount = SuccWeights.size();
1120
1121 // If the sum of weights does not fit in 32 bits, scale every weight down
1122 // accordingly.
1123 if (TotalWeight > UINT32_MAX) {
1124 uint64_t ScalingFactor = TotalWeight / UINT32_MAX + 1;
1125 TotalWeight = 0;
1126 for (unsigned Idx = 0; Idx < SuccCount; ++Idx) {
1127 SuccWeights[Idx] /= ScalingFactor;
1128 if (SuccWeights[Idx] == static_cast<uint32_t>(BlockExecWeight::ZERO))
1129 SuccWeights[Idx] =
1130 static_cast<uint32_t>(BlockExecWeight::LOWEST_NON_ZERO);
1131 TotalWeight += SuccWeights[Idx];
1132 }
1133 assert(TotalWeight <= UINT32_MAX && "Total weight overflows");
1134 }
1135
1136 // Finally set probabilities to edges according to estimated block weights.
1137 SmallVector<BranchProbability, 4> EdgeProbabilities(
1138 SuccCount, BranchProbability::getUnknown());
1139
1140 for (unsigned Idx = 0; Idx < SuccCount; ++Idx) {
1141 EdgeProbabilities[Idx] =
1142 BranchProbability(SuccWeights[Idx], (uint32_t)TotalWeight);
1143 }
1144 BPI.setEdgeProbability(BB, EdgeProbabilities);
1145 return true;
1146}
1147
1148bool BPIConstruction::calcZeroHeuristics(const BasicBlock *BB,
1149 const TargetLibraryInfo *TLI) {
1150 const CondBrInst *BI = dyn_cast<CondBrInst>(BB->getTerminator());
1151 if (!BI)
1152 return false;
1153
1154 Value *Cond = BI->getCondition();
1155 ICmpInst *CI = dyn_cast<ICmpInst>(Cond);
1156 if (!CI)
1157 return false;
1158
1159 auto GetConstantInt = [](Value *V) {
1160 if (auto *I = dyn_cast<BitCastInst>(V))
1161 return dyn_cast<ConstantInt>(I->getOperand(0));
1162 return dyn_cast<ConstantInt>(V);
1163 };
1164
1165 Value *RHS = CI->getOperand(1);
1166 ConstantInt *CV = GetConstantInt(RHS);
1167 if (!CV)
1168 return false;
1169
1170 // If the LHS is the result of AND'ing a value with a single bit bitmask,
1171 // we don't have information about probabilities.
1172 if (Instruction *LHS = dyn_cast<Instruction>(CI->getOperand(0)))
1173 if (LHS->getOpcode() == Instruction::And)
1174 if (ConstantInt *AndRHS = GetConstantInt(LHS->getOperand(1)))
1175 if (AndRHS->getValue().isPowerOf2())
1176 return false;
1177
1178 // Check if the LHS is the return value of a library function
1179 LibFunc Func = LibFunc::NotLibFunc;
1180 if (TLI)
1181 if (CallInst *Call = dyn_cast<CallInst>(CI->getOperand(0)))
1182 if (Function *CalledFn = Call->getCalledFunction())
1183 TLI->getLibFunc(*CalledFn, Func);
1184
1185 ProbabilityTable::const_iterator Search;
1186 if (Func == LibFunc_strcasecmp ||
1187 Func == LibFunc_strcmp ||
1188 Func == LibFunc_strncasecmp ||
1189 Func == LibFunc_strncmp ||
1190 Func == LibFunc_memcmp ||
1191 Func == LibFunc_bcmp) {
1192 Search = ICmpWithLibCallTable.find(CI->getPredicate());
1193 if (Search == ICmpWithLibCallTable.end())
1194 return false;
1195 } else if (CV->isZero()) {
1196 Search = ICmpWithZeroTable.find(CI->getPredicate());
1197 if (Search == ICmpWithZeroTable.end())
1198 return false;
1199 } else if (CV->isOne()) {
1200 Search = ICmpWithOneTable.find(CI->getPredicate());
1201 if (Search == ICmpWithOneTable.end())
1202 return false;
1203 } else if (CV->isMinusOne()) {
1204 Search = ICmpWithMinusOneTable.find(CI->getPredicate());
1205 if (Search == ICmpWithMinusOneTable.end())
1206 return false;
1207 } else {
1208 return false;
1209 }
1210
1211 BPI.setEdgeProbability(BB, Search->second);
1212 return true;
1213}
1214
1215bool BPIConstruction::calcFloatingPointHeuristics(const BasicBlock *BB) {
1216 const CondBrInst *BI = dyn_cast<CondBrInst>(BB->getTerminator());
1217 if (!BI)
1218 return false;
1219
1220 Value *Cond = BI->getCondition();
1221 FCmpInst *FCmp = dyn_cast<FCmpInst>(Cond);
1222 if (!FCmp)
1223 return false;
1224
1225 ProbabilityList ProbList;
1226 if (FCmp->isEquality()) {
1227 ProbList = !FCmp->isTrueWhenEqual() ?
1228 // f1 == f2 -> Unlikely
1230 // f1 != f2 -> Likely
1232 } else {
1233 auto Search = FCmpTable.find(FCmp->getPredicate());
1234 if (Search == FCmpTable.end())
1235 return false;
1236 ProbList = Search->second;
1237 }
1238
1239 BPI.setEdgeProbability(BB, ProbList);
1240 return true;
1241}
1242void BPIConstruction::calculate(const Function &F, const LoopInfo &LoopI,
1243 const TargetLibraryInfo *TLI, DominatorTree *DT,
1244 PostDominatorTree *PDT) {
1245 LI = &LoopI;
1246
1247 SccI = std::make_unique<SccInfo>(F);
1248
1249 std::unique_ptr<DominatorTree> DTPtr;
1250 std::unique_ptr<PostDominatorTree> PDTPtr;
1251
1252 if (!DT) {
1253 DTPtr = std::make_unique<DominatorTree>(const_cast<Function &>(F));
1254 DT = DTPtr.get();
1255 }
1256
1257 if (!PDT) {
1258 PDTPtr = std::make_unique<PostDominatorTree>(const_cast<Function &>(F));
1259 PDT = PDTPtr.get();
1260 }
1261
1262 estimateBlockWeights(F, DT, PDT);
1263
1264 // Walk the basic blocks in post-order so that we can build up state about
1265 // the successors of a block iteratively.
1266 for (const auto *BB : post_order(&F.getEntryBlock())) {
1267 LLVM_DEBUG(dbgs() << "Computing probabilities for " << BB->getName()
1268 << "\n");
1269 // If there is no at least two successors, no sense to set probability.
1270 if (BB->getTerminator()->getNumSuccessors() < 2)
1271 continue;
1272 if (calcMetadataWeights(BB))
1273 continue;
1274 if (calcEstimatedHeuristics(BB))
1275 continue;
1276 if (calcPointerHeuristics(BB))
1277 continue;
1278 if (calcZeroHeuristics(BB, TLI))
1279 continue;
1280 if (calcFloatingPointHeuristics(BB))
1281 continue;
1282 }
1283}
1284
1285} // end anonymous namespace
1286
1288 Probs.clear();
1289 Handles.clear();
1290}
1291
1293 FunctionAnalysisManager::Invalidator &) {
1294 // Check whether the analysis, all analyses on functions, or the function's
1295 // CFG have been preserved.
1296 auto PAC = PA.getChecker<BranchProbabilityAnalysis>();
1297 return !(PAC.preserved() || PAC.preservedSet<AllAnalysesOn<Function>>() ||
1298 PAC.preservedSet<CFGAnalyses>());
1299}
1300
1302 OS << "---- Branch Probabilities ----\n";
1303 // We print the probabilities from the last function the analysis ran over,
1304 // or the function it is currently running over.
1305 assert(LastF && "Cannot print prior to running over a function");
1306 for (const auto &BI : *LastF) {
1307 for (const BasicBlock *Succ : successors(&BI))
1308 printEdgeProbability(OS << " ", &BI, Succ);
1309 }
1310}
1311
1313isEdgeHot(const BasicBlock *Src, const BasicBlock *Dst) const {
1314 // Hot probability is at least 4/5 = 80%
1315 // FIXME: Compare against a static "hot" BranchProbability.
1316 return getEdgeProbability(Src, Dst) > BranchProbability(4, 5);
1317}
1318
1319/// Get the raw edge probability for the edge. If can't find it, return a
1320/// default probability 1/N where N is the number of successors. Here an edge is
1321/// specified using PredBlock and an
1322/// index to the successors.
1325 unsigned IndexInSuccessors) const {
1326 auto I = Probs.find(std::make_pair(Src, IndexInSuccessors));
1327 assert((Probs.end() == Probs.find(std::make_pair(Src, 0))) ==
1328 (Probs.end() == I) &&
1329 "Probability for I-th successor must always be defined along with the "
1330 "probability for the first successor");
1331
1332 if (I != Probs.end())
1333 return I->second;
1334
1335 return {1, static_cast<uint32_t>(succ_size(Src))};
1336}
1337
1340 const_succ_iterator Dst) const {
1341 return getEdgeProbability(Src, std::distance(succ_begin(Src), Dst));
1342}
1343
1344/// Get the raw edge probability calculated for the block pair. This returns the
1345/// sum of all raw edge probabilities from Src to Dst.
1348 const BasicBlock *Dst) const {
1349 if (!Probs.count(std::make_pair(Src, 0)))
1350 return BranchProbability(llvm::count(successors(Src), Dst), succ_size(Src));
1351
1352 auto Prob = BranchProbability::getZero();
1353 for (auto It : enumerate(successors(Src)))
1354 if (It.value() == Dst)
1355 Prob += Probs.find(std::make_pair(Src, It.index()))->second;
1356
1357 return Prob;
1358}
1359
1360/// Set the edge probability for all edges at once.
1362 const BasicBlock *Src, const SmallVectorImpl<BranchProbability> &Probs) {
1363 assert(Src->getTerminator()->getNumSuccessors() == Probs.size());
1364 eraseBlock(Src); // Erase stale data if any.
1365 if (Probs.size() == 0)
1366 return; // Nothing to set.
1367
1368 Handles.insert(BasicBlockCallbackVH(Src, this));
1369 uint64_t TotalNumerator = 0;
1370 for (unsigned SuccIdx = 0; SuccIdx < Probs.size(); ++SuccIdx) {
1371 this->Probs[std::make_pair(Src, SuccIdx)] = Probs[SuccIdx];
1372 LLVM_DEBUG(dbgs() << "set edge " << Src->getName() << " -> " << SuccIdx
1373 << " successor probability to " << Probs[SuccIdx]
1374 << "\n");
1375 TotalNumerator += Probs[SuccIdx].getNumerator();
1376 }
1377
1378 // Because of rounding errors the total probability cannot be checked to be
1379 // 1.0 exactly. That is TotalNumerator == BranchProbability::getDenominator.
1380 // Instead, every single probability in Probs must be as accurate as possible.
1381 // This results in error 1/denominator at most, thus the total absolute error
1382 // should be within Probs.size / BranchProbability::getDenominator.
1383 assert(TotalNumerator <= BranchProbability::getDenominator() + Probs.size());
1384 assert(TotalNumerator >= BranchProbability::getDenominator() - Probs.size());
1385 (void)TotalNumerator;
1386}
1387
1389 BasicBlock *Dst) {
1390 eraseBlock(Dst); // Erase stale data if any.
1391 unsigned NumSuccessors = Src->getTerminator()->getNumSuccessors();
1392 assert(NumSuccessors == Dst->getTerminator()->getNumSuccessors());
1393 if (NumSuccessors == 0)
1394 return; // Nothing to set.
1395 if (!this->Probs.contains(std::make_pair(Src, 0)))
1396 return; // No probability is set for edges from Src. Keep the same for Dst.
1397
1398 Handles.insert(BasicBlockCallbackVH(Dst, this));
1399 for (unsigned SuccIdx = 0; SuccIdx < NumSuccessors; ++SuccIdx) {
1400 auto Prob = this->Probs[std::make_pair(Src, SuccIdx)];
1401 this->Probs[std::make_pair(Dst, SuccIdx)] = Prob;
1402 LLVM_DEBUG(dbgs() << "set edge " << Dst->getName() << " -> " << SuccIdx
1403 << " successor probability to " << Prob << "\n");
1404 }
1405}
1406
1408 assert(Src->getTerminator()->getNumSuccessors() == 2);
1409 auto It0 = Probs.find(std::make_pair(Src, 0));
1410 if (It0 == Probs.end())
1411 return; // No probability is set for edges from Src
1412 auto It1 = Probs.find(std::make_pair(Src, 1));
1413 assert(It1 != Probs.end());
1414 std::swap(It0->second, It1->second);
1415}
1416
1419 const BasicBlock *Src,
1420 const BasicBlock *Dst) const {
1421 const BranchProbability Prob = getEdgeProbability(Src, Dst);
1422 OS << "edge ";
1423 Src->printAsOperand(OS, false, Src->getModule());
1424 OS << " -> ";
1425 Dst->printAsOperand(OS, false, Dst->getModule());
1426 OS << " probability is " << Prob
1427 << (isEdgeHot(Src, Dst) ? " [HOT edge]\n" : "\n");
1428
1429 return OS;
1430}
1431
1433 LLVM_DEBUG(dbgs() << "eraseBlock " << BB->getName() << "\n");
1434
1435 // Note that we cannot use successors of BB because the terminator of BB may
1436 // have changed when eraseBlock is called as a BasicBlockCallbackVH callback.
1437 // Instead we remove prob data for the block by iterating successors by their
1438 // indices from 0 till the last which exists. There could not be prob data for
1439 // a pair (BB, N) if there is no data for (BB, N-1) because the data is always
1440 // set for all successors from 0 to M at once by the method
1441 // setEdgeProbability().
1442 Handles.erase(BasicBlockCallbackVH(BB, this));
1443 for (unsigned I = 0;; ++I) {
1444 auto MapI = Probs.find(std::make_pair(BB, I));
1445 if (MapI == Probs.end()) {
1446 assert(Probs.count(std::make_pair(BB, I + 1)) == 0 &&
1447 "Must be no more successors");
1448 return;
1449 }
1450 Probs.erase(MapI);
1451 }
1452}
1453
1455 const TargetLibraryInfo *TLI,
1456 DominatorTree *DT,
1457 PostDominatorTree *PDT) {
1458 LLVM_DEBUG(dbgs() << "---- Branch Probability Info : " << F.getName()
1459 << " ----\n\n");
1460 LastF = &F; // Store the last function we ran on for printing.
1461 BPIConstruction(*this).calculate(F, LoopI, TLI, DT, PDT);
1462
1463 if (PrintBranchProb && (PrintBranchProbFuncName.empty() ||
1464 F.getName() == PrintBranchProbFuncName)) {
1465 print(dbgs());
1466 }
1467}
1468
1470 AnalysisUsage &AU) const {
1471 // We require DT so it's available when LI is available. The LI updating code
1472 // asserts that DT is also present so if we don't make sure that we have DT
1473 // here, that assert will trigger.
1479 AU.setPreservesAll();
1480}
1481
1483 const LoopInfo &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
1484 const TargetLibraryInfo &TLI =
1487 PostDominatorTree &PDT =
1489 BPI.calculate(F, LI, &TLI, &DT, &PDT);
1490 return false;
1491}
1492
1494
1496 const Module *) const {
1497 BPI.print(OS);
1498}
1499
1500AnalysisKey BranchProbabilityAnalysis::Key;
1503 auto &LI = AM.getResult<LoopAnalysis>(F);
1504 auto &TLI = AM.getResult<TargetLibraryAnalysis>(F);
1505 auto &DT = AM.getResult<DominatorTreeAnalysis>(F);
1506 auto &PDT = AM.getResult<PostDominatorTreeAnalysis>(F);
1508 BPI.calculate(F, LI, &TLI, &DT, &PDT);
1509 return BPI;
1510}
1511
1514 OS << "Printing analysis 'Branch Probability Analysis' for function '"
1515 << F.getName() << "':\n";
1517 return PreservedAnalyses::all();
1518}
for(const MachineOperand &MO :llvm::drop_begin(OldMI.operands(), Desc.getNumOperands()))
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static void print(raw_ostream &Out, object::Archive::Kind Kind, T Val)
This file contains the simple types necessary to represent the attributes associated with functions a...
BlockExecWeight
Set of dedicated "absolute" execution weights for a block.
@ NORETURN
Weight to a block containing non returning call.
@ UNWIND
Weight to 'unwind' block of an invoke instruction.
@ COLD
Weight to a 'cold' block.
@ ZERO
Special weight used for cases with exact zero probability.
@ UNREACHABLE
Weight to an 'unreachable' block.
@ DEFAULT
Default weight is used in cases when there is no dedicated execution weight set.
@ LOWEST_NON_ZERO
Minimal possible non zero weight.
static const uint32_t FPH_TAKEN_WEIGHT
static const BranchProbability FPUntakenProb(FPH_NONTAKEN_WEIGHT, FPH_TAKEN_WEIGHT+FPH_NONTAKEN_WEIGHT)
static const BranchProbability ZeroUntakenProb(ZH_NONTAKEN_WEIGHT, ZH_TAKEN_WEIGHT+ZH_NONTAKEN_WEIGHT)
static const uint32_t LBH_TAKEN_WEIGHT
static const uint32_t ZH_NONTAKEN_WEIGHT
static const ProbabilityTable ICmpWithLibCallTable
strcmp and similar functions return zero, negative, or positive, if the first string is equal,...
static const ProbabilityTable ICmpWithMinusOneTable
Integer compares with -1:
static const BranchProbability FPOrdTakenProb(FPH_ORD_WEIGHT, FPH_ORD_WEIGHT+FPH_UNO_WEIGHT)
static const ProbabilityTable ICmpWithZeroTable
Integer compares with 0:
static const uint32_t PH_NONTAKEN_WEIGHT
std::map< CmpInst::Predicate, ProbabilityList > ProbabilityTable
static const BranchProbability PtrTakenProb(PH_TAKEN_WEIGHT, PH_TAKEN_WEIGHT+PH_NONTAKEN_WEIGHT)
static const BranchProbability ZeroTakenProb(ZH_TAKEN_WEIGHT, ZH_TAKEN_WEIGHT+ZH_NONTAKEN_WEIGHT)
static const BranchProbability FPOrdUntakenProb(FPH_UNO_WEIGHT, FPH_ORD_WEIGHT+FPH_UNO_WEIGHT)
static const uint32_t PH_TAKEN_WEIGHT
Heuristics and lookup tables for non-loop branches: Pointer Heuristics (PH)
static const BranchProbability FPTakenProb(FPH_TAKEN_WEIGHT, FPH_TAKEN_WEIGHT+FPH_NONTAKEN_WEIGHT)
static const BranchProbability PtrUntakenProb(PH_NONTAKEN_WEIGHT, PH_TAKEN_WEIGHT+PH_NONTAKEN_WEIGHT)
SmallVector< BranchProbability > ProbabilityList
static const ProbabilityTable ICmpWithOneTable
Integer compares with 1:
static const uint32_t ZH_TAKEN_WEIGHT
Zero Heuristics (ZH)
static const uint32_t FPH_NONTAKEN_WEIGHT
static const BranchProbability UR_TAKEN_PROB
Unreachable-terminating branch taken probability.
static const ProbabilityTable FCmpTable
Floating-Point compares:
static const uint32_t LBH_NONTAKEN_WEIGHT
static const ProbabilityTable PointerTable
Pointer comparisons:
static const uint32_t FPH_ORD_WEIGHT
This is the probability for an ordered floating point comparison.
static const uint32_t FPH_UNO_WEIGHT
This is the probability for an unordered floating point comparison, it means one or two of the operan...
static cl::opt< std::string > PrintBranchProbFuncName("print-bpi-func-name", cl::Hidden, cl::desc("The option to specify the name of the function " "whose branch probability info is printed."))
static cl::opt< bool > PrintBranchProb("print-bpi", cl::init(false), cl::Hidden, cl::desc("Print the branch probability info."))
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define LLVM_ABI
Definition Compiler.h:213
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
This header defines various interfaces for pass management in LLVM.
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
This file contains the declarations for metadata subclasses.
#define P(N)
#define INITIALIZE_PASS_DEPENDENCY(depName)
Definition PassSupport.h:42
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
Definition PassSupport.h:44
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
Definition PassSupport.h:39
This file builds on the ADT/GraphTraits.h file to build a generic graph post order iterator.
This file contains the declarations for profiling metadata utility functions.
const SmallVectorImpl< MachineOperand > & Cond
This builds on the llvm/ADT/GraphTraits.h file to find the strongly connected components (SCCs) of a ...
std::pair< BasicBlock *, BasicBlock * > Edge
This file contains some templates that are useful if you are working with the STL at all.
This file defines the SmallVector class.
#define LLVM_DEBUG(...)
Definition Debug.h:114
Value * RHS
Value * LHS
BinaryOperator * Mul
This templated class represents "all analyses that operate over <aparticular IR unit>" (e....
Definition Analysis.h:50
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Represent the analysis usage information of a pass.
AnalysisUsage & addRequired()
void setPreservesAll()
Set by analyses that do not transform their input at all.
LLVM Basic Block Representation.
Definition BasicBlock.h:62
LLVM_ABI const CallInst * getTerminatingDeoptimizeCall() const
Returns the call instruction calling @llvm.experimental.deoptimize prior to the terminating return in...
LLVM_ABI const DataLayout & getDataLayout() const
Get the data layout of the module this basic block belongs to.
bool isEHPad() const
Return true if this basic block is an exception handling block.
Definition BasicBlock.h:713
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction if the block is well formed or null if the block is not well forme...
Definition BasicBlock.h:233
Analysis pass which computes BranchProbabilityInfo.
LLVM_ABI BranchProbabilityInfo run(Function &F, FunctionAnalysisManager &AM)
Run the analysis pass over a function and produce BPI.
Legacy analysis pass which computes BranchProbabilityInfo.
void releaseMemory() override
releaseMemory() - This member can be implemented by a pass if it wants to be able to release its memo...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
bool runOnFunction(Function &F) override
runOnFunction - Virtual method overriden by subclasses to do the per-function processing of the pass.
void print(raw_ostream &OS, const Module *M=nullptr) const override
print - Print out the internal state of the pass.
Analysis providing branch probability information.
LLVM_ABI void eraseBlock(const BasicBlock *BB)
Forget analysis results for the given basic block.
LLVM_ABI void setEdgeProbability(const BasicBlock *Src, const SmallVectorImpl< BranchProbability > &Probs)
Set the raw probabilities for all edges from the given block.
LLVM_ABI bool invalidate(Function &, const PreservedAnalyses &PA, FunctionAnalysisManager::Invalidator &)
LLVM_ABI BranchProbability getEdgeProbability(const BasicBlock *Src, unsigned IndexInSuccessors) const
Get an edge's probability, relative to other out-edges of the Src.
LLVM_ABI void calculate(const Function &F, const LoopInfo &LI, const TargetLibraryInfo *TLI, DominatorTree *DT, PostDominatorTree *PDT)
LLVM_ABI bool isEdgeHot(const BasicBlock *Src, const BasicBlock *Dst) const
Test if an edge is hot relative to other out-edges of the Src.
LLVM_ABI void swapSuccEdgesProbabilities(const BasicBlock *Src)
Swap outgoing edges probabilities for Src with branch terminator.
LLVM_ABI void print(raw_ostream &OS) const
LLVM_ABI raw_ostream & printEdgeProbability(raw_ostream &OS, const BasicBlock *Src, const BasicBlock *Dst) const
Print an edge's probability.
LLVM_ABI void copyEdgeProbabilities(BasicBlock *Src, BasicBlock *Dst)
Copy outgoing edge probabilities from Src to Dst.
LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
static uint32_t getDenominator()
static BranchProbability getRaw(uint32_t N)
static BranchProbability getOne()
static BranchProbability getUnknown()
uint32_t getNumerator() const
static BranchProbability getZero()
Represents analyses that only rely on functions' control flow.
Definition Analysis.h:73
Function * getCalledFunction() const
Returns the function called, or null if this is an indirect function invocation or the function signa...
@ ICMP_SLT
signed less than
Definition InstrTypes.h:705
@ ICMP_SGT
signed greater than
Definition InstrTypes.h:703
@ FCMP_ORD
0 1 1 1 True if ordered (no nans)
Definition InstrTypes.h:685
@ ICMP_NE
not equal
Definition InstrTypes.h:698
@ FCMP_UNO
1 0 0 0 True if unordered: isnan(X) | isnan(Y)
Definition InstrTypes.h:686
bool isTrueWhenEqual() const
This is just a convenience.
Definition InstrTypes.h:942
Predicate getPredicate() const
Return the predicate for this instruction.
Definition InstrTypes.h:765
Value * getCondition() const
BasicBlock * getSuccessor(unsigned i) const
bool isMinusOne() const
This function will return true iff every bit in this constant is set to true.
Definition Constants.h:231
bool isOne() const
This is just a convenience method to make client code smaller for a common case.
Definition Constants.h:225
bool isZero() const
This is just a convenience method to make client code smaller for a common code.
Definition Constants.h:219
std::pair< iterator, bool > try_emplace(KeyT &&Key, Ts &&...Args)
Definition DenseMap.h:256
Analysis pass which computes a DominatorTree.
Definition Dominators.h:283
DomTreeNodeBase< NodeT > * getNode(const NodeT *BB) const
getNode - return the (Post)DominatorTree node for the specified basic block.
Legacy analysis pass which computes a DominatorTree.
Definition Dominators.h:321
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition Dominators.h:164
static bool isEquality(Predicate Pred)
FunctionPass(char &pid)
Definition Pass.h:316
static bool isEquality(Predicate P)
Return true if this predicate is either EQ or NE.
LLVM_ABI unsigned getNumSuccessors() const LLVM_READONLY
Return the number of successors that this instruction has.
Analysis pass that exposes the LoopInfo for a function.
Definition LoopInfo.h:569
LoopT * getLoopFor(const BlockT *BB) const
Return the inner most loop that BB lives in.
The legacy pass manager's analysis pass to compute loop information.
Definition LoopInfo.h:596
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
AnalysisType & getAnalysis() const
getAnalysis<AnalysisType>() - This function is used by subclasses to get to the analysis information ...
Analysis pass which computes a PostDominatorTree.
PostDominatorTree Class - Concrete subclass of DominatorTree that is used to compute the post-dominat...
LLVM_ABI bool dominates(const Instruction *I1, const Instruction *I2) const
Return true if I1 dominates I2.
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition Analysis.h:118
PreservedAnalysisChecker getChecker() const
Build a checker for this PreservedAnalyses and the specified analysis type.
Definition Analysis.h:275
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
bool contains(ConstPtrType Ptr) const
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Analysis pass providing the TargetLibraryInfo.
Provides information about what library functions are available for the current target.
bool getLibFunc(StringRef funcName, LibFunc &F) const
Searches for a particular function name.
bool isPointerTy() const
True if this is an instance of PointerType.
Definition Type.h:267
Value * getOperand(unsigned i) const
Definition User.h:207
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:256
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:322
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
CallInst * Call
@ BasicBlock
Various leaf nodes.
Definition ISDOpcodes.h:81
BlockType
Used as immediate MachineOperands for block signatures.
initializer< Ty > init(const Ty &Val)
NodeAddr< FuncNode * > Func
Definition RDFGraph.h:393
friend class Instruction
Iterator for Instructions in a `BasicBlock.
Definition BasicBlock.h:73
This is an optimization pass for GlobalISel generic memory operations.
Definition Types.h:26
FunctionAddr VTableAddr Value
Definition InstrProf.h:137
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
Definition STLExtras.h:2554
auto pred_end(const MachineBasicBlock *BB)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
auto successors(const MachineBasicBlock *BB)
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
scc_iterator< T > scc_begin(const T &G)
Construct the begin iterator for a deduced graph type T.
LLVM_ABI Constant * ConstantFoldCompareInstOperands(unsigned Predicate, Constant *LHS, Constant *RHS, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const Instruction *I=nullptr)
Attempt to constant fold a compare instruction (icmp/fcmp) with the specified operands.
iterator_range< po_iterator< T > > post_order(const T &G)
constexpr T divideNearest(U Numerator, V Denominator)
Returns (Numerator / Denominator) rounded by round-half-up.
Definition MathExtras.h:458
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1746
auto reverse(ContainerTy &&C)
Definition STLExtras.h:408
LLVM_ABI MDNode * getValidBranchWeightMDNode(const Instruction &I)
Get the valid branch weights metadata node.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:207
auto succ_size(const MachineBasicBlock *BB)
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
LLVM_ABI Constant * ConstantFoldBinaryOpOperands(unsigned Opcode, Constant *LHS, Constant *RHS, const DataLayout &DL)
Attempt to constant fold a binary operation with the specified operands.
RNSuccIterator< NodeRef, BlockT, RegionT > succ_begin(NodeRef Node)
iterator_range(Container &&) -> iterator_range< llvm::detail::IterOfRange< Container > >
auto count(R &&Range, const E &Element)
Wrapper function around std::count to count the number of times an element Element occurs in the give...
Definition STLExtras.h:2012
LLVM_ABI bool extractBranchWeights(const MDNode *ProfileData, SmallVectorImpl< uint32_t > &Weights)
Extract branch weights from MD_prof metadata.
auto pred_begin(const MachineBasicBlock *BB)
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
auto predecessors(const MachineBasicBlock *BB)
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1947
Instruction::const_succ_iterator const_succ_iterator
Definition CFG.h:139
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:872
A special type used by analysis passes to provide an address that identifies that particular analysis...
Definition Analysis.h:29