LLVM 22.0.0git
llvm::SampleProfileLoaderBaseImpl< FT > Class Template Reference

#include "llvm/Transforms/Utils/SampleProfileLoaderBaseImpl.h"

Inheritance diagram for llvm::SampleProfileLoaderBaseImpl< FT >:
[legend]

Public Types

using NodeRef = typename GraphTraits<FT *>::NodeRef
using BT = std::remove_pointer_t<NodeRef>
using InstructionT = typename afdo_detail::IRTraits<BT>::InstructionT
using BasicBlockT = typename afdo_detail::IRTraits<BT>::BasicBlockT
using BlockFrequencyInfoT
using FunctionT = typename afdo_detail::IRTraits<BT>::FunctionT
using LoopT = typename afdo_detail::IRTraits<BT>::LoopT
using LoopInfoPtrT = typename afdo_detail::IRTraits<BT>::LoopInfoPtrT
using DominatorTreePtrT
using PostDominatorTreePtrT
using PostDominatorTreeT
using OptRemarkEmitterT
using OptRemarkAnalysisT
using PredRangeT = typename afdo_detail::IRTraits<BT>::PredRangeT
using SuccRangeT = typename afdo_detail::IRTraits<BT>::SuccRangeT
using BlockWeightMap = DenseMap<const BasicBlockT *, uint64_t>
using EquivalenceClassMap
using Edge = std::pair<const BasicBlockT *, const BasicBlockT *>
using EdgeWeightMap = DenseMap<Edge, uint64_t>
using BlockEdgeMap

Public Member Functions

 SampleProfileLoaderBaseImpl (std::string Name, std::string RemapName, IntrusiveRefCntPtr< vfs::FileSystem > FS)
void dump ()

Protected Member Functions

 ~SampleProfileLoaderBaseImpl ()=default
FunctiongetFunction (FunctionT &F)
const BasicBlockTgetEntryBB (const FunctionT *F)
PredRangeT getPredecessors (BasicBlockT *BB)
SuccRangeT getSuccessors (BasicBlockT *BB)
unsigned getFunctionLoc (FunctionT &Func)
 Get the line number for the function header.
virtual ErrorOr< uint64_tgetInstWeight (const InstructionT &Inst)
 Get the weight for an instruction.
ErrorOr< uint64_tgetInstWeightImpl (const InstructionT &Inst)
virtual ErrorOr< uint64_tgetProbeWeight (const InstructionT &Inst)
ErrorOr< uint64_tgetBlockWeight (const BasicBlockT *BB)
 Compute the weight of a basic block.
virtual const FunctionSamplesfindFunctionSamples (const InstructionT &I) const
 Get the FunctionSamples for an instruction.
void printEdgeWeight (raw_ostream &OS, Edge E)
 Print the weight of edge E on stream OS.
void printBlockWeight (raw_ostream &OS, const BasicBlockT *BB) const
 Print the weight of block BB on stream OS.
void printBlockEquivalence (raw_ostream &OS, const BasicBlockT *BB)
 Print the equivalence class of block BB on stream OS.
bool computeBlockWeights (FunctionT &F)
 Compute and store the weights of every basic block.
void findEquivalenceClasses (FunctionT &F)
 Find equivalence classes.
void findEquivalencesFor (BasicBlockT *BB1, ArrayRef< BasicBlockT * > Descendants, PostDominatorTreeT *DomTree)
 Find equivalence classes for the given block.
void propagateWeights (FunctionT &F)
 Propagate weights into edges.
void applyProfi (FunctionT &F, BlockEdgeMap &Successors, BlockWeightMap &SampleBlockWeights, BlockWeightMap &BlockWeights, EdgeWeightMap &EdgeWeights)
uint64_t visitEdge (Edge E, unsigned *NumUnknownEdges, Edge *UnknownEdge)
 Visit the given edge to decide if it has a valid weight.
void buildEdges (FunctionT &F)
 Build in/out edge lists for each basic block in the CFG.
bool propagateThroughEdges (FunctionT &F, bool UpdateBlockCount)
 Propagate weights through incoming/outgoing edges.
void clearFunctionData (bool ResetDT=true)
 Clear all the per-function data used to load samples and propagate weights.
void computeDominanceAndLoopInfo (FunctionT &F)
bool computeAndPropagateWeights (FunctionT &F, const DenseSet< GlobalValue::GUID > &InlinedGUIDs)
 Generate branch weight metadata for all branches in F.
void initWeightPropagation (FunctionT &F, const DenseSet< GlobalValue::GUID > &InlinedGUIDs)
void finalizeWeightPropagation (FunctionT &F, const DenseSet< GlobalValue::GUID > &InlinedGUIDs)
void emitCoverageRemarks (FunctionT &F)
void computeDominanceAndLoopInfo (MachineFunction &F)
void computeDominanceAndLoopInfo (Function &F)

Protected Attributes

DenseMap< const DILocation *, const FunctionSamples * > DILocation2SampleMap
BlockWeightMap BlockWeights
 Map basic blocks to their computed weights.
EdgeWeightMap EdgeWeights
 Map edges to their computed weights.
SmallPtrSet< const BasicBlockT *, 32 > VisitedBlocks
 Set of visited blocks during propagation.
SmallSet< Edge, 32 > VisitedEdges
 Set of visited edges during propagation.
EquivalenceClassMap EquivalenceClass
 Equivalence classes for block weights.
DominatorTreePtrT DT
 Dominance, post-dominance and loop information.
PostDominatorTreePtrT PDT
LoopInfoPtrT LI
BlockEdgeMap Predecessors
 Predecessors for each basic block in the CFG.
BlockEdgeMap Successors
 Successors for each basic block in the CFG.
SampleCoverageTracker CoverageTracker
 Profile coverage tracker.
std::unique_ptr< SampleProfileReaderReader
 Profile reader object.
std::map< SampleContext, FunctionSamplesOutlineFunctionSamples
 Synthetic samples created by duplicating the samples of inlined functions from the original profile as if they were top level sample profiles.
std::unique_ptr< PseudoProbeManagerProbeManager
FunctionSamplesSamples = nullptr
 Samples collected for the body of this function.
std::string Filename
 Name of the profile file to load.
std::string RemappingFilename
 Name of the profile remapping file to load.
IntrusiveRefCntPtr< vfs::FileSystemFS
 VirtualFileSystem to load profile files from.
ProfileSummaryInfoPSI = nullptr
 Profile Summary Info computed from sample profile.
OptRemarkEmitterTORE = nullptr
 Optimization Remark Emitter used to emit diagnostic remarks.

Friends

class SampleCoverageTracker

Detailed Description

template<typename FT>
class llvm::SampleProfileLoaderBaseImpl< FT >

Definition at line 176 of file SampleProfileLoaderBaseImpl.h.

Member Typedef Documentation

◆ BasicBlockT

template<typename FT>
using llvm::SampleProfileLoaderBaseImpl< FT >::BasicBlockT = typename afdo_detail::IRTraits<BT>::BasicBlockT

Definition at line 186 of file SampleProfileLoaderBaseImpl.h.

◆ BlockEdgeMap

template<typename FT>
using llvm::SampleProfileLoaderBaseImpl< FT >::BlockEdgeMap

◆ BlockFrequencyInfoT

template<typename FT>
using llvm::SampleProfileLoaderBaseImpl< FT >::BlockFrequencyInfoT

◆ BlockWeightMap

template<typename FT>
using llvm::SampleProfileLoaderBaseImpl< FT >::BlockWeightMap = DenseMap<const BasicBlockT *, uint64_t>

Definition at line 205 of file SampleProfileLoaderBaseImpl.h.

◆ BT

template<typename FT>
using llvm::SampleProfileLoaderBaseImpl< FT >::BT = std::remove_pointer_t<NodeRef>

Definition at line 184 of file SampleProfileLoaderBaseImpl.h.

◆ DominatorTreePtrT

template<typename FT>
using llvm::SampleProfileLoaderBaseImpl< FT >::DominatorTreePtrT
Initial value:

Definition at line 192 of file SampleProfileLoaderBaseImpl.h.

◆ Edge

template<typename FT>
using llvm::SampleProfileLoaderBaseImpl< FT >::Edge = std::pair<const BasicBlockT *, const BasicBlockT *>

Definition at line 208 of file SampleProfileLoaderBaseImpl.h.

◆ EdgeWeightMap

template<typename FT>
using llvm::SampleProfileLoaderBaseImpl< FT >::EdgeWeightMap = DenseMap<Edge, uint64_t>

Definition at line 209 of file SampleProfileLoaderBaseImpl.h.

◆ EquivalenceClassMap

template<typename FT>
using llvm::SampleProfileLoaderBaseImpl< FT >::EquivalenceClassMap

◆ FunctionT

template<typename FT>
using llvm::SampleProfileLoaderBaseImpl< FT >::FunctionT = typename afdo_detail::IRTraits<BT>::FunctionT

Definition at line 189 of file SampleProfileLoaderBaseImpl.h.

◆ InstructionT

template<typename FT>
using llvm::SampleProfileLoaderBaseImpl< FT >::InstructionT = typename afdo_detail::IRTraits<BT>::InstructionT

Definition at line 185 of file SampleProfileLoaderBaseImpl.h.

◆ LoopInfoPtrT

template<typename FT>
using llvm::SampleProfileLoaderBaseImpl< FT >::LoopInfoPtrT = typename afdo_detail::IRTraits<BT>::LoopInfoPtrT

Definition at line 191 of file SampleProfileLoaderBaseImpl.h.

◆ LoopT

template<typename FT>
using llvm::SampleProfileLoaderBaseImpl< FT >::LoopT = typename afdo_detail::IRTraits<BT>::LoopT

Definition at line 190 of file SampleProfileLoaderBaseImpl.h.

◆ NodeRef

template<typename FT>
using llvm::SampleProfileLoaderBaseImpl< FT >::NodeRef = typename GraphTraits<FT *>::NodeRef

Definition at line 183 of file SampleProfileLoaderBaseImpl.h.

◆ OptRemarkAnalysisT

template<typename FT>
using llvm::SampleProfileLoaderBaseImpl< FT >::OptRemarkAnalysisT
Initial value:

Definition at line 200 of file SampleProfileLoaderBaseImpl.h.

◆ OptRemarkEmitterT

template<typename FT>
using llvm::SampleProfileLoaderBaseImpl< FT >::OptRemarkEmitterT
Initial value:

Definition at line 198 of file SampleProfileLoaderBaseImpl.h.

◆ PostDominatorTreePtrT

template<typename FT>
using llvm::SampleProfileLoaderBaseImpl< FT >::PostDominatorTreePtrT
Initial value:

Definition at line 194 of file SampleProfileLoaderBaseImpl.h.

◆ PostDominatorTreeT

template<typename FT>
using llvm::SampleProfileLoaderBaseImpl< FT >::PostDominatorTreeT
Initial value:

Definition at line 196 of file SampleProfileLoaderBaseImpl.h.

◆ PredRangeT

template<typename FT>
using llvm::SampleProfileLoaderBaseImpl< FT >::PredRangeT = typename afdo_detail::IRTraits<BT>::PredRangeT

Definition at line 202 of file SampleProfileLoaderBaseImpl.h.

◆ SuccRangeT

template<typename FT>
using llvm::SampleProfileLoaderBaseImpl< FT >::SuccRangeT = typename afdo_detail::IRTraits<BT>::SuccRangeT

Definition at line 203 of file SampleProfileLoaderBaseImpl.h.

Constructor & Destructor Documentation

◆ SampleProfileLoaderBaseImpl()

template<typename FT>
llvm::SampleProfileLoaderBaseImpl< FT >::SampleProfileLoaderBaseImpl ( std::string Name,
std::string RemapName,
IntrusiveRefCntPtr< vfs::FileSystem > FS )
inline

Definition at line 178 of file SampleProfileLoaderBaseImpl.h.

References Filename, FS, llvm::move(), and RemappingFilename.

◆ ~SampleProfileLoaderBaseImpl()

template<typename FT>
llvm::SampleProfileLoaderBaseImpl< FT >::~SampleProfileLoaderBaseImpl ( )
protecteddefault

Member Function Documentation

◆ applyProfi()

template<typename FT>
void llvm::SampleProfileLoaderBaseImpl< FT >::applyProfi ( FunctionT & F,
BlockEdgeMap & Successors,
BlockWeightMap & SampleBlockWeights,
BlockWeightMap & BlockWeights,
EdgeWeightMap & EdgeWeights )
protected

Definition at line 977 of file SampleProfileLoaderBaseImpl.h.

References BlockWeights, EdgeWeights, F, and Successors.

Referenced by propagateWeights().

◆ buildEdges()

template<typename BT>
void llvm::SampleProfileLoaderBaseImpl< BT >::buildEdges ( FunctionT & F)
protected

Build in/out edge lists for each basic block in the CFG.

We are interested in unique edges. If a block B1 has multiple edges to another block B2, we only add a single B1->B2 edge.

Definition at line 880 of file SampleProfileLoaderBaseImpl.h.

References llvm::SmallPtrSetImplBase::clear(), F, getPredecessors(), getSuccessors(), llvm::SmallPtrSetImpl< PtrType >::insert(), llvm_unreachable, Predecessors, and Successors.

Referenced by initWeightPropagation().

◆ clearFunctionData()

template<typename BT>
void llvm::SampleProfileLoaderBaseImpl< BT >::clearFunctionData ( bool ResetDT = true)
protected

Clear all the per-function data used to load samples and propagate weights.

Definition at line 338 of file SampleProfileLoaderBaseImpl.h.

References BlockWeights, CoverageTracker, DT, EdgeWeights, EquivalenceClass, LI, PDT, Predecessors, Successors, VisitedBlocks, and VisitedEdges.

◆ computeAndPropagateWeights()

template<typename BT>
bool llvm::SampleProfileLoaderBaseImpl< BT >::computeAndPropagateWeights ( FunctionT & F,
const DenseSet< GlobalValue::GUID > & InlinedGUIDs )
protected

Generate branch weight metadata for all branches in F.

Branch weights are computed out of instruction samples using a propagation heuristic. Propagation proceeds in 3 phases:

1- Assignment of block weights. All the basic blocks in the function are initial assigned the same weight as their most frequently executed instruction.

2- Creation of equivalence classes. Since samples may be missing from blocks, we can fill in the gaps by setting the weights of all the blocks in the same equivalence class to the same weight. To compute the concept of equivalence, we use dominance and loop information. Two blocks B1 and B2 are in the same equivalence class if B1 dominates B2, B2 post-dominates B1 and both are in the same loop.

3- Propagation of block weights into edges. This uses a simple propagation heuristic. The following rules are applied to every block BB in the CFG:

  • If BB has a single predecessor/successor, then the weight of that edge is the weight of the block.
  • If all the edges are known except one, and the weight of the block is already known, the weight of the unknown edge will be the weight of the block minus the sum of all the known edges. If the sum of all the known edges is larger than BB's weight, we set the unknown edge weight to zero.
  • If there is a self-referential edge, and the weight of the block is known, the weight for that edge is set to the weight of the block minus the weight of the other incoming edges to that block (if known).

Since this propagation is not guaranteed to finalize for every CFG, we only allow it to proceed for a limited number of iterations (controlled by -sample-profile-max-propagate-iterations).

FIXME: Try to replace this propagation heuristic with a scheme that is guaranteed to finalize. A work-list approach similar to the standard value propagation algorithm used by SSA-CCP might work here.

Parameters
FThe function to query.
Returns
true if F was modified. Returns false, otherwise.

Definition at line 1031 of file SampleProfileLoaderBaseImpl.h.

References Changed, computeBlockWeights(), F, finalizeWeightPropagation(), initWeightPropagation(), propagateWeights(), and llvm::detail::DenseSetImpl< ValueT, MapTy, ValueInfoT >::size().

◆ computeBlockWeights()

template<typename BT>
bool llvm::SampleProfileLoaderBaseImpl< BT >::computeBlockWeights ( FunctionT & F)
protected

Compute and store the weights of every basic block.

This populates the BlockWeights map by computing the weights of every basic block in the CFG.

Parameters
FThe function to query.

Definition at line 535 of file SampleProfileLoaderBaseImpl.h.

References BlockWeights, Changed, llvm::dbgs(), F, llvm::ErrorOr< T >::get(), getBlockWeight(), LLVM_DEBUG, printBlockWeight(), and VisitedBlocks.

Referenced by computeAndPropagateWeights().

◆ computeDominanceAndLoopInfo() [1/3]

void llvm::SampleProfileLoaderBaseImpl< Function >::computeDominanceAndLoopInfo ( Function & F)
protected

Definition at line 643 of file SampleProfile.cpp.

◆ computeDominanceAndLoopInfo() [2/3]

template<typename FT>
void llvm::SampleProfileLoaderBaseImpl< FT >::computeDominanceAndLoopInfo ( FunctionT & F)
protected

References F.

Referenced by initWeightPropagation().

◆ computeDominanceAndLoopInfo() [3/3]

void llvm::SampleProfileLoaderBaseImpl< MachineFunction >::computeDominanceAndLoopInfo ( MachineFunction & F)
protected

Definition at line 203 of file MIRSampleProfile.cpp.

◆ dump()

template<typename FT>
void llvm::SampleProfileLoaderBaseImpl< FT >::dump ( )
inline

Definition at line 181 of file SampleProfileLoaderBaseImpl.h.

References Reader.

◆ emitCoverageRemarks()

◆ finalizeWeightPropagation()

◆ findEquivalenceClasses()

template<typename BT>
void llvm::SampleProfileLoaderBaseImpl< BT >::findEquivalenceClasses ( FunctionT & F)
protected

Find equivalence classes.

Since samples may be missing from blocks, we can fill in the gaps by setting the weights of all the blocks in the same equivalence class to the same weight. To compute the concept of equivalence, we use dominance and loop information. Two blocks B1 and B2 are in the same equivalence class if B1 dominates B2, B2 post-dominates B1 and both are in the same loop.

Parameters
FThe function to query.

Definition at line 642 of file SampleProfileLoaderBaseImpl.h.

References BlockWeights, llvm::SmallVectorImpl< T >::clear(), llvm::dbgs(), DT, EquivalenceClass, F, findEquivalencesFor(), LLVM_DEBUG, PDT, printBlockEquivalence(), and printBlockWeight().

Referenced by initWeightPropagation().

◆ findEquivalencesFor()

template<typename BT>
void llvm::SampleProfileLoaderBaseImpl< BT >::findEquivalencesFor ( BasicBlockT * BB1,
ArrayRef< BasicBlockT * > Descendants,
PostDominatorTreeT * DomTree )
protected

Find equivalence classes for the given block.

This finds all the blocks that are guaranteed to execute the same number of times as BB1. To do this, it traverses all the descendants of BB1 in the dominator or post-dominator tree.

A block BB2 will be in the same equivalence class as BB1 if the following holds:

1- BB1 is a descendant of BB2 in the opposite tree. So, if BB2 is a descendant of BB1 in the dominator tree, then BB2 should dominate BB1 in the post-dominator tree.

2- Both BB2 and BB1 must be in the same loop.

For every block BB2 that meets those two requirements, we set BB2's equivalence class to BB1.

Parameters
BB1Block to check.
DescendantsDescendants of BB1 in either the dom or pdom tree.
DomTreeOpposite dominator tree. If Descendants is filled with blocks from BB1's dominator tree, then this is the post-dominator tree, and vice versa.

Definition at line 598 of file SampleProfileLoaderBaseImpl.h.

References BlockWeights, EquivalenceClass, getEntryBB(), LI, Samples, and VisitedBlocks.

Referenced by findEquivalenceClasses().

◆ findFunctionSamples()

template<typename BT>
const FunctionSamples * llvm::SampleProfileLoaderBaseImpl< BT >::findFunctionSamples ( const InstructionT & Inst) const
protectedvirtual

Get the FunctionSamples for an instruction.

The FunctionSamples of an instruction Inst is the inlined instance in which that instruction is coming from. We traverse the inline stack of that instruction, and match it with the tree nodes in the profile.

Parameters
InstInstruction to query.
Returns
the FunctionSamples pointer to the inlined instance.

Definition at line 561 of file SampleProfileLoaderBaseImpl.h.

References DILocation2SampleMap, Reader, and Samples.

Referenced by getInstWeightImpl(), and getProbeWeight().

◆ getBlockWeight()

template<typename BT>
ErrorOr< uint64_t > llvm::SampleProfileLoaderBaseImpl< BT >::getBlockWeight ( const BasicBlockT * BB)
protected

Compute the weight of a basic block.

The weight of basic block BB is the maximum weight of all the instructions in BB.

Parameters
BBThe basic block to query.
Returns
the weight for BB.

Definition at line 515 of file SampleProfileLoaderBaseImpl.h.

References getInstWeight(), and I.

Referenced by computeBlockWeights(), finalizeWeightPropagation(), and propagateWeights().

◆ getEntryBB()

template<typename FT>
const BasicBlockT * llvm::SampleProfileLoaderBaseImpl< FT >::getEntryBB ( const FunctionT * F)
inlineprotected

Definition at line 220 of file SampleProfileLoaderBaseImpl.h.

References F.

Referenced by finalizeWeightPropagation(), and findEquivalencesFor().

◆ getFunction()

template<typename FT>
Function & llvm::SampleProfileLoaderBaseImpl< FT >::getFunction ( FunctionT & F)
inlineprotected

Definition at line 217 of file SampleProfileLoaderBaseImpl.h.

References F.

◆ getFunctionLoc()

template<typename BT>
unsigned llvm::SampleProfileLoaderBaseImpl< BT >::getFunctionLoc ( FunctionT & F)
protected

Get the line number for the function header.

This looks up function F in the current compilation unit and retrieves the line number where the function is defined. This is line 0 for all the samples read from the profile file. Every line number is relative to this line.

Parameters
FFunction object to query.
Returns
the line number where F is defined. If it returns 0, it means that there is no debug information available for F.

Definition at line 1143 of file SampleProfileLoaderBaseImpl.h.

References llvm::DS_Warning, F, getFunction(), and llvm::NoWarnSampleUnused.

Referenced by emitCoverageRemarks().

◆ getInstWeight()

template<typename BT>
ErrorOr< uint64_t > llvm::SampleProfileLoaderBaseImpl< BT >::getInstWeight ( const InstructionT & Inst)
protectedvirtual

Get the weight for an instruction.

The "weight" of an instruction Inst is the number of samples collected on that instruction at runtime. To retrieve it, we need to compute the line number of Inst relative to the start of its function. We use HeaderLineno to compute the offset. We then look up the samples collected for Inst using BodySamples.

Parameters
InstInstruction to query.
Returns
the weight of Inst.

Definition at line 403 of file SampleProfileLoaderBaseImpl.h.

References getInstWeightImpl(), getProbeWeight(), and llvm::sampleprof::FunctionSamples::ProfileIsProbeBased.

Referenced by getBlockWeight().

◆ getInstWeightImpl()

◆ getPredecessors()

template<typename FT>
PredRangeT llvm::SampleProfileLoaderBaseImpl< FT >::getPredecessors ( BasicBlockT * BB)
inlineprotected

Definition at line 223 of file SampleProfileLoaderBaseImpl.h.

Referenced by buildEdges().

◆ getProbeWeight()

◆ getSuccessors()

template<typename FT>
SuccRangeT llvm::SampleProfileLoaderBaseImpl< FT >::getSuccessors ( BasicBlockT * BB)
inlineprotected

Definition at line 226 of file SampleProfileLoaderBaseImpl.h.

Referenced by buildEdges().

◆ initWeightPropagation()

◆ printBlockEquivalence()

template<typename BT>
void llvm::SampleProfileLoaderBaseImpl< BT >::printBlockEquivalence ( raw_ostream & OS,
const BasicBlockT * BB )
protected

Print the equivalence class of block BB on stream OS.

Parameters
OSStream to emit the output to.
BBBlock to print.

Definition at line 370 of file SampleProfileLoaderBaseImpl.h.

References EquivalenceClass.

Referenced by findEquivalenceClasses().

◆ printBlockWeight()

template<typename BT>
void llvm::SampleProfileLoaderBaseImpl< BT >::printBlockWeight ( raw_ostream & OS,
const BasicBlockT * BB ) const
protected

Print the weight of block BB on stream OS.

Parameters
OSStream to emit the output to.
BBBlock to print.

Definition at line 382 of file SampleProfileLoaderBaseImpl.h.

References BlockWeights, and I.

Referenced by computeBlockWeights(), findEquivalenceClasses(), and propagateThroughEdges().

◆ printEdgeWeight()

template<typename BT>
void llvm::SampleProfileLoaderBaseImpl< BT >::printEdgeWeight ( raw_ostream & OS,
Edge E )
protected

Print the weight of edge E on stream OS.

Parameters
OSStream to emit the output to.
EEdge to print.

Definition at line 360 of file SampleProfileLoaderBaseImpl.h.

References E(), and EdgeWeights.

Referenced by propagateThroughEdges().

◆ propagateThroughEdges()

template<typename BT>
bool llvm::SampleProfileLoaderBaseImpl< BT >::propagateThroughEdges ( FunctionT & F,
bool UpdateBlockCount )
protected

Propagate weights through incoming/outgoing edges.

If the weight of a basic block is known, and there is only one edge with an unknown weight, we can calculate the weight of that edge.

Similarly, if all the edges have a known count, we can calculate the count of the basic block, if needed.

Parameters
FFunction to process.
UpdateBlockCountWhether we should update basic block counts that has already been annotated.
Returns
True if new weights were assigned to edges or blocks.

Definition at line 728 of file SampleProfileLoaderBaseImpl.h.

References BlockWeights, Changed, llvm::dbgs(), E(), EdgeWeights, EquivalenceClass, F, LLVM_DEBUG, Predecessors, printBlockWeight(), printEdgeWeight(), Successors, VisitedBlocks, VisitedEdges, and visitEdge().

Referenced by propagateWeights().

◆ propagateWeights()

template<typename BT>
void llvm::SampleProfileLoaderBaseImpl< BT >::propagateWeights ( FunctionT & F)
protected

Propagate weights into edges.

The following rules are applied to every block BB in the CFG:

  • If BB has a single predecessor/successor, then the weight of that edge is the weight of the block.
  • If all incoming or outgoing edges are known except one, and the weight of the block is already known, the weight of the unknown edge will be the weight of the block minus the sum of all the known edges. If the sum of all the known edges is larger than BB's weight, we set the unknown edge weight to zero.
  • If there is a self-referential edge, and the weight of the block is known, the weight for that edge is set to the weight of the block minus the weight of the other incoming edges to that block (if known).

Definition at line 922 of file SampleProfileLoaderBaseImpl.h.

References applyProfi(), BlockWeights, Changed, EdgeWeights, F, llvm::ErrorOr< T >::get(), getBlockWeight(), I, LI, propagateThroughEdges(), llvm::SampleProfileMaxPropagateIterations, llvm::SampleProfileUseProfi, Successors, and VisitedEdges.

Referenced by computeAndPropagateWeights().

◆ visitEdge()

template<typename BT>
uint64_t llvm::SampleProfileLoaderBaseImpl< BT >::visitEdge ( Edge E,
unsigned * NumUnknownEdges,
Edge * UnknownEdge )
protected

Visit the given edge to decide if it has a valid weight.

If E has not been visited before, we copy to UnknownEdge and increment the count of unknown edges.

Parameters
EEdge to visit.
NumUnknownEdgesCurrent number of unknown edges.
UnknownEdgeSet if E has not been visited before.
Returns
E's weight, if known. Otherwise, return 0.

Definition at line 702 of file SampleProfileLoaderBaseImpl.h.

References E(), EdgeWeights, and VisitedEdges.

Referenced by propagateThroughEdges().

◆ SampleCoverageTracker

template<typename FT>
friend class SampleCoverageTracker
friend

Definition at line 215 of file SampleProfileLoaderBaseImpl.h.

References SampleCoverageTracker.

Referenced by SampleCoverageTracker.

Member Data Documentation

◆ BlockWeights

template<typename FT>
BlockWeightMap llvm::SampleProfileLoaderBaseImpl< FT >::BlockWeights
protected

Map basic blocks to their computed weights.

The weight of a basic block is defined to be the maximum of all the instruction weights in that block.

Definition at line 270 of file SampleProfileLoaderBaseImpl.h.

Referenced by applyProfi(), clearFunctionData(), computeBlockWeights(), finalizeWeightPropagation(), findEquivalenceClasses(), findEquivalencesFor(), printBlockWeight(), propagateThroughEdges(), and propagateWeights().

◆ CoverageTracker

template<typename FT>
SampleCoverageTracker llvm::SampleProfileLoaderBaseImpl< FT >::CoverageTracker
protected

Profile coverage tracker.

Definition at line 304 of file SampleProfileLoaderBaseImpl.h.

Referenced by clearFunctionData(), emitCoverageRemarks(), getInstWeightImpl(), and getProbeWeight().

◆ DILocation2SampleMap

template<typename FT>
DenseMap<const DILocation *, const FunctionSamples *> llvm::SampleProfileLoaderBaseImpl< FT >::DILocation2SampleMap
mutableprotected

Definition at line 236 of file SampleProfileLoaderBaseImpl.h.

Referenced by findFunctionSamples().

◆ DT

template<typename FT>
DominatorTreePtrT llvm::SampleProfileLoaderBaseImpl< FT >::DT
protected

Dominance, post-dominance and loop information.

Definition at line 293 of file SampleProfileLoaderBaseImpl.h.

Referenced by clearFunctionData(), and findEquivalenceClasses().

◆ EdgeWeights

template<typename FT>
EdgeWeightMap llvm::SampleProfileLoaderBaseImpl< FT >::EdgeWeights
protected

Map edges to their computed weights.

Edge weights are computed by propagating basic block weights in SampleProfile::propagateWeights.

Definition at line 276 of file SampleProfileLoaderBaseImpl.h.

Referenced by applyProfi(), clearFunctionData(), printEdgeWeight(), propagateThroughEdges(), propagateWeights(), and visitEdge().

◆ EquivalenceClass

template<typename FT>
EquivalenceClassMap llvm::SampleProfileLoaderBaseImpl< FT >::EquivalenceClass
protected

Equivalence classes for block weights.

Two blocks BB1 and BB2 are in the same equivalence class if they dominate and post-dominate each other, and they are in the same loop nest. When this happens, the two blocks are guaranteed to execute the same number of times.

Definition at line 290 of file SampleProfileLoaderBaseImpl.h.

Referenced by clearFunctionData(), findEquivalenceClasses(), findEquivalencesFor(), printBlockEquivalence(), and propagateThroughEdges().

◆ Filename

template<typename FT>
std::string llvm::SampleProfileLoaderBaseImpl< FT >::Filename
protected

Name of the profile file to load.

Definition at line 321 of file SampleProfileLoaderBaseImpl.h.

Referenced by SampleProfileLoaderBaseImpl().

◆ FS

template<typename FT>
IntrusiveRefCntPtr<vfs::FileSystem> llvm::SampleProfileLoaderBaseImpl< FT >::FS
protected

VirtualFileSystem to load profile files from.

Definition at line 327 of file SampleProfileLoaderBaseImpl.h.

Referenced by getInstWeightImpl(), getProbeWeight(), and SampleProfileLoaderBaseImpl().

◆ LI

template<typename FT>
LoopInfoPtrT llvm::SampleProfileLoaderBaseImpl< FT >::LI
protected

◆ ORE

template<typename FT>
OptRemarkEmitterT* llvm::SampleProfileLoaderBaseImpl< FT >::ORE = nullptr
protected

Optimization Remark Emitter used to emit diagnostic remarks.

Definition at line 333 of file SampleProfileLoaderBaseImpl.h.

Referenced by getInstWeightImpl(), and getProbeWeight().

◆ OutlineFunctionSamples

template<typename FT>
std::map<SampleContext, FunctionSamples> llvm::SampleProfileLoaderBaseImpl< FT >::OutlineFunctionSamples
protected

Synthetic samples created by duplicating the samples of inlined functions from the original profile as if they were top level sample profiles.

Use std::map because insertion may happen while its content is referenced.

Definition at line 312 of file SampleProfileLoaderBaseImpl.h.

◆ PDT

template<typename FT>
PostDominatorTreePtrT llvm::SampleProfileLoaderBaseImpl< FT >::PDT
protected

Definition at line 294 of file SampleProfileLoaderBaseImpl.h.

Referenced by clearFunctionData(), and findEquivalenceClasses().

◆ Predecessors

template<typename FT>
BlockEdgeMap llvm::SampleProfileLoaderBaseImpl< FT >::Predecessors
protected

Predecessors for each basic block in the CFG.

Definition at line 298 of file SampleProfileLoaderBaseImpl.h.

Referenced by buildEdges(), clearFunctionData(), and propagateThroughEdges().

◆ ProbeManager

template<typename FT>
std::unique_ptr<PseudoProbeManager> llvm::SampleProfileLoaderBaseImpl< FT >::ProbeManager
protected

Definition at line 315 of file SampleProfileLoaderBaseImpl.h.

◆ PSI

template<typename FT>
ProfileSummaryInfo* llvm::SampleProfileLoaderBaseImpl< FT >::PSI = nullptr
protected

Profile Summary Info computed from sample profile.

Definition at line 330 of file SampleProfileLoaderBaseImpl.h.

Referenced by emitCoverageRemarks().

◆ Reader

template<typename FT>
std::unique_ptr<SampleProfileReader> llvm::SampleProfileLoaderBaseImpl< FT >::Reader
protected

Profile reader object.

Definition at line 307 of file SampleProfileLoaderBaseImpl.h.

Referenced by dump(), and findFunctionSamples().

◆ RemappingFilename

template<typename FT>
std::string llvm::SampleProfileLoaderBaseImpl< FT >::RemappingFilename
protected

Name of the profile remapping file to load.

Definition at line 324 of file SampleProfileLoaderBaseImpl.h.

Referenced by SampleProfileLoaderBaseImpl().

◆ Samples

template<typename FT>
FunctionSamples* llvm::SampleProfileLoaderBaseImpl< FT >::Samples = nullptr
protected

Samples collected for the body of this function.

Definition at line 318 of file SampleProfileLoaderBaseImpl.h.

Referenced by emitCoverageRemarks(), findEquivalencesFor(), findFunctionSamples(), getProbeWeight(), and initWeightPropagation().

◆ Successors

template<typename FT>
BlockEdgeMap llvm::SampleProfileLoaderBaseImpl< FT >::Successors
protected

Successors for each basic block in the CFG.

Definition at line 301 of file SampleProfileLoaderBaseImpl.h.

Referenced by applyProfi(), buildEdges(), clearFunctionData(), propagateThroughEdges(), and propagateWeights().

◆ VisitedBlocks

template<typename FT>
SmallPtrSet<const BasicBlockT *, 32> llvm::SampleProfileLoaderBaseImpl< FT >::VisitedBlocks
protected

Set of visited blocks during propagation.

Definition at line 279 of file SampleProfileLoaderBaseImpl.h.

Referenced by clearFunctionData(), computeBlockWeights(), findEquivalencesFor(), and propagateThroughEdges().

◆ VisitedEdges

template<typename FT>
SmallSet<Edge, 32> llvm::SampleProfileLoaderBaseImpl< FT >::VisitedEdges
protected

Set of visited edges during propagation.

Definition at line 282 of file SampleProfileLoaderBaseImpl.h.

Referenced by clearFunctionData(), propagateThroughEdges(), propagateWeights(), and visitEdge().


The documentation for this class was generated from the following file: