2424//
2525// ===----------------------------------------------------------------------===//
2626
27+ #include " llvm/CodeGen/MachineBlockPlacement.h"
2728#include " BranchFolding.h"
2829#include " llvm/ADT/ArrayRef.h"
2930#include " llvm/ADT/DenseMap.h"
@@ -357,7 +358,7 @@ class BlockChain {
357358 unsigned UnscheduledPredecessors = 0 ;
358359};
359360
360- class MachineBlockPlacement : public MachineFunctionPass {
361+ class MachineBlockPlacement {
361362 // / A type for a block filter set.
362363 using BlockFilterSet = SmallSetVector<const MachineBasicBlock *, 16 >;
363364
@@ -409,7 +410,11 @@ class MachineBlockPlacement : public MachineFunctionPass {
409410
410411 ProfileSummaryInfo *PSI = nullptr ;
411412
412- TargetPassConfig *PassConfig = nullptr ;
413+ // Tail merging is also determined based on
414+ // whether structured CFG is required.
415+ bool AllowTailMerge;
416+
417+ CodeGenOptLevel OptLevel;
413418
414419 // / Duplicator used to duplicate tails during placement.
415420 // /
@@ -608,18 +613,48 @@ class MachineBlockPlacement : public MachineFunctionPass {
608613 // / Create a single CFG chain from the current block order.
609614 void createCFGChainExtTsp ();
610615
616+ public:
617+ MachineBlockPlacement (const MachineBranchProbabilityInfo *MBPI,
618+ MachineLoopInfo *MLI, ProfileSummaryInfo *PSI,
619+ std::unique_ptr<MBFIWrapper> MBFI,
620+ MachinePostDominatorTree *MPDT, bool AllowTailMerge)
621+ : MBPI(MBPI), MBFI(std::move(MBFI)), MLI(MLI), MPDT(MPDT), PSI(PSI),
622+ AllowTailMerge (AllowTailMerge) {};
623+
624+ bool run (MachineFunction &F);
625+
626+ static bool allowTailDupPlacement (MachineFunction &MF) {
627+ return TailDupPlacement && !MF.getTarget ().requiresStructuredCFG ();
628+ }
629+ };
630+
631+ class MachineBlockPlacementLegacy : public MachineFunctionPass {
611632public:
612633 static char ID; // Pass identification, replacement for typeid
613634
614- MachineBlockPlacement () : MachineFunctionPass(ID) {
615- initializeMachineBlockPlacementPass (*PassRegistry::getPassRegistry ());
635+ MachineBlockPlacementLegacy () : MachineFunctionPass(ID) {
636+ initializeMachineBlockPlacementLegacyPass (*PassRegistry::getPassRegistry ());
616637 }
617638
618- bool runOnMachineFunction (MachineFunction &F) override ;
639+ bool runOnMachineFunction (MachineFunction &MF) override {
640+ if (skipFunction (MF.getFunction ()))
641+ return false ;
619642
620- bool allowTailDupPlacement () const {
621- assert (F);
622- return TailDupPlacement && !F->getTarget ().requiresStructuredCFG ();
643+ auto *MBPI =
644+ &getAnalysis<MachineBranchProbabilityInfoWrapperPass>().getMBPI ();
645+ auto MBFI = std::make_unique<MBFIWrapper>(
646+ getAnalysis<MachineBlockFrequencyInfoWrapperPass>().getMBFI ());
647+ auto *MLI = &getAnalysis<MachineLoopInfoWrapperPass>().getLI ();
648+ auto *MPDT = MachineBlockPlacement::allowTailDupPlacement (MF)
649+ ? &getAnalysis<MachinePostDominatorTreeWrapperPass>()
650+ .getPostDomTree ()
651+ : nullptr ;
652+ auto *PSI = &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI ();
653+ auto *PassConfig = &getAnalysis<TargetPassConfig>();
654+ bool AllowTailMerge = PassConfig->getEnableTailMerge ();
655+ return MachineBlockPlacement (MBPI, MLI, PSI, std::move (MBFI), MPDT,
656+ AllowTailMerge)
657+ .run (MF);
623658 }
624659
625660 void getAnalysisUsage (AnalysisUsage &AU) const override {
@@ -636,18 +671,18 @@ class MachineBlockPlacement : public MachineFunctionPass {
636671
637672} // end anonymous namespace
638673
639- char MachineBlockPlacement ::ID = 0 ;
674+ char MachineBlockPlacementLegacy ::ID = 0 ;
640675
641- char &llvm::MachineBlockPlacementID = MachineBlockPlacement ::ID;
676+ char &llvm::MachineBlockPlacementID = MachineBlockPlacementLegacy ::ID;
642677
643- INITIALIZE_PASS_BEGIN (MachineBlockPlacement , DEBUG_TYPE,
678+ INITIALIZE_PASS_BEGIN (MachineBlockPlacementLegacy , DEBUG_TYPE,
644679 " Branch Probability Basic Block Placement" , false , false )
645680INITIALIZE_PASS_DEPENDENCY(MachineBranchProbabilityInfoWrapperPass)
646681INITIALIZE_PASS_DEPENDENCY(MachineBlockFrequencyInfoWrapperPass)
647682INITIALIZE_PASS_DEPENDENCY(MachinePostDominatorTreeWrapperPass)
648683INITIALIZE_PASS_DEPENDENCY(MachineLoopInfoWrapperPass)
649684INITIALIZE_PASS_DEPENDENCY(ProfileSummaryInfoWrapperPass)
650- INITIALIZE_PASS_END(MachineBlockPlacement , DEBUG_TYPE,
685+ INITIALIZE_PASS_END(MachineBlockPlacementLegacy , DEBUG_TYPE,
651686 " Branch Probability Basic Block Placement" , false , false )
652687
653688#ifndef NDEBUG
@@ -1130,7 +1165,7 @@ MachineBlockPlacement::getBestTrellisSuccessor(
11301165 MachineBasicBlock *Succ1 = BestA.Dest ;
11311166 MachineBasicBlock *Succ2 = BestB.Dest ;
11321167 // Check to see if tail-duplication would be profitable.
1133- if (allowTailDupPlacement () && shouldTailDuplicate (Succ2) &&
1168+ if (allowTailDupPlacement (*F ) && shouldTailDuplicate (Succ2) &&
11341169 canTailDuplicateUnplacedPreds (BB, Succ2, Chain, BlockFilter) &&
11351170 isProfitableToTailDup (BB, Succ2, MBPI->getEdgeProbability (BB, Succ1),
11361171 Chain, BlockFilter)) {
@@ -1655,7 +1690,7 @@ MachineBlockPlacement::selectBestSuccessor(const MachineBasicBlock *BB,
16551690 if (hasBetterLayoutPredecessor (BB, Succ, SuccChain, SuccProb, RealSuccProb,
16561691 Chain, BlockFilter)) {
16571692 // If tail duplication would make Succ profitable, place it.
1658- if (allowTailDupPlacement () && shouldTailDuplicate (Succ))
1693+ if (allowTailDupPlacement (*F ) && shouldTailDuplicate (Succ))
16591694 DupCandidates.emplace_back (SuccProb, Succ);
16601695 continue ;
16611696 }
@@ -1883,7 +1918,7 @@ void MachineBlockPlacement::buildChain(const MachineBasicBlock *HeadBB,
18831918 auto Result = selectBestSuccessor (BB, Chain, BlockFilter);
18841919 MachineBasicBlock *BestSucc = Result.BB ;
18851920 bool ShouldTailDup = Result.ShouldTailDup ;
1886- if (allowTailDupPlacement ())
1921+ if (allowTailDupPlacement (*F ))
18871922 ShouldTailDup |= (BestSucc && canTailDuplicateUnplacedPreds (
18881923 BB, BestSucc, Chain, BlockFilter));
18891924
@@ -1910,7 +1945,7 @@ void MachineBlockPlacement::buildChain(const MachineBasicBlock *HeadBB,
19101945
19111946 // Placement may have changed tail duplication opportunities.
19121947 // Check for that now.
1913- if (allowTailDupPlacement () && BestSucc && ShouldTailDup) {
1948+ if (allowTailDupPlacement (*F ) && BestSucc && ShouldTailDup) {
19141949 repeatedlyTailDuplicateBlock (BestSucc, BB, LoopHeaderBB, Chain,
19151950 BlockFilter, PrevUnplacedBlockIt,
19161951 PrevUnplacedBlockInFilterIt);
@@ -3466,7 +3501,7 @@ void MachineBlockPlacement::initTailDupThreshold() {
34663501
34673502 // For aggressive optimization, we can adjust some thresholds to be less
34683503 // conservative.
3469- if (PassConfig-> getOptLevel () >= CodeGenOptLevel::Aggressive) {
3504+ if (OptLevel >= CodeGenOptLevel::Aggressive) {
34703505 // At O3 we should be more willing to copy blocks for tail duplication. This
34713506 // increases size pressure, so we only do it at O3
34723507 // Do this unless only the regular threshold is explicitly set.
@@ -3478,29 +3513,56 @@ void MachineBlockPlacement::initTailDupThreshold() {
34783513 // If there's no threshold provided through options, query the target
34793514 // information for a threshold instead.
34803515 if (TailDupPlacementThreshold.getNumOccurrences () == 0 &&
3481- (PassConfig-> getOptLevel () < CodeGenOptLevel::Aggressive ||
3516+ (OptLevel < CodeGenOptLevel::Aggressive ||
34823517 TailDupPlacementAggressiveThreshold.getNumOccurrences () == 0 ))
3483- TailDupSize = TII->getTailDuplicateSize (PassConfig-> getOptLevel () );
3518+ TailDupSize = TII->getTailDuplicateSize (OptLevel );
34843519}
34853520
3486- bool MachineBlockPlacement::runOnMachineFunction (MachineFunction &MF) {
3487- if (skipFunction (MF.getFunction ()))
3488- return false ;
3521+ PreservedAnalyses
3522+ MachineBlockPlacementPass::run (MachineFunction &MF,
3523+ MachineFunctionAnalysisManager &MFAM) {
3524+ auto *MBPI = &MFAM.getResult <MachineBranchProbabilityAnalysis>(MF);
3525+ auto MBFI = std::make_unique<MBFIWrapper>(
3526+ MFAM.getResult <MachineBlockFrequencyAnalysis>(MF));
3527+ auto *MLI = &MFAM.getResult <MachineLoopAnalysis>(MF);
3528+ auto *MPDT = MachineBlockPlacement::allowTailDupPlacement (MF)
3529+ ? &MFAM.getResult <MachinePostDominatorTreeAnalysis>(MF)
3530+ : nullptr ;
3531+ auto *PSI = MFAM.getResult <ModuleAnalysisManagerMachineFunctionProxy>(MF)
3532+ .getCachedResult <ProfileSummaryAnalysis>(
3533+ *MF.getFunction ().getParent ());
3534+ if (!PSI)
3535+ report_fatal_error (" MachineBlockPlacement requires ProfileSummaryAnalysis" ,
3536+ false );
3537+
3538+ MachineBlockPlacement MBP (MBPI, MLI, PSI, std::move (MBFI), MPDT,
3539+ AllowTailMerge);
3540+
3541+ if (!MBP.run (MF))
3542+ return PreservedAnalyses::all ();
3543+
3544+ return getMachineFunctionPassPreservedAnalyses ();
3545+ }
3546+
3547+ void MachineBlockPlacementPass::printPipeline (
3548+ raw_ostream &OS,
3549+ function_ref<StringRef(StringRef)> MapClassName2PassName) const {
3550+ OS << MapClassName2PassName (name ());
3551+ if (!AllowTailMerge)
3552+ OS << " <no-tail-merge>" ;
3553+ }
3554+
3555+ bool MachineBlockPlacement::run (MachineFunction &MF) {
34893556
34903557 // Check for single-block functions and skip them.
34913558 if (std::next (MF.begin ()) == MF.end ())
34923559 return false ;
34933560
34943561 F = &MF;
3495- MBPI = &getAnalysis<MachineBranchProbabilityInfoWrapperPass>().getMBPI ();
3496- MBFI = std::make_unique<MBFIWrapper>(
3497- getAnalysis<MachineBlockFrequencyInfoWrapperPass>().getMBFI ());
3498- MLI = &getAnalysis<MachineLoopInfoWrapperPass>().getLI ();
3562+ OptLevel = F->getTarget ().getOptLevel ();
3563+
34993564 TII = MF.getSubtarget ().getInstrInfo ();
35003565 TLI = MF.getSubtarget ().getTargetLowering ();
3501- MPDT = nullptr ;
3502- PSI = &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI ();
3503- PassConfig = &getAnalysis<TargetPassConfig>();
35043566
35053567 // Initialize PreferredLoopExit to nullptr here since it may never be set if
35063568 // there are no MachineLoops.
@@ -3529,8 +3591,7 @@ bool MachineBlockPlacement::runOnMachineFunction(MachineFunction &MF) {
35293591 }
35303592
35313593 // Apply tail duplication.
3532- if (allowTailDupPlacement ()) {
3533- MPDT = &getAnalysis<MachinePostDominatorTreeWrapperPass>().getPostDomTree ();
3594+ if (allowTailDupPlacement (*F)) {
35343595 if (OptForSize)
35353596 TailDupSize = 1 ;
35363597 const bool PreRegAlloc = false ;
@@ -3548,8 +3609,8 @@ bool MachineBlockPlacement::runOnMachineFunction(MachineFunction &MF) {
35483609 // TailMerge can create jump into if branches that make CFG irreducible for
35493610 // HW that requires structured CFG.
35503611 const bool EnableTailMerge = !MF.getTarget ().requiresStructuredCFG () &&
3551- PassConfig-> getEnableTailMerge () &&
3552- BranchFoldPlacement && MF.size () > 3 ;
3612+ AllowTailMerge && BranchFoldPlacement &&
3613+ MF.size () > 3 ;
35533614 // No tail merging opportunities if the block number is less than four.
35543615 if (EnableTailMerge) {
35553616 const unsigned TailMergeSize = TailDupSize + 1 ;
0 commit comments