41#define DEBUG_TYPE "static-data-splitter"
43STATISTIC(NumHotJumpTables,
"Number of hot jump tables seen.");
44STATISTIC(NumColdJumpTables,
"Number of cold jump tables seen.");
46 "Number of jump tables with unknown hotness. They are from functions "
47 "without profile information.");
82 : MBFI(MBFI), PSI(PSI), SDPI(SDPI) {}
111 const bool ProfileAvailable = PSI && PSI->hasProfileSummary() && MBFI &&
114 if (!ProfileAvailable) {
115 annotateStaticDataWithoutProfiles(MF);
116 updateStatsWithoutProfiles(MF);
120 bool Changed = partitionStaticDataWithProfiles(MF);
122 updateStatsWithProfiles(MF);
130 if (!
Op.isGlobal() && !
Op.isCPI())
138 !inStaticDataSection(*GV, TM))
142 assert(
Op.isCPI() &&
"Op must be constant pool index in this branch");
143 int CPI =
Op.getIndex();
147 assert(MCP !=
nullptr &&
"Constant pool info is not available.");
148 const MachineConstantPoolEntry &CPE = MCP->
getConstants()[CPI];
156bool StaticDataSplitterImpl::partitionStaticDataWithProfiles(
175 for (
const auto &
MBB : MF) {
176 std::optional<uint64_t>
Count = MBFI->getBlockProfileCount(&
MBB);
177 for (
const MachineInstr &
I :
MBB) {
178 for (
const MachineOperand &
Op :
I.operands()) {
179 if (!
Op.isJTI() && !
Op.isGlobal() && !
Op.isCPI())
183 assert(MJTI !=
nullptr &&
"Jump table info is not available.");
184 const int JTI =
Op.getIndex();
189 auto Hotness = MachineFunctionDataHotness::Hot;
195 Hotness = MachineFunctionDataHotness::Cold;
198 }
else if (
const Constant *
C =
199 getConstant(
Op, MF.getTarget(), MF.getConstantPool())) {
200 SDPI->addConstantProfileCount(
C,
Count);
210StaticDataSplitterImpl::getLocalLinkageGlobalVariable(
const GlobalValue *GV) {
217bool StaticDataSplitterImpl::inStaticDataSection(
const GlobalVariable &GV,
221 return Kind.isData() ||
Kind.isReadOnly() ||
Kind.isReadOnlyWithRel() ||
225void StaticDataSplitterImpl::updateStatsWithProfiles(
232 if (
JumpTable.Hotness == MachineFunctionDataHotness::Hot) {
236 "A jump table is either hot or cold when profile information is "
244void StaticDataSplitterImpl::annotateStaticDataWithoutProfiles(
246 for (
const auto &
MBB : MF)
247 for (
const MachineInstr &
I :
MBB)
248 for (
const MachineOperand &
Op :
I.operands())
249 if (
const Constant *
C =
250 getConstant(
Op, MF.getTarget(), MF.getConstantPool()))
251 SDPI->addConstantProfileCount(
C, std::nullopt);
254void StaticDataSplitterImpl::updateStatsWithoutProfiles(
285 .getStaticDataProfileInfo();
287 return Impl.runOnMachineFunction(MF);
295 auto &ModuleAnalysisManagerProxy =
301 &ModuleAnalysisManagerProxy
304 ->getStaticDataProfileInfo();
306 return Impl.runOnMachineFunction(MF)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static const Function * getParent(const Value *V)
This file declares the MachineConstantPool class which is an abstract constant pool to keep track of ...
#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 defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
bool runOnMachineFunction(MachineFunction &MF)
StaticDataSplitterImpl(MachineBlockFrequencyInfo *MBFI, ProfileSummaryInfo *PSI, StaticDataProfileInfo *SDPI)
StringRef getPassName() const override
getPassName - Return a nice clean name for a pass.
bool runOnMachineFunction(MachineFunction &MF) override
runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
StaticDataSplitterLegacy()
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Represent the analysis usage information of a pass.
AnalysisUsage & addRequired()
void setPreservesAll()
Set by analyses that do not transform their input at all.
Represents analyses that only rely on functions' control flow.
This is an important base class in LLVM.
bool hasProfileData() const
Return true if the function is annotated with profile data.
bool hasLocalLinkage() const
MachineBlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate machine basic b...
union llvm::MachineConstantPoolEntry::@004270020304201266316354007027341142157160323045 Val
The constant itself.
bool isMachineConstantPoolEntry() const
isMachineConstantPoolEntry - Return true if the MachineConstantPoolEntry is indeed a target specific ...
const Constant * ConstVal
The MachineConstantPool class keeps track of constants referenced by a function which must be spilled...
const std::vector< MachineConstantPoolEntry > & getConstants() const
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
MachineFunctionPass(char &ID)
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
Function & getFunction()
Return the LLVM function that this machine code represents.
const MachineJumpTableInfo * getJumpTableInfo() const
getJumpTableInfo - Return the jump table info object for the current function.
LLVM_ABI bool updateJumpTableEntryHotness(size_t JTI, MachineFunctionDataHotness Hotness)
const std::vector< MachineJumpTableEntry > & getJumpTables() const
MachineOperand class - Representation of each machine instruction operand.
AnalysisType & getAnalysis() const
getAnalysis<AnalysisType>() - This function is used by subclasses to get to the analysis information ...
A set of analyses that are preserved following a run of a transformation pass.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
PreservedAnalyses & preserveSet()
Mark an analysis set as preserved.
An analysis pass based on the new PM to deliver ProfileSummaryInfo.
An analysis pass based on legacy pass manager to deliver ProfileSummaryInfo.
Analysis providing profile information.
This wraps the StaticDataProfileInfo object as an immutable pass, for a backend pass to operate on.
A class that holds the constants that represent static data and their profile information and provide...
LLVM_ABI PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)
Represent a constant reference to a string, i.e.
static SectionKind getKindForGlobal(const GlobalObject *GO, const TargetMachine &TM)
Classify the specified global variable into a set of target independent categories embodied in Sectio...
Primary interface to the complete machine description for the target machine.
Pass manager infrastructure for declaring and invalidating analyses.
@ C
The default llvm calling convention, compatible with C.
LLVM_ABI bool IsAnnotationOK(const GlobalVariable &GV)
Returns true if the annotation kind of the global variable GV is AnnotationOK.
This is an optimization pass for GlobalISel generic memory operations.
OuterAnalysisManagerProxy< ModuleAnalysisManager, MachineFunction > ModuleAnalysisManagerMachineFunctionProxy
Provide the ModuleAnalysisManager to Function proxy.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
AnalysisManager< MachineFunction > MachineFunctionAnalysisManager
LLVM_ABI PreservedAnalyses getMachineFunctionPassPreservedAnalyses()
Returns the minimum set of Analyses that all machine function passes must preserve.
LLVM_ABI bool AreStatisticsEnabled()
Check if statistics are enabled.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
DWARFExpression::Operation Op
LLVM_ABI MachineFunctionPass * createStaticDataSplitterLegacyPass()
createStaticDataSplitterPass - This is a machine-function pass that categorizes static data hotness u...