@@ -214,7 +214,8 @@ MachineSchedContext::~MachineSchedContext() {
214214 delete RegClassInfo;
215215}
216216
217- namespace {
217+ namespace llvm {
218+ namespace impl_detail {
218219
219220// / Base class for the machine scheduler classes.
220221class MachineSchedulerBase : public MachineSchedContext {
@@ -224,38 +225,67 @@ class MachineSchedulerBase : public MachineSchedContext {
224225
225226// / Impl class for MachineScheduler.
226227class MachineSchedulerImpl : public MachineSchedulerBase {
228+ // These are only for using MF.verify()
229+ // remove when verify supports passing in all analyses
227230 MachineFunctionPass *P = nullptr ;
228231 MachineFunctionAnalysisManager *MFAM = nullptr ;
229232
230233public:
231- MachineSchedulerImpl (MachineFunction &Func, MachineFunctionPass *P);
232- MachineSchedulerImpl (MachineFunction &Func,
233- MachineFunctionAnalysisManager &MFAM,
234- const TargetMachine *TargetM);
235- bool run ();
234+ struct RequiredAnalyses {
235+ MachineLoopInfo &MLI;
236+ MachineDominatorTree &MDT;
237+ AAResults &AA;
238+ LiveIntervals &LIS;
239+ };
240+
241+ MachineSchedulerImpl () {}
242+ // Migration only
243+ void setLegacyPass (MachineFunctionPass *P) { this ->P = P; }
244+ void setMFAM (MachineFunctionAnalysisManager *MFAM) { this ->MFAM = MFAM; }
245+
246+ bool run (MachineFunction &MF, const TargetMachine &TM,
247+ const RequiredAnalyses &Analyses);
236248
237249protected:
238250 ScheduleDAGInstrs *createMachineScheduler ();
239251};
240252
241253// / Impl class for PostMachineScheduler.
242254class PostMachineSchedulerImpl : public MachineSchedulerBase {
255+ // These are only for using MF.verify()
256+ // remove when verify supports passing in all analyses
243257 MachineFunctionPass *P = nullptr ;
244258 MachineFunctionAnalysisManager *MFAM = nullptr ;
245259
246260public:
247- PostMachineSchedulerImpl (MachineFunction &Func, MachineFunctionPass *P);
248- PostMachineSchedulerImpl (MachineFunction &Func,
249- MachineFunctionAnalysisManager &MFAM,
250- const TargetMachine *TargetM);
251- bool run ();
261+ struct RequiredAnalyses {
262+ MachineLoopInfo &MLI;
263+ AAResults &AA;
264+ };
265+ PostMachineSchedulerImpl () {}
266+ // Migration only
267+ void setLegacyPass (MachineFunctionPass *P) { this ->P = P; }
268+ void setMFAM (MachineFunctionAnalysisManager *MFAM) { this ->MFAM = MFAM; }
269+
270+ bool run (MachineFunction &Func, const TargetMachine &TM,
271+ const RequiredAnalyses &Analyses);
252272
253273protected:
254274 ScheduleDAGInstrs *createPostMachineScheduler ();
255275};
256276
277+ } // namespace impl_detail
278+ } // namespace llvm
279+
280+ using impl_detail::MachineSchedulerBase;
281+ using impl_detail::MachineSchedulerImpl;
282+ using impl_detail::PostMachineSchedulerImpl;
283+
284+ namespace {
257285// / MachineScheduler runs after coalescing and before register allocation.
258286class MachineSchedulerLegacy : public MachineFunctionPass {
287+ MachineSchedulerImpl Impl;
288+
259289public:
260290 MachineSchedulerLegacy ();
261291 void getAnalysisUsage (AnalysisUsage &AU) const override ;
@@ -266,10 +296,12 @@ class MachineSchedulerLegacy : public MachineFunctionPass {
266296
267297// / PostMachineScheduler runs after shortly before code emission.
268298class PostMachineSchedulerLegacy : public MachineFunctionPass {
299+ PostMachineSchedulerImpl Impl;
300+
269301public:
270302 PostMachineSchedulerLegacy ();
271303 void getAnalysisUsage (AnalysisUsage &AU) const override ;
272- bool runOnMachineFunction (MachineFunction&) override ;
304+ bool runOnMachineFunction (MachineFunction &) override ;
273305
274306 static char ID; // Class identification, replacement for typeinfo
275307};
@@ -403,31 +435,6 @@ nextIfDebug(MachineBasicBlock::iterator I,
403435 .getNonConstIterator ();
404436}
405437
406- MachineSchedulerImpl::MachineSchedulerImpl (MachineFunction &Func,
407- MachineFunctionPass *P)
408- : P(P) {
409- MF = &Func;
410- MLI = &P->getAnalysis <MachineLoopInfoWrapperPass>().getLI ();
411- MDT = &P->getAnalysis <MachineDominatorTreeWrapperPass>().getDomTree ();
412- TM = &P->getAnalysis <TargetPassConfig>().getTM <TargetMachine>();
413- AA = &P->getAnalysis <AAResultsWrapperPass>().getAAResults ();
414- LIS = &P->getAnalysis <LiveIntervalsWrapperPass>().getLIS ();
415- }
416-
417- MachineSchedulerImpl::MachineSchedulerImpl (MachineFunction &Func,
418- MachineFunctionAnalysisManager &MFAM,
419- const TargetMachine *TargetM)
420- : MFAM(&MFAM) {
421- MF = &Func;
422- TM = TargetM;
423- MLI = &MFAM.getResult <MachineLoopAnalysis>(Func);
424- MDT = &MFAM.getResult <MachineDominatorTreeAnalysis>(Func);
425- auto &FAM = MFAM.getResult <FunctionAnalysisManagerMachineFunctionProxy>(Func)
426- .getManager ();
427- AA = &FAM.getResult <AAManager>(Func.getFunction ());
428- LIS = &MFAM.getResult <LiveIntervalsAnalysis>(Func);
429- }
430-
431438// / Instantiate a ScheduleDAGInstrs that will be owned by the caller.
432439ScheduleDAGInstrs *MachineSchedulerImpl::createMachineScheduler () {
433440 // Select the scheduler, or set the default.
@@ -444,7 +451,15 @@ ScheduleDAGInstrs *MachineSchedulerImpl::createMachineScheduler() {
444451 return createGenericSchedLive (this );
445452}
446453
447- bool MachineSchedulerImpl::run () {
454+ bool MachineSchedulerImpl::run (MachineFunction &Func, const TargetMachine &TM,
455+ const RequiredAnalyses &Analyses) {
456+ MF = &Func;
457+ MLI = &Analyses.MLI ;
458+ MDT = &Analyses.MDT ;
459+ this ->TM = &TM;
460+ AA = &Analyses.AA ;
461+ LIS = &Analyses.LIS ;
462+
448463 if (VerifyScheduling) {
449464 LLVM_DEBUG (LIS->dump ());
450465 const char *MSchedBanner = " Before machine scheduling." ;
@@ -471,27 +486,6 @@ bool MachineSchedulerImpl::run() {
471486 return true ;
472487}
473488
474- PostMachineSchedulerImpl::PostMachineSchedulerImpl (MachineFunction &Func,
475- MachineFunctionPass *P)
476- : P(P) {
477- MF = &Func;
478- MLI = &P->getAnalysis <MachineLoopInfoWrapperPass>().getLI ();
479- TM = &P->getAnalysis <TargetPassConfig>().getTM <TargetMachine>();
480- AA = &P->getAnalysis <AAResultsWrapperPass>().getAAResults ();
481- }
482-
483- PostMachineSchedulerImpl::PostMachineSchedulerImpl (
484- MachineFunction &Func, MachineFunctionAnalysisManager &MFAM,
485- const TargetMachine *TargetM)
486- : MFAM(&MFAM) {
487- MF = &Func;
488- TM = TargetM;
489- MLI = &MFAM.getResult <MachineLoopAnalysis>(Func);
490- auto &FAM = MFAM.getResult <FunctionAnalysisManagerMachineFunctionProxy>(Func)
491- .getManager ();
492- AA = &FAM.getResult <AAManager>(Func.getFunction ());
493- }
494-
495489// / Instantiate a ScheduleDAGInstrs for PostRA scheduling that will be owned by
496490// / the caller. We don't have a command line option to override the postRA
497491// / scheduler. The Target must configure it.
@@ -505,7 +499,14 @@ ScheduleDAGInstrs *PostMachineSchedulerImpl::createPostMachineScheduler() {
505499 return createGenericSchedPostRA (this );
506500}
507501
508- bool PostMachineSchedulerImpl::run () {
502+ bool PostMachineSchedulerImpl::run (MachineFunction &Func,
503+ const TargetMachine &TM,
504+ const RequiredAnalyses &Analyses) {
505+ MF = &Func;
506+ MLI = &Analyses.MLI ;
507+ this ->TM = &TM;
508+ AA = &Analyses.AA ;
509+
509510 if (VerifyScheduling) {
510511 const char *PostMSchedBanner = " Before post machine scheduling." ;
511512 if (P)
@@ -558,10 +559,27 @@ bool MachineSchedulerLegacy::runOnMachineFunction(MachineFunction &MF) {
558559
559560 LLVM_DEBUG (dbgs () << " Before MISched:\n " ; MF.print (dbgs ()));
560561
561- MachineSchedulerImpl Impl (MF, this );
562- return Impl.run ();
562+ auto &MLI = getAnalysis<MachineLoopInfoWrapperPass>().getLI ();
563+ auto &MDT = getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree ();
564+ auto &TM = getAnalysis<TargetPassConfig>().getTM <TargetMachine>();
565+ auto &AA = getAnalysis<AAResultsWrapperPass>().getAAResults ();
566+ auto &LIS = getAnalysis<LiveIntervalsWrapperPass>().getLIS ();
567+ Impl.setLegacyPass (this );
568+ return Impl.run (MF, TM, {MLI, MDT, AA, LIS});
563569}
564570
571+ MachineSchedulerPass::MachineSchedulerPass (const TargetMachine *TM)
572+ : Impl(std::make_unique<MachineSchedulerImpl>()), TM(TM) {}
573+ MachineSchedulerPass::~MachineSchedulerPass () = default ;
574+ MachineSchedulerPass::MachineSchedulerPass (MachineSchedulerPass &&Other) =
575+ default;
576+
577+ PostMachineSchedulerPass::PostMachineSchedulerPass (const TargetMachine *TM)
578+ : Impl(std::make_unique<PostMachineSchedulerImpl>()), TM(TM) {}
579+ PostMachineSchedulerPass::PostMachineSchedulerPass (
580+ PostMachineSchedulerPass &&Other) = default;
581+ PostMachineSchedulerPass::~PostMachineSchedulerPass () = default ;
582+
565583PreservedAnalyses
566584MachineSchedulerPass::run (MachineFunction &MF,
567585 MachineFunctionAnalysisManager &MFAM) {
@@ -573,9 +591,14 @@ MachineSchedulerPass::run(MachineFunction &MF,
573591 }
574592
575593 LLVM_DEBUG (dbgs () << " Before MISched:\n " ; MF.print (dbgs ()));
576-
577- MachineSchedulerImpl Impl (MF, MFAM, TM);
578- bool Changed = Impl.run ();
594+ auto &MLI = MFAM.getResult <MachineLoopAnalysis>(MF);
595+ auto &MDT = MFAM.getResult <MachineDominatorTreeAnalysis>(MF);
596+ auto &FAM = MFAM.getResult <FunctionAnalysisManagerMachineFunctionProxy>(MF)
597+ .getManager ();
598+ auto &AA = FAM.getResult <AAManager>(MF.getFunction ());
599+ auto &LIS = MFAM.getResult <LiveIntervalsAnalysis>(MF);
600+ Impl->setMFAM (&MFAM);
601+ bool Changed = Impl->run (MF, *TM, {MLI, MDT, AA, LIS});
579602 if (!Changed)
580603 return PreservedAnalyses::all ();
581604
@@ -598,9 +621,11 @@ bool PostMachineSchedulerLegacy::runOnMachineFunction(MachineFunction &MF) {
598621 return false ;
599622 }
600623 LLVM_DEBUG (dbgs () << " Before post-MI-sched:\n " ; MF.print (dbgs ()));
601-
602- PostMachineSchedulerImpl Impl (MF, this );
603- return Impl.run ();
624+ auto &MLI = getAnalysis<MachineLoopInfoWrapperPass>().getLI ();
625+ auto &TM = getAnalysis<TargetPassConfig>().getTM <TargetMachine>();
626+ auto &AA = getAnalysis<AAResultsWrapperPass>().getAAResults ();
627+ Impl.setLegacyPass (this );
628+ return Impl.run (MF, TM, {MLI, AA});
604629}
605630
606631PreservedAnalyses
@@ -614,9 +639,13 @@ PostMachineSchedulerPass::run(MachineFunction &MF,
614639 return PreservedAnalyses::all ();
615640 }
616641 LLVM_DEBUG (dbgs () << " Before post-MI-sched:\n " ; MF.print (dbgs ()));
642+ auto &MLI = MFAM.getResult <MachineLoopAnalysis>(MF);
643+ auto &FAM = MFAM.getResult <FunctionAnalysisManagerMachineFunctionProxy>(MF)
644+ .getManager ();
645+ auto &AA = FAM.getResult <AAManager>(MF.getFunction ());
617646
618- PostMachineSchedulerImpl Impl (MF, MFAM, TM );
619- bool Changed = Impl. run ();
647+ Impl-> setMFAM (& MFAM);
648+ bool Changed = Impl-> run (MF, *TM, {MLI, AA} );
620649 if (!Changed)
621650 return PreservedAnalyses::all ();
622651
0 commit comments