36#define DEBUG_TYPE "static-data-splitter"
38STATISTIC(NumHotJumpTables,
"Number of hot jump tables seen.");
39STATISTIC(NumColdJumpTables,
"Number of cold jump tables seen.");
41 "Number of jump tables with unknown hotness. They are from functions "
42 "without profile information.");
76 MBPI = &getAnalysis<MachineBranchProbabilityInfoWrapperPass>().getMBPI();
77 MBFI = &getAnalysis<MachineBlockFrequencyInfoWrapperPass>().getMBFI();
78 PSI = &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI();
80 return splitJumpTables(MF);
83bool StaticDataSplitter::splitJumpTablesWithProfiles(
85 int NumChangedJumpTables = 0;
92 for (
const auto &
MBB : MF) {
97 const int JTI =
Op.getIndex();
102 auto Hotness = MachineFunctionDataHotness::Hot;
108 Hotness = MachineFunctionDataHotness::Cold;
111 ++NumChangedJumpTables;
115 return NumChangedJumpTables > 0;
129 if (!ProfileAvailable) {
136 if (Hotness == MachineFunctionDataHotness::Hot) {
139 assert(Hotness == MachineFunctionDataHotness::Cold &&
140 "A jump table is either hot or cold when profile information is "
148 if (ProfileAvailable)
149 return splitJumpTablesWithProfiles(MF, *MJTI);
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)
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file defines the make_scope_exit function, which executes user-defined cleanup logic at scope ex...
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
StringRef getPassName() const override
getPassName - Return a nice clean name for a pass.
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
bool runOnMachineFunction(MachineFunction &MF) override
runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...
Represent the analysis usage information of a pass.
AnalysisUsage & addRequired()
This class represents an Operation in the Expression.
bool hasProfileData(bool IncludeSynthetic=false) const
Return true if the function is annotated with profile data.
MachineBlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate machine basic b...
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
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.
Representation of each machine instruction.
bool updateJumpTableEntryHotness(size_t JTI, MachineFunctionDataHotness Hotness)
const std::vector< MachineJumpTableEntry > & getJumpTables() const
MachineOperand class - Representation of each machine instruction operand.
static PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
An analysis pass based on legacy pass manager to deliver ProfileSummaryInfo.
Analysis providing profile information.
bool hasProfileSummary() const
Returns true if profile summary is available.
bool isColdBlock(const BBType *BB, BFIT *BFI) const
Returns true if BasicBlock BB is considered cold.
StringRef - Represent a constant reference to a string, i.e.
This is an optimization pass for GlobalISel generic memory operations.
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
detail::scope_exit< std::decay_t< Callable > > make_scope_exit(Callable &&F)
MachineFunctionPass * createStaticDataSplitterPass()
createStaticDataSplitterPass - This pass partitions a static data section into a hot and cold section...
bool AreStatisticsEnabled()
Check if statistics are enabled.
void initializeStaticDataSplitterPass(PassRegistry &)