1515//
1616// ===----------------------------------------------------------------------===//
1717
18+ #include " llvm/CodeGen/MachineSink.h"
1819#include " llvm/ADT/DenseSet.h"
1920#include " llvm/ADT/DepthFirstIterator.h"
2021#include " llvm/ADT/MapVector.h"
3738#include " llvm/CodeGen/MachineInstr.h"
3839#include " llvm/CodeGen/MachineLoopInfo.h"
3940#include " llvm/CodeGen/MachineOperand.h"
41+ #include " llvm/CodeGen/MachinePassManager.h"
4042#include " llvm/CodeGen/MachinePostDominators.h"
4143#include " llvm/CodeGen/MachineRegisterInfo.h"
4244#include " llvm/CodeGen/MachineSizeOpts.h"
4749#include " llvm/CodeGen/TargetRegisterInfo.h"
4850#include " llvm/CodeGen/TargetSchedule.h"
4951#include " llvm/CodeGen/TargetSubtargetInfo.h"
52+ #include " llvm/IR/Analysis.h"
5053#include " llvm/IR/BasicBlock.h"
5154#include " llvm/IR/DebugInfoMetadata.h"
5255#include " llvm/IR/LLVMContext.h"
@@ -118,7 +121,7 @@ using RegSubRegPair = TargetInstrInfo::RegSubRegPair;
118121
119122namespace {
120123
121- class MachineSinking : public MachineFunctionPass {
124+ class MachineSinking {
122125 const TargetSubtargetInfo *STI = nullptr ;
123126 const TargetInstrInfo *TII = nullptr ;
124127 const TargetRegisterInfo *TRI = nullptr ;
@@ -132,6 +135,8 @@ class MachineSinking : public MachineFunctionPass {
132135 AliasAnalysis *AA = nullptr ;
133136 RegisterClassInfo RegClassInfo;
134137 TargetSchedModel SchedModel;
138+ Pass *LegacyPass;
139+ MachineFunctionAnalysisManager *MFAM;
135140
136141 // Remember which edges have been considered for breaking.
137142 SmallSet<std::pair<MachineBasicBlock *, MachineBasicBlock *>, 8 >
@@ -189,30 +194,14 @@ class MachineSinking : public MachineFunctionPass {
189194 bool EnableSinkAndFold;
190195
191196public:
192- static char ID; // Pass identification
197+ MachineSinking (Pass *LegacyPass, MachineFunctionAnalysisManager *MFAM,
198+ bool EnableSinkAndFold)
199+ : LegacyPass(LegacyPass), MFAM(MFAM),
200+ EnableSinkAndFold (EnableSinkAndFold) {}
193201
194- MachineSinking () : MachineFunctionPass(ID) {
195- initializeMachineSinkingPass (*PassRegistry::getPassRegistry ());
196- }
197-
198- bool runOnMachineFunction (MachineFunction &MF) override ;
199-
200- void getAnalysisUsage (AnalysisUsage &AU) const override {
201- MachineFunctionPass::getAnalysisUsage (AU);
202- AU.addRequired <AAResultsWrapperPass>();
203- AU.addRequired <MachineDominatorTreeWrapperPass>();
204- AU.addRequired <MachinePostDominatorTreeWrapperPass>();
205- AU.addRequired <MachineCycleInfoWrapperPass>();
206- AU.addRequired <MachineBranchProbabilityInfoWrapperPass>();
207- AU.addPreserved <MachineCycleInfoWrapperPass>();
208- AU.addPreserved <MachineLoopInfoWrapperPass>();
209- AU.addRequired <ProfileSummaryInfoWrapperPass>();
210- if (UseBlockFreqInfo)
211- AU.addRequired <MachineBlockFrequencyInfoWrapperPass>();
212- AU.addRequired <TargetPassConfig>();
213- }
202+ bool run (MachineFunction &MF);
214203
215- void releaseMemory () override {
204+ void releaseMemory () {
216205 CEBCandidates.clear ();
217206 CEMergeCandidates.clear ();
218207 }
@@ -290,21 +279,47 @@ class MachineSinking : public MachineFunctionPass {
290279 bool registerPressureExceedsLimit (const MachineBasicBlock &MBB);
291280};
292281
282+ class MachineSinkingLegacy : public MachineFunctionPass {
283+ public:
284+ static char ID;
285+
286+ MachineSinkingLegacy () : MachineFunctionPass(ID) {
287+ initializeMachineSinkingLegacyPass (*PassRegistry::getPassRegistry ());
288+ }
289+
290+ bool runOnMachineFunction (MachineFunction &MF) override ;
291+
292+ void getAnalysisUsage (AnalysisUsage &AU) const override {
293+ MachineFunctionPass::getAnalysisUsage (AU);
294+ AU.addRequired <AAResultsWrapperPass>();
295+ AU.addRequired <MachineDominatorTreeWrapperPass>();
296+ AU.addRequired <MachinePostDominatorTreeWrapperPass>();
297+ AU.addRequired <MachineCycleInfoWrapperPass>();
298+ AU.addRequired <MachineBranchProbabilityInfoWrapperPass>();
299+ AU.addPreserved <MachineCycleInfoWrapperPass>();
300+ AU.addPreserved <MachineLoopInfoWrapperPass>();
301+ AU.addRequired <ProfileSummaryInfoWrapperPass>();
302+ if (UseBlockFreqInfo)
303+ AU.addRequired <MachineBlockFrequencyInfoWrapperPass>();
304+ AU.addRequired <TargetPassConfig>();
305+ }
306+ };
307+
293308} // end anonymous namespace
294309
295- char MachineSinking ::ID = 0 ;
310+ char MachineSinkingLegacy ::ID = 0 ;
296311
297- char &llvm::MachineSinkingID = MachineSinking ::ID;
312+ char &llvm::MachineSinkingLegacyID = MachineSinkingLegacy ::ID;
298313
299- INITIALIZE_PASS_BEGIN (MachineSinking , DEBUG_TYPE, " Machine code sinking" , false ,
314+ INITIALIZE_PASS_BEGIN (MachineSinkingLegacy , DEBUG_TYPE, " Machine code sinking" , false ,
300315 false )
301316INITIALIZE_PASS_DEPENDENCY(ProfileSummaryInfoWrapperPass)
302317INITIALIZE_PASS_DEPENDENCY(MachineBranchProbabilityInfoWrapperPass)
303318INITIALIZE_PASS_DEPENDENCY(MachineDominatorTreeWrapperPass)
304319INITIALIZE_PASS_DEPENDENCY(MachineCycleInfoWrapperPass)
305320INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass)
306- INITIALIZE_PASS_END(MachineSinking , DEBUG_TYPE, " Machine code sinking" , false ,
307- false )
321+ INITIALIZE_PASS_END(MachineSinkingLegacy , DEBUG_TYPE, " Machine code sinking" ,
322+ false , false )
308323
309324// / Return true if a target defined block prologue instruction interferes
310325// / with a sink candidate.
@@ -728,28 +743,66 @@ void MachineSinking::FindCycleSinkCandidates(
728743 }
729744}
730745
731- bool MachineSinking::runOnMachineFunction (MachineFunction &MF) {
746+ PreservedAnalyses
747+ MachineSinkingPass::run (MachineFunction &MF,
748+ MachineFunctionAnalysisManager &MFAM) {
749+ MachineSinking Impl (nullptr , &MFAM, EnableSinkAndFold);
750+ bool Changed = Impl.run (MF);
751+ if (!Changed)
752+ return PreservedAnalyses::all ();
753+ auto PA = getMachineFunctionPassPreservedAnalyses ();
754+ PA.preserve <MachineCycleAnalysis>();
755+ PA.preserve <MachineLoopAnalysis>();
756+ return PA;
757+ }
758+
759+ void MachineSinkingPass::printPipeline (
760+ raw_ostream &OS, function_ref<StringRef(StringRef)> MapClassName2PassName) {
761+ OS << " machine-sink" ;
762+ if (EnableSinkAndFold)
763+ OS << " <enable-sink-fold>" ;
764+ }
765+
766+ bool MachineSinkingLegacy::runOnMachineFunction (MachineFunction &MF) {
732767 if (skipFunction (MF.getFunction ()))
733768 return false ;
734769
770+ TargetPassConfig *PassConfig = &getAnalysis<TargetPassConfig>();
771+ bool EnableSinkAndFold = PassConfig->getEnableSinkAndFold ();
772+
773+ MachineSinking Impl (this , nullptr , EnableSinkAndFold);
774+ return Impl.run (MF);
775+ }
776+
777+ #define GET_ANALYSIS (ANALYSIS, INFIX, GETTER ) \
778+ ((LegacyPass) \
779+ ? &LegacyPass->getAnalysis<ANALYSIS##INFIX##WrapperPass>().GETTER() \
780+ : &MFAM->getResult<ANALYSIS##Analysis>(MF))
781+
782+ bool MachineSinking::run (MachineFunction &MF) {
735783 LLVM_DEBUG (dbgs () << " ******** Machine Sinking ********\n " );
736784
737785 STI = &MF.getSubtarget ();
738786 TII = STI->getInstrInfo ();
739787 TRI = STI->getRegisterInfo ();
740788 MRI = &MF.getRegInfo ();
741- DT = &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree ();
742- PDT = &getAnalysis<MachinePostDominatorTreeWrapperPass>().getPostDomTree ();
743- CI = &getAnalysis<MachineCycleInfoWrapperPass>().getCycleInfo ();
744- PSI = &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI ();
745- MBFI = UseBlockFreqInfo
746- ? &getAnalysis<MachineBlockFrequencyInfoWrapperPass>().getMBFI ()
747- : nullptr ;
748- MBPI = &getAnalysis<MachineBranchProbabilityInfoWrapperPass>().getMBPI ();
749- AA = &getAnalysis<AAResultsWrapperPass>().getAAResults ();
789+ DT = GET_ANALYSIS (MachineDominatorTree, , getDomTree);
790+ PDT = GET_ANALYSIS (MachinePostDominatorTree, , getPostDomTree);
791+ CI = GET_ANALYSIS (MachineCycle, Info, getCycleInfo);
792+ PSI = (LegacyPass)
793+ ? &LegacyPass->getAnalysis <ProfileSummaryInfoWrapperPass>().getPSI ()
794+ : MFAM->getResult <ModuleAnalysisManagerMachineFunctionProxy>(MF)
795+ .getCachedResult <ProfileSummaryAnalysis>(*MF.getFunction ().getParent ());
796+ MBFI = UseBlockFreqInfo ? GET_ANALYSIS (MachineBlockFrequency, Info, getMBFI)
797+ : nullptr ;
798+ MBPI = GET_ANALYSIS (MachineBranchProbability, Info, getMBPI);
799+ AA = (LegacyPass)
800+ ? &LegacyPass->getAnalysis <AAResultsWrapperPass>().getAAResults ()
801+ : &MFAM->getResult <FunctionAnalysisManagerMachineFunctionProxy>(MF)
802+ .getManager ()
803+ .getResult <AAManager>(MF.getFunction ());
804+
750805 RegClassInfo.runOnMachineFunction (MF);
751- TargetPassConfig *PassConfig = &getAnalysis<TargetPassConfig>();
752- EnableSinkAndFold = PassConfig->getEnableSinkAndFold ();
753806
754807 bool EverMadeChange = false ;
755808
@@ -768,7 +821,7 @@ bool MachineSinking::runOnMachineFunction(MachineFunction &MF) {
768821 MachineDomTreeUpdater::UpdateStrategy::Lazy);
769822 for (const auto &Pair : ToSplit) {
770823 auto NewSucc =
771- Pair.first ->SplitCriticalEdge (Pair.second , * this , nullptr , &MDTU);
824+ Pair.first ->SplitCriticalEdge (Pair.second , LegacyPass, MFAM , nullptr , &MDTU);
772825 if (NewSucc != nullptr ) {
773826 LLVM_DEBUG (dbgs () << " *** Splitting critical edge: "
774827 << printMBBReference (*Pair.first ) << " -- "
@@ -858,6 +911,7 @@ bool MachineSinking::runOnMachineFunction(MachineFunction &MF) {
858911 MRI->clearKillFlags (I);
859912 RegsToClearKillFlags.clear ();
860913
914+ releaseMemory ();
861915 return EverMadeChange;
862916}
863917
0 commit comments