14#ifndef LLVM_ANALYSIS_PROFILESUMMARYINFO_H
15#define LLVM_ANALYSIS_PROFILESUMMARYINFO_H
45 std::unique_ptr<ProfileSummary> Summary;
46 void computeThresholds();
48 std::optional<uint64_t> HotCountThreshold, ColdCountThreshold;
52 std::optional<bool> HasHugeWorkingSetSize;
56 std::optional<bool> HasLargeWorkingSetSize;
105 bool AllowSynthetic =
false)
const;
118 std::optional<Function::ProfileCount> FunctionCount = getEntryCount(
F);
122 return FunctionCount &&
isHotCount(FunctionCount->getCount());
126 template <
typename FuncT,
typename BFIT>
130 if (
auto FunctionCount = getEntryCount(
F))
134 if (
auto TotalCallCount = getTotalCallCount(
F))
138 for (
const auto &BB : *
F)
146 template <
typename FuncT,
typename BFIT>
150 if (
auto FunctionCount = getEntryCount(
F))
154 if (
auto TotalCallCount = getTotalCallCount(
F))
158 for (
const auto &BB : *
F)
167 template <
typename FuncT,
typename BFIT>
169 const FuncT *
F, BFIT &BFI)
const {
170 return isFunctionHotOrColdInCallGraphNthPercentile<true, FuncT, BFIT>(
175 template <
typename FuncT,
typename BFIT>
177 const FuncT *
F, BFIT &BFI)
const {
178 return isFunctionHotOrColdInCallGraphNthPercentile<false, FuncT, BFIT>(
197 template <
typename BBType,
typename BFIT>
199 auto Count = BFI->getBlockProfileCount(BB);
204 template <
typename BBType,
typename BFIT>
206 auto Count = BFI->getBlockProfileCount(BB);
210 template <
typename BFIT>
212 auto Count = BFI->getProfileCountFromFreq(BlockFreq);
216 template <
typename BBType,
typename BFIT>
223 template <
typename BFIT>
234 template <
typename BBType,
typename BFIT>
240 template <
typename BFIT>
258 return HotCountThreshold.value_or(0);
262 return ColdCountThreshold.value_or(0);
266 template <
typename FuncT>
267 std::optional<uint64_t> getTotalCallCount(
const FuncT *
F)
const {
271 template <
bool isHot,
typename FuncT,
typename BFIT>
277 if (
auto FunctionCount = getEntryCount(
F)) {
282 FunctionCount->getCount()))
285 if (
auto TotalCallCount = getTotalCallCount(
F)) {
292 for (
const auto &BB : *
F) {
301 template <
bool isHot>
304 template <
bool isHot,
typename BBType,
typename BFIT>
307 auto Count =
BFI->getBlockProfileCount(BB);
314 template <
bool isHot,
typename BFIT>
316 BlockFrequency BlockFreq,
318 auto Count =
BFI->getProfileCountFromFreq(BlockFreq);
325 template <
typename FuncT>
326 std::optional<Function::ProfileCount> getEntryCount(
const FuncT *
F)
const {
327 return F->getEntryCount();
332inline std::optional<uint64_t>
333ProfileSummaryInfo::getTotalCallCount<Function>(
const Function *
F)
const {
337 for (
const auto &BB : *
F)
338 for (
const auto &
I : BB)
339 if (isa<CallInst>(
I) || isa<InvokeInst>(
I))
341 TotalCallCount += *CallCount;
342 return TotalCallCount;
349std::optional<Function::ProfileCount>
350ProfileSummaryInfo::getEntryCount<MachineFunction>(
351 const MachineFunction *
F)
const;
355 std::unique_ptr<ProfileSummaryInfo> PSI;
This file defines the DenseMap class.
static cl::opt< unsigned > PercentileCutoff("mfs-psi-cutoff", cl::desc("Percentile profile summary cutoff used to " "determine cold blocks. Unused if set to zero."), cl::init(999950), cl::Hidden)
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.
void setPreservesAll()
Set by analyses that do not transform their input at all.
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
This class represents a function call, abstracting a target machine's calling convention.
ImmutablePass class - This class is used to provide information that does not need to be run.
A Module instance is used to store all the information related to an LLVM module.
A set of analyses that are preserved following a run of a transformation pass.
An analysis pass based on the new PM to deliver ProfileSummaryInfo.
ProfileSummaryInfo Result
Result run(Module &M, ModuleAnalysisManager &)
An analysis pass based on legacy pass manager to deliver ProfileSummaryInfo.
bool doFinalization(Module &M) override
doFinalization - Virtual method overriden by subclasses to do any necessary clean up after all passes...
ProfileSummaryInfoWrapperPass()
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
ProfileSummaryInfo & getPSI()
bool doInitialization(Module &M) override
doInitialization - Virtual method overridden by subclasses to do any necessary initialization before ...
const ProfileSummaryInfo & getPSI() const
Analysis providing profile information.
bool hasCSInstrumentationProfile() const
Returns true if module M has context sensitive instrumentation profile.
uint64_t getOrCompColdCountThreshold() const
Returns ColdCountThreshold if set.
bool hasProfileSummary() const
Returns true if profile summary is available.
bool isHotBlockNthPercentile(int PercentileCutoff, const BBType *BB, BFIT *BFI) const
bool isFunctionColdInCallGraph(const FuncT *F, BFIT &BFI) const
Returns true if F contains only cold code.
bool isFunctionHotnessUnknown(const Function &F) const
Returns true if the hotness of F is unknown.
bool hasInstrumentationProfile() const
Returns true if module M has instrumentation profile.
void refresh()
If no summary is present, attempt to refresh.
std::optional< uint64_t > getProfileCount(const CallBase &CallInst, BlockFrequencyInfo *BFI, bool AllowSynthetic=false) const
Returns the profile count for CallInst.
bool isFunctionColdInCallGraphNthPercentile(int PercentileCutoff, const FuncT *F, BFIT &BFI) const
Returns true if F contains cold code with regard to a given cold percentile cutoff value.
bool hasSampleProfile() const
Returns true if module M has sample profile.
bool isFunctionEntryHot(const FuncT *F) const
Returns true if F has hot function entry.
bool isColdBlock(const BBType *BB, BFIT *BFI) const
Returns true if BasicBlock BB is considered cold.
bool isColdCount(uint64_t C) const
Returns true if count C is considered cold.
bool isFunctionHotInCallGraphNthPercentile(int PercentileCutoff, const FuncT *F, BFIT &BFI) const
Returns true if F contains hot code with regard to a given hot percentile cutoff value.
bool isColdCountNthPercentile(int PercentileCutoff, uint64_t C) const
Returns true if count C is considered cold with regard to a given cold percentile cutoff value.
bool isHotCountNthPercentile(int PercentileCutoff, uint64_t C) const
Returns true if count C is considered hot with regard to a given hot percentile cutoff value.
uint64_t getColdCountThreshold() const
Returns ColdCountThreshold if set.
bool isFunctionHotInCallGraph(const FuncT *F, BFIT &BFI) const
Returns true if F contains hot code.
bool isColdBlock(BlockFrequency BlockFreq, const BFIT *BFI) const
bool hasPartialSampleProfile() const
Returns true if module M has partial-profile sample profile.
bool hasLargeWorkingSetSize() const
Returns true if the working set size of the code is considered large.
bool isColdCallSite(const CallBase &CB, BlockFrequencyInfo *BFI) const
Returns true if call site CB is considered cold.
ProfileSummaryInfo(ProfileSummaryInfo &&Arg)=default
bool isHotCallSite(const CallBase &CB, BlockFrequencyInfo *BFI) const
Returns true if the call site CB is considered hot.
ProfileSummaryInfo(const Module &M)
uint64_t getHotCountThreshold() const
Returns HotCountThreshold if set.
bool isHotBlock(const BBType *BB, BFIT *BFI) const
Returns true if BasicBlock BB is considered hot.
bool isColdBlockNthPercentile(int PercentileCutoff, BlockFrequency BlockFreq, BFIT *BFI) const
bool isHotCount(uint64_t C) const
Returns true if count C is considered hot.
bool hasHugeWorkingSetSize() const
Returns true if the working set size of the code is considered huge.
bool isColdBlockNthPercentile(int PercentileCutoff, const BBType *BB, BFIT *BFI) const
Returns true if BasicBlock BB is considered cold with regard to a given cold percentile cutoff value.
uint64_t getOrCompHotCountThreshold() const
Returns HotCountThreshold if set.
bool isHotBlockNthPercentile(int PercentileCutoff, BlockFrequency BlockFreq, BFIT *BFI) const
bool invalidate(Module &, const PreservedAnalyses &, ModuleAnalysisManager::Invalidator &)
Handle the invalidation of this information.
bool isFunctionEntryCold(const Function *F) const
Returns true if F has cold function entry.
Printer pass that uses ProfileSummaryAnalysis.
ProfileSummaryPrinterPass(raw_ostream &OS)
PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM)
This class implements an extremely fast bulk output stream that can only output to a stream.
@ C
The default llvm calling convention, compatible with C.
@ BasicBlock
Various leaf nodes.
This is an optimization pass for GlobalISel generic memory operations.
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.