1//===- SampleProfileLoaderBaseUtil.cpp - Profile loader Util func ---------===// 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 7//===----------------------------------------------------------------------===// 9// This file implements the SampleProfileLoader base utility functions. 11//===----------------------------------------------------------------------===// 22"sample-profile-max-propagate-iterations",
cl::init(100),
23cl::desc(
"Maximum number of iterations to go through when propagating " 24"sample block/edge weights through the CFG."));
28cl::desc(
"Emit a warning if less than N% of records in the input profile " 29"are matched to the IR."));
33cl::desc(
"Emit a warning if less than N% of samples in the input profile " 34"are matched to the IR."));
38cl::desc(
"Use this option to turn off/on warnings about function with " 39"samples but without debug information to use those samples. "));
43cl::desc(
"Use profi to infer block and edge counts."));
45namespacesampleprofutil {
47/// Return true if the given callsite is hot wrt to hot cutoff threshold. 49/// Functions that were inlined in the original binary will be represented 50/// in the inline stack in the sample profile. If the profile shows that 51/// the original inline decision was "good" (i.e., the callsite is executed 52/// frequently), then we will recreate the inline decision and apply the 53/// profile from the inlined callsite. 55/// To decide whether an inlined callsite is hot, we compare the callsite 56/// sample count with the hot cutoff computed by ProfileSummaryInfo, it is 57/// regarded as hot if the count is above the cutoff value. 59/// When ProfileAccurateForSymsInList is enabled and profile symbol list 60/// is present, functions in the profile symbol list but without profile will 61/// be regarded as cold and much less inlining will happen in CGSCC inlining 62/// pass, so we tend to lower the hot criteria here to allow more early 63/// inlining to happen for warm callsites and it is helpful for performance. 65bool ProfAccForSymsInList) {
67returnfalse;
// The callsite was not inlined in the original binary. 69assert(PSI &&
"PSI is expected to be non null");
71if (ProfAccForSymsInList)
77/// Mark as used the sample record for the given function samples at 78/// (LineOffset, Discriminator). 80/// \returns true if this is the first time we mark the given record. 86unsigned &Count = SampleCoverage[FS][Loc];
87bool FirstTime = (++Count == 1);
89 TotalUsedSamples += Samples;
93/// Return the number of sample records that were applied from this profile. 95/// This count does not include records from cold inlined callsites. 99autoI = SampleCoverage.
find(FS);
101// The size of the coverage map for FS represents the number of records 102// that were marked used at least once. 103unsigned Count = (
I != SampleCoverage.
end()) ?
I->second.size() : 0;
105// If there are inlined callsites in this function, count the samples found 106// in the respective bodies. However, do not bother counting callees with 0 107// total samples, these are callees that were never invoked at runtime. 108for (
constauto &
I : FS->getCallsiteSamples())
109for (
constauto &J :
I.second) {
118/// Return the number of sample records in the body of this profile. 120/// This count does not include records from cold inlined callsites. 124unsigned Count = FS->getBodySamples().size();
126// Only count records in hot callsites. 127for (
constauto &
I : FS->getCallsiteSamples())
128for (
constauto &J :
I.second) {
137/// Return the number of samples collected in the body of this profile. 139/// This count does not include samples from cold inlined callsites. 144for (
constauto &
I : FS->getBodySamples())
145Total +=
I.second.getSamples();
147// Only count samples in hot callsites. 148for (
constauto &
I : FS->getCallsiteSamples())
149for (
constauto &J :
I.second) {
158/// Return the fraction of sample records used in this profile. 160/// The returned value is an unsigned integer in the range 0-100 indicating 161/// the percentage of sample records that were used while applying this 162/// profile to the associated function. 166"number of used records cannot exceed the total number of records");
170/// Create a global variable to flag FSDiscriminators are used. 172constchar *FSDiscriminatorVar =
"__llvm_fs_discriminator__";
173if (M->getGlobalVariable(FSDiscriminatorVar))
176auto &Context = M->getContext();
177// Place this variable to llvm.used so it won't be GC'ed. 181 FSDiscriminatorVar)});
184}
// end of namespace sampleprofutil 185}
// end of namespace llvm This file contains the declarations for the subclasses of Constant, which represent the different fla...
Module.h This file contains the declarations for the Module class.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file provides the utility functions for the sampled PGO loader base implementation.
static ConstantInt * getTrue(LLVMContext &Context)
iterator find(const_arg_type_t< KeyT > Val)
@ WeakODRLinkage
Same, but only replaced by something equivalent.
A Module instance is used to store all the information related to an LLVM module.
Analysis providing profile information.
bool isColdCount(uint64_t C) const
Returns true if count C is considered cold.
bool isHotCount(uint64_t C) const
Returns true if count C is considered hot.
static IntegerType * getInt1Ty(LLVMContext &C)
Representation of the samples collected for a function.
uint64_t getTotalSamples() const
Return the total number of samples collected inside the function.
unsigned countBodyRecords(const FunctionSamples *FS, ProfileSummaryInfo *PSI) const
Return the number of sample records in the body of this profile.
unsigned countUsedRecords(const FunctionSamples *FS, ProfileSummaryInfo *PSI) const
Return the number of sample records that were applied from this profile.
unsigned computeCoverage(unsigned Used, unsigned Total) const
Return the fraction of sample records used in this profile.
uint64_t countBodySamples(const FunctionSamples *FS, ProfileSummaryInfo *PSI) const
Return the number of samples collected in the body of this profile.
bool markSamplesUsed(const FunctionSamples *FS, uint32_t LineOffset, uint32_t Discriminator, uint64_t Samples)
Mark as used the sample record for the given function samples at (LineOffset, Discriminator).
initializer< Ty > init(const Ty &Val)
void createFSDiscriminatorVariable(Module *M)
Create a global variable to flag FSDiscriminators are used.
bool callsiteIsHot(const FunctionSamples *CallsiteFS, ProfileSummaryInfo *PSI, bool ProfAccForSymsInList)
Return true if the given callsite is hot wrt to hot cutoff threshold.
This is an optimization pass for GlobalISel generic memory operations.
cl::opt< unsigned > SampleProfileSampleCoverage
cl::opt< unsigned > SampleProfileRecordCoverage
cl::opt< unsigned > SampleProfileMaxPropagateIterations
cl::opt< bool > SampleProfileUseProfi
cl::opt< bool > NoWarnSampleUnused
void appendToUsed(Module &M, ArrayRef< GlobalValue * > Values)
Adds global values to the llvm.used list.
Represents the relative location of an instruction.