@@ -346,6 +346,33 @@ class MachineSchedulerImpl : public MachineSchedulerBase {
346346 ScheduleDAGInstrs *createMachineScheduler ();
347347};
348348
349+ // / Impl class for SSAMachineScheduler.
350+ class SSAMachineSchedulerImpl : public MachineSchedulerBase {
351+ // These are only for using MF.verify()
352+ // remove when verify supports passing in all analyses
353+ MachineFunctionPass *P = nullptr ;
354+ MachineFunctionAnalysisManager *MFAM = nullptr ;
355+
356+ public:
357+ struct RequiredAnalyses {
358+ MachineLoopInfo &MLI;
359+ MachineDominatorTree &MDT;
360+ AAResults &AA;
361+ LiveIntervals &LIS;
362+ };
363+
364+ SSAMachineSchedulerImpl () {}
365+ // Migration only
366+ void setLegacyPass (MachineFunctionPass *P) { this ->P = P; }
367+ void setMFAM (MachineFunctionAnalysisManager *MFAM) { this ->MFAM = MFAM; }
368+
369+ bool run (MachineFunction &MF, const TargetMachine &TM,
370+ const RequiredAnalyses &Analyses);
371+
372+ protected:
373+ ScheduleDAGInstrs *createMachineScheduler ();
374+ };
375+
349376// / Impl class for PostMachineScheduler.
350377class PostMachineSchedulerImpl : public MachineSchedulerBase {
351378 // These are only for using MF.verify()
@@ -376,6 +403,7 @@ class PostMachineSchedulerImpl : public MachineSchedulerBase {
376403using impl_detail::MachineSchedulerBase;
377404using impl_detail::MachineSchedulerImpl;
378405using impl_detail::PostMachineSchedulerImpl;
406+ using impl_detail::SSAMachineSchedulerImpl;
379407
380408namespace {
381409// / MachineScheduler runs after coalescing and before register allocation.
@@ -390,6 +418,18 @@ class MachineSchedulerLegacy : public MachineFunctionPass {
390418 static char ID; // Class identification, replacement for typeinfo
391419};
392420
421+ // / SSAMachineScheduler runs before PHI elimination.
422+ class SSAMachineScheduler : public MachineFunctionPass {
423+ SSAMachineSchedulerImpl Impl;
424+
425+ public:
426+ SSAMachineScheduler ();
427+ void getAnalysisUsage (AnalysisUsage &AU) const override ;
428+ bool runOnMachineFunction (MachineFunction &) override ;
429+
430+ static char ID; // Class identification, replacement for typeinfo
431+ };
432+
393433// / PostMachineScheduler runs after shortly before code emission.
394434class PostMachineSchedulerLegacy : public MachineFunctionPass {
395435 PostMachineSchedulerImpl Impl;
@@ -435,6 +475,35 @@ void MachineSchedulerLegacy::getAnalysisUsage(AnalysisUsage &AU) const {
435475 MachineFunctionPass::getAnalysisUsage (AU);
436476}
437477
478+ char SSAMachineScheduler::ID = 0 ;
479+
480+ char &llvm::SSAMachineSchedulerID = SSAMachineScheduler::ID;
481+
482+ INITIALIZE_PASS_BEGIN (SSAMachineScheduler, " ssa-machine-scheduler" ,
483+ " SSA Machine Instruction Scheduler" , false , false )
484+ INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass)
485+ INITIALIZE_PASS_DEPENDENCY(MachineDominatorTreeWrapperPass)
486+ INITIALIZE_PASS_DEPENDENCY(MachineLoopInfoWrapperPass)
487+ INITIALIZE_PASS_DEPENDENCY(SlotIndexesWrapperPass)
488+ INITIALIZE_PASS_DEPENDENCY(LiveIntervalsWrapperPass)
489+ INITIALIZE_PASS_END(SSAMachineScheduler, " ssa-machine-scheduler" ,
490+ " SSA Machine Instruction Scheduler" , false , false )
491+
492+ SSAMachineScheduler::SSAMachineScheduler() : MachineFunctionPass(ID) {
493+ initializeSSAMachineSchedulerPass (*PassRegistry::getPassRegistry ());
494+ }
495+
496+ void SSAMachineScheduler::getAnalysisUsage (AnalysisUsage &AU) const {
497+ AU.setPreservesCFG ();
498+ AU.addRequired <MachineDominatorTreeWrapperPass>();
499+ AU.addRequired <MachineLoopInfoWrapperPass>();
500+ AU.addRequired <AAResultsWrapperPass>();
501+ AU.addRequired <TargetPassConfig>();
502+ AU.addRequired <SlotIndexesWrapperPass>();
503+ AU.addRequired <LiveIntervalsWrapperPass>();
504+ MachineFunctionPass::getAnalysisUsage (AU);
505+ }
506+
438507char PostMachineSchedulerLegacy::ID = 0 ;
439508
440509char &llvm::PostMachineSchedulerID = PostMachineSchedulerLegacy::ID;
@@ -486,6 +555,11 @@ static cl::opt<bool> EnableMachineSched(
486555 cl::desc (" Enable the machine instruction scheduling pass." ), cl::init(true ),
487556 cl::Hidden);
488557
558+ static cl::opt<bool > EnableSSAMachineSched (
559+ " enable-ssa-misched" ,
560+ cl::desc (" Enable the machine instruction scheduling pass in SSA." ),
561+ cl::init(false ), cl::Hidden);
562+
489563static cl::opt<bool > EnablePostRAMachineSched (
490564 " enable-post-misched" ,
491565 cl::desc (" Enable the post-ra machine instruction scheduling pass." ),
@@ -582,6 +656,53 @@ bool MachineSchedulerImpl::run(MachineFunction &Func, const TargetMachine &TM,
582656 return true ;
583657}
584658
659+ // / Instantiate a ScheduleDAGInstrs that will be owned by the caller.
660+ ScheduleDAGInstrs *SSAMachineSchedulerImpl::createMachineScheduler () {
661+ // Get the default scheduler set by the target for this function.
662+ ScheduleDAGInstrs *Scheduler = TM->createMachineScheduler (this );
663+ if (Scheduler)
664+ return Scheduler;
665+
666+ // Default to GenericScheduler.
667+ return createSchedLive (this );
668+ }
669+
670+ bool SSAMachineSchedulerImpl::run (MachineFunction &Func,
671+ const TargetMachine &TM,
672+ const RequiredAnalyses &Analyses) {
673+ MF = &Func;
674+ MLI = &Analyses.MLI ;
675+ MDT = &Analyses.MDT ;
676+ this ->TM = &TM;
677+ AA = &Analyses.AA ;
678+ LIS = &Analyses.LIS ;
679+
680+ if (VerifyScheduling) {
681+ LLVM_DEBUG (LIS->dump ());
682+ const char *MSchedBanner = " Before machine scheduling." ;
683+ if (P)
684+ MF->verify (P, MSchedBanner, &errs ());
685+ else
686+ MF->verify (*MFAM, MSchedBanner, &errs ());
687+ }
688+ RegClassInfo->runOnMachineFunction (*MF);
689+
690+ // Instantiate the selected scheduler for this target, function, and
691+ // optimization level.
692+ std::unique_ptr<ScheduleDAGInstrs> Scheduler (createMachineScheduler ());
693+ scheduleRegions (*Scheduler, false );
694+
695+ LLVM_DEBUG (LIS->dump ());
696+ if (VerifyScheduling) {
697+ const char *MSchedBanner = " After machine scheduling." ;
698+ if (P)
699+ MF->verify (P, MSchedBanner, &errs ());
700+ else
701+ MF->verify (*MFAM, MSchedBanner, &errs ());
702+ }
703+ return true ;
704+ }
705+
585706// / Instantiate a ScheduleDAGInstrs for PostRA scheduling that will be owned by
586707// / the caller. We don't have a command line option to override the postRA
587708// / scheduler. The Target must configure it.
@@ -664,12 +785,38 @@ bool MachineSchedulerLegacy::runOnMachineFunction(MachineFunction &MF) {
664785 return Impl.run (MF, TM, {MLI, MDT, AA, LIS});
665786}
666787
788+ bool SSAMachineScheduler::runOnMachineFunction (MachineFunction &MF) {
789+ if (skipFunction (MF.getFunction ()))
790+ return false ;
791+
792+ if (EnableSSAMachineSched.getNumOccurrences ()) {
793+ if (!EnableSSAMachineSched)
794+ return false ;
795+ } else if (!MF.getSubtarget ().enableSSAMachineScheduler ()) {
796+ return false ;
797+ }
798+
799+ auto &MLI = getAnalysis<MachineLoopInfoWrapperPass>().getLI ();
800+ auto &MDT = getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree ();
801+ auto &TM = getAnalysis<TargetPassConfig>().getTM <TargetMachine>();
802+ auto &AA = getAnalysis<AAResultsWrapperPass>().getAAResults ();
803+ auto &LIS = getAnalysis<LiveIntervalsWrapperPass>().getLIS ();
804+ Impl.setLegacyPass (this );
805+ return Impl.run (MF, TM, {MLI, MDT, AA, LIS});
806+ }
807+
667808MachineSchedulerPass::MachineSchedulerPass (const TargetMachine *TM)
668809 : Impl(std::make_unique<MachineSchedulerImpl>()), TM(TM) {}
669810MachineSchedulerPass::~MachineSchedulerPass () = default ;
670811MachineSchedulerPass::MachineSchedulerPass (MachineSchedulerPass &&Other) =
671812 default;
672813
814+ SSAMachineSchedulerPass::SSAMachineSchedulerPass (const TargetMachine *TM)
815+ : Impl(std::make_unique<SSAMachineSchedulerImpl>()), TM(TM) {}
816+ SSAMachineSchedulerPass::SSAMachineSchedulerPass (
817+ SSAMachineSchedulerPass &&Other) = default;
818+ SSAMachineSchedulerPass::~SSAMachineSchedulerPass () = default ;
819+
673820PostMachineSchedulerPass::PostMachineSchedulerPass (const TargetMachine *TM)
674821 : Impl(std::make_unique<PostMachineSchedulerImpl>()), TM(TM) {}
675822PostMachineSchedulerPass::PostMachineSchedulerPass (
@@ -704,6 +851,33 @@ MachineSchedulerPass::run(MachineFunction &MF,
704851 .preserve <LiveIntervalsAnalysis>();
705852}
706853
854+ PreservedAnalyses
855+ SSAMachineSchedulerPass::run (MachineFunction &MF,
856+ MachineFunctionAnalysisManager &MFAM) {
857+ if (EnableSSAMachineSched.getNumOccurrences ()) {
858+ if (!EnableSSAMachineSched)
859+ return PreservedAnalyses::all ();
860+ } else if (!MF.getSubtarget ().enableSSAMachineScheduler ()) {
861+ LLVM_DEBUG (dbgs () << " Subtarget disables ssa-MI-sched.\n " );
862+ return PreservedAnalyses::all ();
863+ }
864+
865+ auto &MLI = MFAM.getResult <MachineLoopAnalysis>(MF);
866+ auto &MDT = MFAM.getResult <MachineDominatorTreeAnalysis>(MF);
867+ auto &FAM = MFAM.getResult <FunctionAnalysisManagerMachineFunctionProxy>(MF)
868+ .getManager ();
869+ auto &AA = FAM.getResult <AAManager>(MF.getFunction ());
870+ auto &LIS = MFAM.getResult <LiveIntervalsAnalysis>(MF);
871+ Impl->setMFAM (&MFAM);
872+ bool Changed = Impl->run (MF, *TM, {MLI, MDT, AA, LIS});
873+ if (!Changed)
874+ return PreservedAnalyses::all ();
875+
876+ PreservedAnalyses PA = getMachineFunctionPassPreservedAnalyses ();
877+ PA.preserveSet <CFGAnalyses>();
878+ return PA;
879+ }
880+
707881bool PostMachineSchedulerLegacy::runOnMachineFunction (MachineFunction &MF) {
708882 if (skipFunction (MF.getFunction ()))
709883 return false ;
@@ -760,11 +934,10 @@ PostMachineSchedulerPass::run(MachineFunction &MF,
760934// / the boundary, but there would be no benefit to postRA scheduling across
761935// / calls this late anyway.
762936static bool isSchedBoundary (MachineBasicBlock::iterator MI,
763- MachineBasicBlock *MBB,
764- MachineFunction *MF,
937+ MachineBasicBlock *MBB, MachineFunction *MF,
765938 const TargetInstrInfo *TII) {
766939 return MI->isCall () || TII->isSchedulingBoundary (*MI, MBB, *MF) ||
767- MI->isFakeUse ();
940+ MI->isFakeUse () || MI-> isPHI () ;
768941}
769942
770943using MBBRegionsVector = SmallVector<SchedRegion, 16 >;
0 commit comments