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"
2627#include " llvm/Analysis/AliasAnalysis.h"
2728#include " llvm/Analysis/CFG.h"
2829#include " llvm/Analysis/ProfileSummaryInfo.h"
30+ #include " llvm/CodeGen/LiveIntervals.h"
31+ #include " llvm/CodeGen/LiveVariables.h"
2932#include " llvm/CodeGen/MachineBasicBlock.h"
3033#include " llvm/CodeGen/MachineBlockFrequencyInfo.h"
3134#include " llvm/CodeGen/MachineBranchProbabilityInfo.h"
4245#include " llvm/CodeGen/MachineSizeOpts.h"
4346#include " llvm/CodeGen/RegisterClassInfo.h"
4447#include " llvm/CodeGen/RegisterPressure.h"
48+ #include " llvm/CodeGen/SlotIndexes.h"
4549#include " llvm/CodeGen/TargetInstrInfo.h"
4650#include " llvm/CodeGen/TargetPassConfig.h"
4751#include " llvm/CodeGen/TargetRegisterInfo.h"
@@ -118,7 +122,7 @@ using RegSubRegPair = TargetInstrInfo::RegSubRegPair;
118122
119123namespace {
120124
121- class MachineSinking : public MachineFunctionPass {
125+ class MachineSinking {
122126 const TargetSubtargetInfo *STI = nullptr ;
123127 const TargetInstrInfo *TII = nullptr ;
124128 const TargetRegisterInfo *TRI = nullptr ;
@@ -132,6 +136,11 @@ class MachineSinking : public MachineFunctionPass {
132136 AliasAnalysis *AA = nullptr ;
133137 RegisterClassInfo RegClassInfo;
134138 TargetSchedModel SchedModel;
139+ // Required for split critical edge
140+ LiveIntervals *LIS;
141+ SlotIndexes *SI;
142+ LiveVariables *LV;
143+ MachineLoopInfo *MLI;
135144
136145 // Remember which edges have been considered for breaking.
137146 SmallSet<std::pair<MachineBasicBlock *, MachineBasicBlock *>, 8 >
@@ -189,30 +198,19 @@ class MachineSinking : public MachineFunctionPass {
189198 bool EnableSinkAndFold;
190199
191200public:
192- static char ID; // Pass identification
193-
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- }
214-
215- void releaseMemory () override {
201+ MachineSinking (bool EnableSinkAndFold, MachineDominatorTree *DT,
202+ MachinePostDominatorTree *PDT, LiveVariables *LV,
203+ MachineLoopInfo *MLI, SlotIndexes *SI, LiveIntervals *LIS,
204+ MachineCycleInfo *CI, ProfileSummaryInfo *PSI,
205+ MachineBlockFrequencyInfo *MBFI,
206+ const MachineBranchProbabilityInfo *MBPI, AliasAnalysis *AA)
207+ : DT(DT), PDT(PDT), CI(CI), PSI(PSI), MBFI(MBFI), MBPI(MBPI), AA(AA),
208+ LIS (LIS), SI(SI), LV(LV), MLI(MLI),
209+ EnableSinkAndFold(EnableSinkAndFold) {}
210+
211+ bool run (MachineFunction &MF);
212+
213+ void releaseMemory () {
216214 CEBCandidates.clear ();
217215 CEMergeCandidates.clear ();
218216 }
@@ -290,21 +288,47 @@ class MachineSinking : public MachineFunctionPass {
290288 bool registerPressureExceedsLimit (const MachineBasicBlock &MBB);
291289};
292290
291+ class MachineSinkingLegacy : public MachineFunctionPass {
292+ public:
293+ static char ID;
294+
295+ MachineSinkingLegacy () : MachineFunctionPass(ID) {
296+ initializeMachineSinkingLegacyPass (*PassRegistry::getPassRegistry ());
297+ }
298+
299+ bool runOnMachineFunction (MachineFunction &MF) override ;
300+
301+ void getAnalysisUsage (AnalysisUsage &AU) const override {
302+ MachineFunctionPass::getAnalysisUsage (AU);
303+ AU.addRequired <AAResultsWrapperPass>();
304+ AU.addRequired <MachineDominatorTreeWrapperPass>();
305+ AU.addRequired <MachinePostDominatorTreeWrapperPass>();
306+ AU.addRequired <MachineCycleInfoWrapperPass>();
307+ AU.addRequired <MachineBranchProbabilityInfoWrapperPass>();
308+ AU.addPreserved <MachineCycleInfoWrapperPass>();
309+ AU.addPreserved <MachineLoopInfoWrapperPass>();
310+ AU.addRequired <ProfileSummaryInfoWrapperPass>();
311+ if (UseBlockFreqInfo)
312+ AU.addRequired <MachineBlockFrequencyInfoWrapperPass>();
313+ AU.addRequired <TargetPassConfig>();
314+ }
315+ };
316+
293317} // end anonymous namespace
294318
295- char MachineSinking ::ID = 0 ;
319+ char MachineSinkingLegacy ::ID = 0 ;
296320
297- char &llvm::MachineSinkingID = MachineSinking ::ID;
321+ char &llvm::MachineSinkingLegacyID = MachineSinkingLegacy ::ID;
298322
299- INITIALIZE_PASS_BEGIN (MachineSinking , DEBUG_TYPE, " Machine code sinking" , false ,
300- false )
323+ INITIALIZE_PASS_BEGIN (MachineSinkingLegacy , DEBUG_TYPE, " Machine code sinking" ,
324+ false , false )
301325INITIALIZE_PASS_DEPENDENCY(ProfileSummaryInfoWrapperPass)
302326INITIALIZE_PASS_DEPENDENCY(MachineBranchProbabilityInfoWrapperPass)
303327INITIALIZE_PASS_DEPENDENCY(MachineDominatorTreeWrapperPass)
304328INITIALIZE_PASS_DEPENDENCY(MachineCycleInfoWrapperPass)
305329INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass)
306- INITIALIZE_PASS_END(MachineSinking , DEBUG_TYPE, " Machine code sinking" , false ,
307- false )
330+ INITIALIZE_PASS_END(MachineSinkingLegacy , DEBUG_TYPE, " Machine code sinking" ,
331+ false , false )
308332
309333// / Return true if a target defined block prologue instruction interferes
310334// / with a sink candidate.
@@ -728,28 +752,87 @@ void MachineSinking::FindCycleSinkCandidates(
728752 }
729753}
730754
731- bool MachineSinking::runOnMachineFunction (MachineFunction &MF) {
755+ PreservedAnalyses
756+ MachineSinkingPass::run (MachineFunction &MF,
757+ MachineFunctionAnalysisManager &MFAM) {
758+ auto *DT = &MFAM.getResult <MachineDominatorTreeAnalysis>(MF);
759+ auto *PDT = &MFAM.getResult <MachinePostDominatorTreeAnalysis>(MF);
760+ auto *CI = &MFAM.getResult <MachineCycleAnalysis>(MF);
761+ auto *PSI = MFAM.getResult <ModuleAnalysisManagerMachineFunctionProxy>(MF)
762+ .getCachedResult <ProfileSummaryAnalysis>(
763+ *MF.getFunction ().getParent ());
764+ auto *MBFI = UseBlockFreqInfo
765+ ? &MFAM.getResult <MachineBlockFrequencyAnalysis>(MF)
766+ : nullptr ;
767+ auto *MBPI = &MFAM.getResult <MachineBranchProbabilityAnalysis>(MF);
768+ auto *AA = &MFAM.getResult <FunctionAnalysisManagerMachineFunctionProxy>(MF)
769+ .getManager ()
770+ .getResult <AAManager>(MF.getFunction ());
771+ auto *LIS = MFAM.getCachedResult <LiveIntervalsAnalysis>(MF);
772+ auto *SI = MFAM.getCachedResult <SlotIndexesAnalysis>(MF);
773+ auto *LV = MFAM.getCachedResult <LiveVariablesAnalysis>(MF);
774+ auto *MLI = MFAM.getCachedResult <MachineLoopAnalysis>(MF);
775+ MachineSinking Impl (EnableSinkAndFold, DT, PDT, LV, MLI, SI, LIS, CI, PSI,
776+ MBFI, MBPI, AA);
777+ bool Changed = Impl.run (MF);
778+ if (!Changed)
779+ return PreservedAnalyses::all ();
780+ auto PA = getMachineFunctionPassPreservedAnalyses ();
781+ PA.preserve <MachineCycleAnalysis>();
782+ PA.preserve <MachineLoopAnalysis>();
783+ return PA;
784+ }
785+
786+ void MachineSinkingPass::printPipeline (
787+ raw_ostream &OS, function_ref<StringRef(StringRef)> MapClassName2PassName) {
788+ OS << MapClassName2PassName (name ()); // ideally machine-sink
789+ if (EnableSinkAndFold)
790+ OS << " <enable-sink-fold>" ;
791+ }
792+
793+ bool MachineSinkingLegacy::runOnMachineFunction (MachineFunction &MF) {
732794 if (skipFunction (MF.getFunction ()))
733795 return false ;
734796
797+ TargetPassConfig *PassConfig = &getAnalysis<TargetPassConfig>();
798+ bool EnableSinkAndFold = PassConfig->getEnableSinkAndFold ();
799+
800+ auto *DT = &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree ();
801+ auto *PDT =
802+ &getAnalysis<MachinePostDominatorTreeWrapperPass>().getPostDomTree ();
803+ auto *CI = &getAnalysis<MachineCycleInfoWrapperPass>().getCycleInfo ();
804+ auto *PSI = &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI ();
805+ auto *MBFI =
806+ UseBlockFreqInfo
807+ ? &getAnalysis<MachineBlockFrequencyInfoWrapperPass>().getMBFI ()
808+ : nullptr ;
809+ auto *MBPI =
810+ &getAnalysis<MachineBranchProbabilityInfoWrapperPass>().getMBPI ();
811+ auto *AA = &getAnalysis<AAResultsWrapperPass>().getAAResults ();
812+ // Get analyses for split critical edge.
813+ auto *LISWrapper = getAnalysisIfAvailable<LiveIntervalsWrapperPass>();
814+ auto *LIS = LISWrapper ? &LISWrapper->getLIS () : nullptr ;
815+ auto *SIWrapper = getAnalysisIfAvailable<SlotIndexesWrapperPass>();
816+ auto *SI = SIWrapper ? &SIWrapper->getSI () : nullptr ;
817+ auto *LVWrapper = getAnalysisIfAvailable<LiveVariablesWrapperPass>();
818+ auto *LV = LVWrapper ? &LVWrapper->getLV () : nullptr ;
819+ auto *MLIWrapper = getAnalysisIfAvailable<MachineLoopInfoWrapperPass>();
820+ auto *MLI = MLIWrapper ? &MLIWrapper->getLI () : nullptr ;
821+
822+ MachineSinking Impl (EnableSinkAndFold, DT, PDT, LV, MLI, SI, LIS, CI, PSI,
823+ MBFI, MBPI, AA);
824+ return Impl.run (MF);
825+ }
826+
827+ bool MachineSinking::run (MachineFunction &MF) {
735828 LLVM_DEBUG (dbgs () << " ******** Machine Sinking ********\n " );
736829
737830 STI = &MF.getSubtarget ();
738831 TII = STI->getInstrInfo ();
739832 TRI = STI->getRegisterInfo ();
740833 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 ();
834+
750835 RegClassInfo.runOnMachineFunction (MF);
751- TargetPassConfig *PassConfig = &getAnalysis<TargetPassConfig>();
752- EnableSinkAndFold = PassConfig->getEnableSinkAndFold ();
753836
754837 bool EverMadeChange = false ;
755838
@@ -767,8 +850,8 @@ bool MachineSinking::runOnMachineFunction(MachineFunction &MF) {
767850 MachineDomTreeUpdater MDTU (DT, PDT,
768851 MachineDomTreeUpdater::UpdateStrategy::Lazy);
769852 for (const auto &Pair : ToSplit) {
770- auto NewSucc =
771- Pair.first -> SplitCriticalEdge (Pair. second , * this , nullptr , &MDTU);
853+ auto NewSucc = Pair. first -> SplitCriticalEdge (
854+ Pair.second , {LIS, SI, LV, MLI} , nullptr , &MDTU);
772855 if (NewSucc != nullptr ) {
773856 LLVM_DEBUG (dbgs () << " *** Splitting critical edge: "
774857 << printMBBReference (*Pair.first ) << " -- "
@@ -858,6 +941,7 @@ bool MachineSinking::runOnMachineFunction(MachineFunction &MF) {
858941 MRI->clearKillFlags (I);
859942 RegsToClearKillFlags.clear ();
860943
944+ releaseMemory ();
861945 return EverMadeChange;
862946}
863947
0 commit comments