42#define DEBUG_TYPE "fs-profile-loader"
46 cl::desc(
"Print setting flow sensitive branch probabilities"));
48 "fs-profile-debug-prob-diff-threshold",
cl::init(10),
50 "Only show debug message if the branch probability is greater than "
51 "this value (in percentage)."));
54 "fs-profile-debug-bw-threshold",
cl::init(10000),
55 cl::desc(
"Only show debug message if the source branch weight is greater "
56 " than this value."));
60 cl::desc(
"View BFI before MIR loader"));
63 cl::desc(
"View BFI after MIR loader"));
68 "Load MIR Sample Profile",
99 if (
MI.isPseudoProbe()) {
101 Probe.
Id =
MI.getOperand(1).getImm();
102 Probe.
Type =
MI.getOperand(2).getImm();
103 Probe.
Attr =
MI.getOperand(3).getImm();
194 return std::error_code();
204 LLVM_DEBUG(
dbgs() <<
"\nPropagation complete. Setting branch probs\n");
213 Edge E = std::make_pair(BB, Succ);
217 if (BBWeight != SumEdgeWeight) {
218 LLVM_DEBUG(
dbgs() <<
"BBweight is not equal to SumEdgeWeight: BBWWeight="
219 << BBWeight <<
" SumEdgeWeight= " << SumEdgeWeight
221 BBWeight = SumEdgeWeight;
231 uint32_t MaxWeight = std::numeric_limits<uint32_t>::max();
233 if (BBWeight > MaxWeight) {
234 Factor = BBWeight / MaxWeight + 1;
243 Edge E = std::make_pair(BB, Succ);
245 EdgeWeight /= Factor;
247 assert(BBWeight >= EdgeWeight &&
248 "BBweight is larger than EdgeWeight -- should not happen.\n");
252 if (OldProb == NewProb)
260 if (OldProb > NewProb)
261 Diff = OldProb - NewProb;
263 Diff = NewProb - OldProb;
270 dbgs() <<
"Set branch fs prob: MBB (" << BB->
getNumber() <<
" -> "
273 dbgs() << DIL->getFilename() <<
":" << DIL->getLine() <<
":"
276 dbgs() <<
"-->" << SuccDIL->getFilename() <<
":" << SuccDIL->getLine()
277 <<
":" << SuccDIL->getColumn();
278 dbgs() <<
" W=" << BBWeightOrig <<
" " << OldProb <<
" --> " << NewProb
287 auto &Ctx = M.getContext();
291 if (std::error_code EC = ReaderOrErr.getError()) {
292 std::string Msg =
"Could not open profile: " + EC.message();
297 Reader = std::move(ReaderOrErr.get());
302 if (
Reader->profileIsProbeBased()) {
319 if (!
Reader->profileIsFS())
355 MIRSampleLoader = std::make_unique<MIRProfileLoader>(
356 FileName, RemappingFileName, std::move(VFS));
357 assert(LowBit < HighBit &&
"HighBit needs to be greater than Lowbit");
361 if (!MIRSampleLoader->isValid())
373 MIRSampleLoader->setInitVals(
380 MBFI->
view(
"MIR_Prof_loader_b." + MF.
getName(),
false);
383 bool Changed = MIRSampleLoader->runOnFunction(MF);
391 MBFI->
view(
"MIR_prof_loader_a." + MF.
getName(),
false);
397bool MIRProfileLoaderPass::doInitialization(
Module &M) {
398 LLVM_DEBUG(
dbgs() <<
"MIRProfileLoader pass working on Module " <<
M.getName()
401 MIRSampleLoader->setFSPass(P);
402 return MIRSampleLoader->doInitialization(M);
405void MIRProfileLoaderPass::getAnalysisUsage(
AnalysisUsage &AU)
const {
407 AU.
addRequired<MachineBlockFrequencyInfoWrapperPass>();
409 AU.
addRequired<MachinePostDominatorTreeWrapperPass>();
411 AU.
addRequired<MachineOptimizationRemarkEmitterPass>();
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file defines the DenseMap class.
This file defines the DenseSet and SmallDenseSet classes.
static cl::opt< bool > ShowFSBranchProb("show-fs-branchprob", cl::Hidden, cl::init(false), cl::desc("Print setting flow sensitive branch probabilities"))
static cl::opt< bool > ViewBFIAfter("fs-viewbfi-after", cl::Hidden, cl::init(false), cl::desc("View BFI after MIR loader"))
static cl::opt< unsigned > FSProfileDebugBWThreshold("fs-profile-debug-bw-threshold", cl::init(10000), cl::desc("Only show debug message if the source branch weight is greater " " than this value."))
static cl::opt< unsigned > FSProfileDebugProbDiffThreshold("fs-profile-debug-prob-diff-threshold", cl::init(10), cl::desc("Only show debug message if the branch probability is greater than " "this value (in percentage)."))
static cl::opt< bool > ViewBFIBefore("fs-viewbfi-before", cl::Hidden, cl::init(false), cl::desc("View BFI before MIR loader"))
#define INITIALIZE_PASS_DEPENDENCY(depName)
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
This file provides the interface for the sampled PGO profile loader base implementation.
This file provides the utility functions for the sampled PGO loader base implementation.
Defines the virtual file system interface vfs::FileSystem.
Represent the analysis usage information of a pass.
AnalysisUsage & addRequired()
void setPreservesAll()
Set by analyses that do not transform their input at all.
AnalysisUsage & addRequiredTransitive()
Implements a dense probed hash-table based set.
Diagnostic information for the sample profiler.
Represents either an error or a value T.
FunctionPass class - This class is used to implement most global optimizations.
A smart pointer to a reference-counted object that inherits from RefCountedBase or ThreadSafeRefCount...
MIRProfileLoaderPass(std::string FileName="", std::string RemappingFileName="", FSDiscriminatorPass P=FSDiscriminatorPass::Pass1, IntrusiveRefCntPtr< vfs::FileSystem > FS=nullptr)
FS bits will only use the '1' bits in the Mask.
MIRProfileLoader(StringRef Name, StringRef RemapName, IntrusiveRefCntPtr< vfs::FileSystem > FS)
void setBranchProbs(MachineFunction &F)
ErrorOr< uint64_t > getInstWeight(const MachineInstr &MI) override
bool runOnFunction(MachineFunction &F)
MachineBlockFrequencyInfo * BFI
Hold the information of the basic block frequency.
FSDiscriminatorPass P
PassNum is the sequence number this pass is called, start from 1.
bool doInitialization(Module &M)
friend class SampleCoverageTracker
void setInitVals(MachineDominatorTree *MDT, MachinePostDominatorTree *MPDT, MachineLoopInfo *MLI, MachineBlockFrequencyInfo *MBFI, MachineOptimizationRemarkEmitter *MORE)
void setFSPass(FSDiscriminatorPass Pass)
LLVM_ABI BranchProbability getSuccProbability(const_succ_iterator Succ) const
Return probability of the edge from this block to MBB.
int getNumber() const
MachineBasicBlocks are uniquely numbered at the function level, unless they're not in a MachineFuncti...
LLVM_ABI void setSuccProbability(succ_iterator I, BranchProbability Prob)
Set successor probability of a given iterator.
succ_iterator succ_begin()
unsigned succ_size() const
SmallVectorImpl< MachineBasicBlock * >::iterator succ_iterator
LLVM_ABI DebugLoc findBranchDebugLoc()
Find and return the merged DebugLoc of the branch instructions of the block.
iterator_range< succ_iterator > successors()
iterator_range< pred_iterator > predecessors()
MachineBlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate machine basic b...
LLVM_ABI void view(const Twine &Name, bool isSimple=true) const
Pop up a ghostview window with the current block frequency propagation rendered using dot.
LLVM_ABI const MachineBranchProbabilityInfo * getMBPI() const
LLVM_ABI void calculate(const MachineFunction &F, const MachineBranchProbabilityInfo &MBPI, const MachineLoopInfo &MLI)
calculate - compute block frequency info for the given function.
Analysis pass which computes a MachineDominatorTree.
DominatorTree Class - Concrete subclass of DominatorTreeBase that is used to compute a normal dominat...
MachineFunctionPass(char &ID)
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
Function & getFunction()
Return the LLVM function that this machine code represents.
void RenumberBlocks(MachineBasicBlock *MBBFrom=nullptr)
RenumberBlocks - This discards all of the MachineBasicBlock numbers and recomputes them.
Representation of each machine instruction.
MachinePostDominatorTree - an analysis pass wrapper for DominatorTree used to compute the post-domina...
A Module instance is used to store all the information related to an LLVM module.
Pass interface - Implemented by all 'passes'.
AnalysisType & getAnalysis() const
getAnalysis<AnalysisType>() - This function is used by subclasses to get to the analysis information ...
bool computeAndPropagateWeights(FunctionT &F, const DenseSet< GlobalValue::GUID > &InlinedGUIDs)
void computeDominanceAndLoopInfo(FunctionT &F)
IntrusiveRefCntPtr< vfs::FileSystem > FS
EdgeWeightMap EdgeWeights
unsigned getFunctionLoc(FunctionT &Func)
ErrorOr< uint64_t > getInstWeightImpl(const InstructionT &Inst)
EquivalenceClassMap EquivalenceClass
std::unique_ptr< SampleProfileReader > Reader
SampleProfileLoaderBaseImpl(std::string Name, std::string RemapName, IntrusiveRefCntPtr< vfs::FileSystem > FS)
std::unique_ptr< PseudoProbeManager > ProbeManager
PostDominatorTreePtrT PDT
virtual ErrorOr< uint64_t > getProbeWeight(const InstructionT &Inst)
std::string RemappingFilename
FunctionSamples * Samples
std::pair< const BasicBlockT *, const BasicBlockT * > Edge
void clearFunctionData(bool ResetDT=true)
BlockWeightMap BlockWeights
Represent a constant reference to a string, i.e.
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
A range adaptor for a pair of iterators.
static LLVM_ABI bool ProfileIsProbeBased
static LLVM_ABI ErrorOr< std::unique_ptr< SampleProfileReader > > create(StringRef Filename, LLVMContext &C, vfs::FileSystem &FS, FSDiscriminatorPass P=FSDiscriminatorPass::Base, StringRef RemapFilename="")
Create a sample profile reader appropriate to the file format.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
initializer< Ty > init(const Ty &Val)
LLVM_ABI IntrusiveRefCntPtr< FileSystem > getRealFileSystem()
Gets an vfs::FileSystem for the 'real' file system, as seen by the operating system.
This is an optimization pass for GlobalISel generic memory operations.
static unsigned getFSPassBitBegin(sampleprof::FSDiscriminatorPass P)
LLVM_ABI cl::opt< bool > ImprovedFSDiscriminator
LLVM_ABI char & MIRProfileLoaderPassID
This pass reads flow sensitive profile.
static unsigned getFSPassBitEnd(sampleprof::FSDiscriminatorPass P)
cl::opt< std::string > ViewBlockFreqFuncName("view-bfi-func-name", cl::Hidden, cl::desc("The option to specify " "the name of the function " "whose CFG will be displayed."))
LLVM_ABI std::optional< PseudoProbe > extractProbe(const Instruction &Inst)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
cl::opt< GVDAGType > ViewBlockLayoutWithBFI("view-block-layout-with-bfi", cl::Hidden, cl::desc("Pop up a window to show a dag displaying MBP layout and associated " "block frequencies of the CFG."), cl::values(clEnumValN(GVDT_None, "none", "do not display graphs."), clEnumValN(GVDT_Fraction, "fraction", "display a graph using the " "fractional block frequency representation."), clEnumValN(GVDT_Integer, "integer", "display a graph using the raw " "integer fractional block frequency representation."), clEnumValN(GVDT_Count, "count", "display a graph using the real " "profile count if available.")))
LLVM_ABI FunctionPass * createMIRProfileLoaderPass(std::string File, std::string RemappingFile, sampleprof::FSDiscriminatorPass P, IntrusiveRefCntPtr< vfs::FileSystem > FS)
Read Flow Sensitive Profile.
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.
MachinePostDominatorTree * PostDominatorTreePtrT
MachineOptimizationRemarkEmitter OptRemarkEmitterT
static PredRangeT getPredecessors(MachineBasicBlock *BB)
MachineFunction FunctionT
MachineOptimizationRemarkAnalysis OptRemarkAnalysisT
MachineInstr InstructionT
MachineDominatorTree * DominatorTreePtrT
iterator_range< SmallVectorImpl< MachineBasicBlock * >::iterator > SuccRangeT
static SuccRangeT getSuccessors(MachineBasicBlock *BB)
MachineBlockFrequencyInfo BlockFrequencyInfoT
static const MachineBasicBlock * getEntryBB(const MachineFunction *F)
MachineLoopInfo * LoopInfoPtrT
iterator_range< SmallVectorImpl< MachineBasicBlock * >::iterator > PredRangeT
MachineBasicBlock BasicBlockT
MachinePostDominatorTree PostDominatorTreeT
static Function & getFunction(MachineFunction &F)