93 "bbsections-cold-text-prefix",
94 cl::desc(
"The text prefix to use for cold basic block clusters"),
98 "bbsections-detect-source-drift",
99 cl::desc(
"This checks if there is a fdo instr. profile hash "
100 "mismatch for this function"),
115 StringRef getPassName()
const override {
116 return "Basic Block Sections Analysis";
119 void getAnalysisUsage(AnalysisUsage &AU)
const override;
123 bool runOnMachineFunction(MachineFunction &MF)
override;
126 bool handleBBSections(MachineFunction &MF);
127 bool handleBBAddrMap(MachineFunction &MF);
132char BasicBlockSections::ID = 0;
134 BasicBlockSections,
"bbsections-prepare",
135 "Prepares for basic block sections, by splitting functions "
136 "into clusters of basic blocks.",
140 "Prepares for basic block sections, by splitting functions "
141 "into clusters of basic blocks.",
151 for (
auto &
MBB : MF) {
152 auto NextMBBI = std::next(
MBB.getIterator());
153 auto *FTMBB = PreLayoutFallThroughs[
MBB.getNumber()];
160 if (FTMBB && (
MBB.isEndSection() || &*NextMBBI != FTMBB))
161 TII->insertUnconditionalBranch(
MBB, FTMBB,
MBB.findBranchDebugLoc());
165 if (
MBB.isEndSection())
174 MBB.updateTerminator(FTMBB);
195 std::optional<MBBSectionID> EHPadsSectionID;
197 for (
auto &
MBB : MF) {
203 FuncClusterInfo.
empty()) {
208 MBB.setSectionID(
MBB.getNumber());
210 auto I = FuncClusterInfo.
find(*
MBB.getBBID());
211 if (
I != FuncClusterInfo.
end()) {
212 MBB.setSectionID(
I->second.ClusterID);
215 *
MBB.getParent()->getSubtarget().getInstrInfo();
217 if (
TII.isMBBSafeToSplitToCold(
MBB)) {
225 if (
MBB.isEHPad() && EHPadsSectionID !=
MBB.getSectionID() &&
231 :
MBB.getSectionID();
240 MBB.setSectionID(*EHPadsSectionID);
248 PreLayoutFallThroughs[
MBB.getNumber()] =
249 MBB.getFallThrough(
false);
253 "Entry block should not be displaced by basic block sections");
269 for (
auto &
MBB : MF) {
270 if (
MBB.isBeginSection() &&
MBB.isEHPad()) {
272 while (!
MI->isEHLabel())
283 const char MetadataName[] =
"instr_prof_hash_mismatch";
287 for (
const auto &
N : Tuple->operands())
288 if (
N.equalsStr(MetadataName))
318 getAnalysis<BasicBlockSectionsProfileReaderWrapperPass>()
319 .getClusterInfoForFunction(MF.
getName());
330 const MachineBasicBlock &EntryBB = MF.
front();
339 auto MBBSectionOrder = [EntryBBSectionID](
const MBBSectionID &
LHS,
340 const MBBSectionID &
RHS) {
343 if (
LHS == EntryBBSectionID ||
RHS == EntryBBSectionID)
344 return LHS == EntryBBSectionID;
354 auto Comparator = [&](
const MachineBasicBlock &
X,
355 const MachineBasicBlock &
Y) {
356 auto XSectionID =
X.getSectionID();
357 auto YSectionID =
Y.getSectionID();
358 if (XSectionID != YSectionID)
359 return MBBSectionOrder(XSectionID, YSectionID);
361 if (&
X == &EntryBB || &
Y == &EntryBB)
362 return &
X == &EntryBB;
365 if (XSectionID.Type == MBBSectionID::SectionType::Default)
366 return FuncClusterInfo.
lookup(*
X.getBBID()).PositionInCluster <
367 FuncClusterInfo.
lookup(*
Y.getBBID()).PositionInCluster;
368 return X.getNumber() <
Y.getNumber();
380bool BasicBlockSections::handleBBAddrMap(MachineFunction &MF) {
387bool BasicBlockSections::runOnMachineFunction(MachineFunction &MF) {
389 auto R1 = handleBBSections(MF);
391 auto R2 = handleBBAddrMap(MF);
394 if (
auto *WP = getAnalysisIfAvailable<MachineDominatorTreeWrapperPass>())
395 WP->getDomTree().updateBlockNumbers();
396 if (
auto *WP = getAnalysisIfAvailable<MachinePostDominatorTreeWrapperPass>())
397 WP->getPostDomTree().updateBlockNumbers();
402void BasicBlockSections::getAnalysisUsage(AnalysisUsage &AU)
const {
404 AU.
addRequired<BasicBlockSectionsProfileReaderWrapperPass>();
411 return new BasicBlockSections();
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static void assignSections(MachineFunction &MF, const DenseMap< UniqueBBID, BBClusterInfo > &FuncClusterInfo)
static cl::opt< bool > BBSectionsDetectSourceDrift("bbsections-detect-source-drift", cl::desc("This checks if there is a fdo instr. profile hash " "mismatch for this function"), cl::init(true), cl::Hidden)
bbsections Prepares for basic block by splitting functions into clusters of basic static false void updateBranches(MachineFunction &MF, const SmallVector< MachineBasicBlock * > &PreLayoutFallThroughs)
const HexagonInstrInfo * TII
#define INITIALIZE_PASS_DEPENDENCY(depName)
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
const SmallVectorImpl< MachineOperand > & Cond
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()
void setPreservesAll()
Set by analyses that do not transform their input at all.
ValueT lookup(const_arg_type_t< KeyT > Val) const
lookup - Return the entry for the specified key, or a default constructed value if no such entry exis...
iterator find(const_arg_type_t< KeyT > Val)
std::pair< iterator, bool > try_emplace(KeyT &&Key, Ts &&...Args)
MDNode * getMetadata(unsigned KindID) const
Get the current metadata attachments for the given kind, if any.
MBBSectionID getSectionID() const
Returns the section ID of this basic block.
MachineInstrBundleIterator< MachineInstr > iterator
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.
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.
bool hasBBSections() const
Returns true if this function has basic block sections enabled.
Function & getFunction()
Return the LLVM function that this machine code represents.
unsigned getNumBlockIDs() const
getNumBlockIDs - Return the number of MBB ID's allocated.
void RenumberBlocks(MachineBasicBlock *MBBFrom=nullptr)
RenumberBlocks - This discards all of the MachineBasicBlock numbers and recomputes them.
const MachineBasicBlock & front() const
void assignBeginEndSections()
Assign IsBeginSection IsEndSection fields for basic blocks in this function.
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...
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
TargetInstrInfo - Interface to description of machine instruction set.
virtual void insertNoop(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI) const
Insert a noop into the instruction stream at the specified point.
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 * createBasicBlockSectionsPass()
createBasicBlockSections Pass - This pass assigns sections to machine basic blocks and is enabled wit...
LLVM_ABI void initializeBasicBlockSectionsPass(PassRegistry &)
bool hasInstrProfHashMismatch(MachineFunction &MF)
This checks if the source of this function has drifted since this binary was profiled previously.
SmallPtrSet< SUnit *, 8 > ClusterInfo
Keep record of which SUnit are in the same cluster group.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
void avoidZeroOffsetLandingPad(MachineFunction &MF)
cl::opt< std::string > BBSectionsColdTextPrefix
function_ref< bool(const MachineBasicBlock &, const MachineBasicBlock &)> MachineBasicBlockComparator
void sortBasicBlocksAndUpdateBranches(MachineFunction &MF, MachineBasicBlockComparator MBBCmp)
LLVM_ABI static const MBBSectionID ExceptionSectionID
LLVM_ABI static const MBBSectionID ColdSectionID