55 cl::desc(
"Percentile profile summary cutoff used to "
56 "determine cold blocks. Unused if set to zero."),
60 "mfs-count-threshold",
62 "Minimum number of times a block must be executed to be retained."),
67 cl::desc(
"Splits all EH code and it's descendants by default."),
79 StringRef getPassName()
const override {
80 return "Machine Function Splitter Transformation";
83 void getAnalysisUsage(AnalysisUsage &AU)
const override;
85 bool runOnMachineFunction(MachineFunction &
F)
override;
95 for (
auto Block : EHBlocks) {
102 return X.getSectionID().Type <
Y.getSectionID().Type;
131bool MachineFunctionSplitter::runOnMachineFunction(
MachineFunction &MF) {
143 if (!
TII.isFunctionSafeToSplit(MF))
148 auto BBSectionsProfile =
149 getAnalysisIfAvailable<BasicBlockSectionsProfileReaderWrapperPass>();
150 if (BBSectionsProfile !=
nullptr &&
151 BBSectionsProfile->getBBSPR().isFunctionHot(MF.
getName()))
161 MachineBlockFrequencyInfo *MBFI =
nullptr;
162 ProfileSummaryInfo *PSI =
nullptr;
163 if (UseProfileData) {
164 MBFI = &getAnalysis<MachineBlockFrequencyInfoWrapperPass>().getMBFI();
165 PSI = &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI();
180 for (
auto &
MBB : MF) {
197 bool HasHotLandingPads =
false;
198 for (
const MachineBasicBlock *LP : LandingPads) {
199 if (!
isColdBlock(*LP, MBFI, PSI) || !
TII.isMBBSafeToSplitToCold(*LP))
200 HasHotLandingPads =
true;
202 if (!HasHotLandingPads) {
203 for (MachineBasicBlock *LP : LandingPads)
212void MachineFunctionSplitter::getAnalysisUsage(AnalysisUsage &AU)
const {
214 AU.
addRequired<MachineBlockFrequencyInfoWrapperPass>();
219char MachineFunctionSplitter::ID = 0;
221 "Split machine functions using profile information",
false,
225 return new MachineFunctionSplitter();
const HexagonInstrInfo * TII
static bool isColdBlock(const MachineBasicBlock &MBB, const MachineBlockFrequencyInfo *MBFI, ProfileSummaryInfo *PSI)
static void finishAdjustingBasicBlocksAndLandingPads(MachineFunction &MF)
static cl::opt< unsigned > ColdCountThreshold("mfs-count-threshold", cl::desc("Minimum number of times a block must be executed to be retained."), cl::init(1), cl::Hidden)
static void setDescendantEHBlocksCold(MachineFunction &MF)
setDescendantEHBlocksCold - This splits all EH pads and blocks reachable only by EH pad as cold.
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)
static cl::opt< bool > SplitAllEHCode("mfs-split-ehcode", cl::desc("Splits all EH code and it's descendants by default."), cl::init(false), cl::Hidden)
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
This file defines the SmallVector class.
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
AnalysisUsage & addUsedIfAvailable()
Add the specified Pass class to the set of analyses used by this pass.
AnalysisUsage & addRequired()
Implements a dense probed hash-table based set.
bool hasProfileData(bool IncludeSynthetic=false) const
Return true if the function is annotated with profile data.
bool isEHPad() const
Returns true if the block is a landing pad.
LLVM_ABI bool isEntryBlock() const
Returns true if this is the entry block of the function.
void setSectionID(MBBSectionID V)
Sets the section ID for this basic block.
MachineBlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate machine basic b...
LLVM_ABI std::optional< uint64_t > getBlockProfileCount(const MachineBasicBlock *MBB) const
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
void setBBSectionsType(BasicBlockSection V)
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
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.
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
static LLVM_ABI PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
Analysis providing profile information.
bool hasCSInstrumentationProfile() const
Returns true if module M has context sensitive instrumentation profile.
bool hasInstrumentationProfile() const
Returns true if module M has instrumentation profile.
bool hasSampleProfile() const
Returns true if module M has sample profile.
LLVM_ABI 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 isFunctionHotInCallGraph(const FuncT *F, BFIT &BFI) const
Returns true if F contains hot code.
void push_back(const T &Elt)
llvm::BasicBlockSection getBBSectionsType() const
If basic blocks should be emitted into their own section, corresponding to -fbasic-block-sections.
virtual const TargetInstrInfo * getInstrInfo() const
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI MachineFunctionPass * createMachineFunctionSplitterPass()
createMachineFunctionSplitterPass - This pass splits machine functions using profile information.
LLVM_ABI void initializeMachineFunctionSplitterPass(PassRegistry &)
FunctionAddr VTableAddr Count
static void computeEHOnlyBlocks(FunctionT &F, DenseSet< BlockT * > &EHBlocks)
Compute a list of blocks that are only reachable via EH paths.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
void avoidZeroOffsetLandingPad(MachineFunction &MF)
void sortBasicBlocksAndUpdateBranches(MachineFunction &MF, MachineBasicBlockComparator MBBCmp)
LLVM_ABI static const MBBSectionID ColdSectionID