13#ifndef LLVM_ANALYSIS_BRANCHPROBABILITYINFO_H
14#define LLVM_ANALYSIS_BRANCHPROBABILITYINFO_H
38class PostDominatorTree;
39class TargetLibraryInfo;
127 EstimatedBlockWeight(
std::
move(Arg.EstimatedBlockWeight)) {
128 for (
auto &Handle : Handles)
137 Handles = std::move(
RHS.Handles);
138 Probs = std::move(
RHS.Probs);
139 EstimatedBlockWeight = std::move(
RHS.EstimatedBlockWeight);
140 for (
auto &Handle : Handles)
206 return IsLikely ? LikelyProb : LikelyProb.
getCompl();
237 using SccBlockTypeMaps = std::vector<SccBlockTypeMap>;
240 SccBlockTypeMaps SccBlocks;
252 return getSccBlockType(BB, SccNum) & Header;
257 return getSccBlockType(BB, SccNum) & Exiting;
276 void calculateSccBlockType(
const BasicBlock *BB,
int SccNum);
282 class BasicBlockCallbackVH final :
public CallbackVH {
285 void deleted()
override {
287 BPI->eraseBlock(cast<BasicBlock>(
getValPtr()));
299 using LoopData = std::pair<Loop *, int>;
303 LLVM_ABI explicit LoopBlock(
const BasicBlock *BB,
const LoopInfo &LI,
304 const SccInfo &SccI);
306 const BasicBlock *getBlock()
const {
return BB; }
308 LoopData getLoopData()
const {
return LD; }
309 Loop *getLoop()
const {
return LD.first; }
310 int getSccNum()
const {
return LD.second; }
312 bool belongsToLoop()
const {
return getLoop() || getSccNum() != -1; }
313 bool belongsToSameLoop(
const LoopBlock &LB)
const {
314 return (LB.getLoop() && getLoop() == LB.getLoop()) ||
315 (LB.getSccNum() != -1 && getSccNum() == LB.getSccNum());
320 LoopData
LD = {
nullptr, -1};
324 using LoopEdge = std::pair<const LoopBlock &, const LoopBlock &>;
326 DenseSet<BasicBlockCallbackVH, DenseMapInfo<Value*>> Handles;
330 using Edge = std::pair<const BasicBlock *, unsigned>;
332 DenseMap<Edge, BranchProbability> Probs;
337 const LoopInfo *LI =
nullptr;
340 std::unique_ptr<const SccInfo> SccI;
343 SmallDenseMap<const BasicBlock *, uint32_t> EstimatedBlockWeight;
346 SmallDenseMap<LoopData, uint32_t> EstimatedLoopWeight;
349 LoopBlock getLoopBlock(
const BasicBlock *BB)
const {
350 return LoopBlock(BB, *LI, *SccI);
356 bool isLoopEnteringEdge(
const LoopEdge &Edge)
const;
360 bool isLoopExitingEdge(
const LoopEdge &Edge)
const;
363 bool isLoopEnteringExitingEdge(
const LoopEdge &Edge)
const;
366 bool isLoopBackEdge(
const LoopEdge &Edge)
const;
368 void getLoopEnterBlocks(
const LoopBlock &LB,
369 SmallVectorImpl<BasicBlock *> &Enters)
const;
371 void getLoopExitBlocks(
const LoopBlock &LB,
372 SmallVectorImpl<BasicBlock *> &Exits)
const;
376 std::optional<uint32_t> getEstimatedBlockWeight(
const BasicBlock *BB)
const;
381 std::optional<uint32_t> getEstimatedLoopWeight(
const LoopData &L)
const;
385 std::optional<uint32_t> getEstimatedEdgeWeight(
const LoopEdge &Edge)
const;
390 template <
class IterT>
391 std::optional<uint32_t>
392 getMaxEstimatedEdgeWeight(
const LoopBlock &SrcBB,
393 iterator_range<IterT> Successors)
const;
399 bool updateEstimatedBlockWeight(LoopBlock &LoopBB,
uint32_t BBWeight,
400 SmallVectorImpl<BasicBlock *> &BlockWorkList,
401 SmallVectorImpl<LoopBlock> &LoopWorkList);
405 void propagateEstimatedBlockWeight(
const LoopBlock &LoopBB, DominatorTree *DT,
406 PostDominatorTree *PDT,
uint32_t BBWeight,
407 SmallVectorImpl<BasicBlock *> &WorkList,
408 SmallVectorImpl<LoopBlock> &LoopWorkList);
411 std::optional<uint32_t> getInitialEstimatedBlockWeight(
const BasicBlock *BB);
414 void estimateBlockWeights(
const Function &
F, DominatorTree *DT,
415 PostDominatorTree *PDT);
419 bool calcEstimatedHeuristics(
const BasicBlock *BB);
420 bool calcMetadataWeights(
const BasicBlock *BB);
421 bool calcPointerHeuristics(
const BasicBlock *BB);
422 bool calcZeroHeuristics(
const BasicBlock *BB,
const TargetLibraryInfo *TLI);
423 bool calcFloatingPointHeuristics(
const BasicBlock *BB);
468 void releaseMemory()
override;
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static void print(raw_ostream &Out, object::Archive::Kind Kind, T Val)
This file defines DenseMapInfo traits for DenseMap.
This file defines the DenseMap class.
This file defines the DenseSet and SmallDenseSet classes.
static bool runOnFunction(Function &F, bool PostInlining)
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.
API to communicate dependencies between analyses during invalidation.
A container for analyses that lazily runs them and caches their results.
Represent the analysis usage information of a pass.
LLVM Basic Block Representation.
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.
const BranchProbabilityInfo & getBPI() const
BranchProbabilityInfo & getBPI()
bool isSCCHeader(const BasicBlock *BB, int SccNum) const
Returns true if BB is a 'header' block in SCC with SccNum ID, false otherwise.
LLVM_ABI void getSccEnterBlocks(int SccNum, SmallVectorImpl< BasicBlock * > &Enters) const
Fills in Enters vector with all such blocks that don't belong to SCC with SccNum ID but there is an e...
bool isSCCExitingBlock(const BasicBlock *BB, int SccNum) const
Returns true if BB is an 'exiting' block in SCC with SccNum ID, false otherwise.
LLVM_ABI void getSccExitBlocks(int SccNum, SmallVectorImpl< BasicBlock * > &Exits) const
Fills in Exits vector with all such blocks that don't belong to SCC with SccNum ID but there is an ed...
LLVM_ABI int getSCCNum(const BasicBlock *BB) const
If BB belongs to some SCC then ID of that SCC is returned, otherwise -1 is returned.
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.
BranchProbabilityInfo(const BranchProbabilityInfo &)=delete
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.
static BranchProbability getBranchProbStackProtector(bool IsLikely)
LLVM_ABI void calculate(const Function &F, const LoopInfo &LI, const TargetLibraryInfo *TLI, DominatorTree *DT, PostDominatorTree *PDT)
BranchProbabilityInfo & operator=(BranchProbabilityInfo &&RHS)
BranchProbabilityInfo()=default
LLVM_ABI void releaseMemory()
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.
BranchProbabilityInfo(BranchProbabilityInfo &&Arg)
LLVM_ABI void print(raw_ostream &OS) const
BranchProbabilityInfo(const Function &F, const LoopInfo &LI, const TargetLibraryInfo *TLI=nullptr, DominatorTree *DT=nullptr, PostDominatorTree *PDT=nullptr)
BranchProbabilityInfo & operator=(const BranchProbabilityInfo &)=delete
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.
Printer pass for the BranchProbabilityAnalysis results.
BranchProbabilityPrinterPass(raw_ostream &OS)
LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
BranchProbability getCompl() const
Value handle with callbacks on RAUW and destruction.
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
FunctionPass class - This class is used to implement most global optimizations.
A Module instance is used to store all the information related to an LLVM module.
PostDominatorTree Class - Concrete subclass of DominatorTree that is used to compute the post-dominat...
A set of analyses that are preserved following a run of a transformation pass.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Provides information about what library functions are available for the current target.
Value * getValPtr() const
This class implements an extremely fast bulk output stream that can only output to a stream.
@ BasicBlock
Various leaf nodes.
This is an optimization pass for GlobalISel generic memory operations.
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Implement std::hash so that hash_code can be used in STL containers.
A CRTP mix-in that provides informational APIs needed for analysis passes.
A special type used by analysis passes to provide an address that identifies that particular analysis...
A CRTP mix-in to automatically provide informational APIs needed for passes.