3333#include " llvm/ADT/Sequence.h"
3434#include " llvm/Analysis/AliasAnalysis.h"
3535#include " llvm/CodeGen/MachineLoopInfo.h"
36+ #include " llvm/CodeGen/MachinePassManager.h"
3637#include " llvm/CodeGen/MachinePostDominators.h"
3738#include " llvm/Support/DebugCounter.h"
3839#include " llvm/TargetParser/TargetParser.h"
@@ -585,7 +586,7 @@ class WaitcntGeneratorGFX12Plus : public WaitcntGenerator {
585586 AMDGPU::Waitcnt getAllZeroWaitcnt (bool IncludeVSCnt) const override ;
586587};
587588
588- class SIInsertWaitcnts : public MachineFunctionPass {
589+ class SIInsertWaitcnts {
589590private:
590591 const GCNSubtarget *ST = nullptr ;
591592 const SIInstrInfo *TII = nullptr ;
@@ -624,9 +625,9 @@ class SIInsertWaitcnts : public MachineFunctionPass {
624625 InstCounterType MaxCounter = NUM_NORMAL_INST_CNTS;
625626
626627public:
627- static char ID;
628-
629- SIInsertWaitcnts () : MachineFunctionPass(ID ) {
628+ SIInsertWaitcnts (MachineLoopInfo *MLI, MachinePostDominatorTree *PDT,
629+ AliasAnalysis *AA)
630+ : MLI(MLI), PDT(PDT), AA(AA ) {
630631 (void )ForceExpCounter;
631632 (void )ForceLgkmCounter;
632633 (void )ForceVMCounter;
@@ -636,20 +637,7 @@ class SIInsertWaitcnts : public MachineFunctionPass {
636637 bool isPreheaderToFlush (MachineBasicBlock &MBB,
637638 WaitcntBrackets &ScoreBrackets);
638639 bool isVMEMOrFlatVMEM (const MachineInstr &MI) const ;
639- bool runOnMachineFunction (MachineFunction &MF) override ;
640-
641- StringRef getPassName () const override {
642- return " SI insert wait instructions" ;
643- }
644-
645- void getAnalysisUsage (AnalysisUsage &AU) const override {
646- AU.setPreservesCFG ();
647- AU.addRequired <MachineLoopInfoWrapperPass>();
648- AU.addRequired <MachinePostDominatorTreeWrapperPass>();
649- AU.addUsedIfAvailable <AAResultsWrapperPass>();
650- AU.addPreserved <AAResultsWrapperPass>();
651- MachineFunctionPass::getAnalysisUsage (AU);
652- }
640+ bool run (MachineFunction &MF);
653641
654642 bool isForceEmitWaitcnt () const {
655643 for (auto T : inst_counter_types ())
@@ -733,6 +721,36 @@ class SIInsertWaitcnts : public MachineFunctionPass {
733721 WaitcntBrackets &ScoreBrackets);
734722};
735723
724+ class SIInsertWaitcntsLegacy : public MachineFunctionPass {
725+ public:
726+ static char ID;
727+ SIInsertWaitcntsLegacy () : MachineFunctionPass(ID) {}
728+
729+ bool runOnMachineFunction (MachineFunction &MF) override {
730+ auto *MLI = &getAnalysis<MachineLoopInfoWrapperPass>().getLI ();
731+ auto *PDT =
732+ &getAnalysis<MachinePostDominatorTreeWrapperPass>().getPostDomTree ();
733+ AliasAnalysis *AA = nullptr ;
734+ if (auto *AAR = getAnalysisIfAvailable<AAResultsWrapperPass>())
735+ AA = &AAR->getAAResults ();
736+
737+ return SIInsertWaitcnts (MLI, PDT, AA).run (MF);
738+ }
739+
740+ StringRef getPassName () const override {
741+ return " SI insert wait instructions" ;
742+ }
743+
744+ void getAnalysisUsage (AnalysisUsage &AU) const override {
745+ AU.setPreservesCFG ();
746+ AU.addRequired <MachineLoopInfoWrapperPass>();
747+ AU.addRequired <MachinePostDominatorTreeWrapperPass>();
748+ AU.addUsedIfAvailable <AAResultsWrapperPass>();
749+ AU.addPreserved <AAResultsWrapperPass>();
750+ MachineFunctionPass::getAnalysisUsage (AU);
751+ }
752+ };
753+
736754} // end anonymous namespace
737755
738756RegInterval WaitcntBrackets::getRegInterval (const MachineInstr *MI,
@@ -1112,19 +1130,19 @@ bool WaitcntBrackets::counterOutOfOrder(InstCounterType T) const {
11121130 return hasMixedPendingEvents (T);
11131131}
11141132
1115- INITIALIZE_PASS_BEGIN (SIInsertWaitcnts , DEBUG_TYPE, " SI Insert Waitcnts" , false ,
1116- false )
1133+ INITIALIZE_PASS_BEGIN (SIInsertWaitcntsLegacy , DEBUG_TYPE, " SI Insert Waitcnts" ,
1134+ false , false )
11171135INITIALIZE_PASS_DEPENDENCY(MachineLoopInfoWrapperPass)
11181136INITIALIZE_PASS_DEPENDENCY(MachinePostDominatorTreeWrapperPass)
1119- INITIALIZE_PASS_END(SIInsertWaitcnts , DEBUG_TYPE, " SI Insert Waitcnts" , false ,
1120- false )
1137+ INITIALIZE_PASS_END(SIInsertWaitcntsLegacy , DEBUG_TYPE, " SI Insert Waitcnts" ,
1138+ false , false )
11211139
1122- char SIInsertWaitcnts ::ID = 0;
1140+ char SIInsertWaitcntsLegacy ::ID = 0;
11231141
1124- char &llvm::SIInsertWaitcntsID = SIInsertWaitcnts ::ID;
1142+ char &llvm::SIInsertWaitcntsID = SIInsertWaitcntsLegacy ::ID;
11251143
11261144FunctionPass *llvm::createSIInsertWaitcntsPass () {
1127- return new SIInsertWaitcnts ();
1145+ return new SIInsertWaitcntsLegacy ();
11281146}
11291147
11301148static bool updateOperandIfDifferent (MachineInstr &MI, AMDGPU::OpName OpName,
@@ -2393,16 +2411,29 @@ bool SIInsertWaitcnts::shouldFlushVmCnt(MachineLoop *ML,
23932411 return HasVMemLoad && UsesVgprLoadedOutside && ST->hasVmemWriteVgprInOrder ();
23942412}
23952413
2396- bool SIInsertWaitcnts::runOnMachineFunction (MachineFunction &MF) {
2414+ PreservedAnalyses
2415+ SIInsertWaitcntsPass::run (MachineFunction &MF,
2416+ MachineFunctionAnalysisManager &MFAM) {
2417+ auto *MLI = &MFAM.getResult <MachineLoopAnalysis>(MF);
2418+ auto *PDT = &MFAM.getResult <MachinePostDominatorTreeAnalysis>(MF);
2419+ auto *AA = MFAM.getResult <FunctionAnalysisManagerMachineFunctionProxy>(MF)
2420+ .getManager ()
2421+ .getCachedResult <AAManager>(MF.getFunction ());
2422+
2423+ if (!SIInsertWaitcnts (MLI, PDT, AA).run (MF))
2424+ return PreservedAnalyses::all ();
2425+
2426+ return getMachineFunctionPassPreservedAnalyses ()
2427+ .preserveSet <CFGAnalyses>()
2428+ .preserve <AAManager>();
2429+ }
2430+
2431+ bool SIInsertWaitcnts::run (MachineFunction &MF) {
23972432 ST = &MF.getSubtarget <GCNSubtarget>();
23982433 TII = ST->getInstrInfo ();
23992434 TRI = &TII->getRegisterInfo ();
24002435 MRI = &MF.getRegInfo ();
24012436 const SIMachineFunctionInfo *MFI = MF.getInfo <SIMachineFunctionInfo>();
2402- MLI = &getAnalysis<MachineLoopInfoWrapperPass>().getLI ();
2403- PDT = &getAnalysis<MachinePostDominatorTreeWrapperPass>().getPostDomTree ();
2404- if (auto *AAR = getAnalysisIfAvailable<AAResultsWrapperPass>())
2405- AA = &AAR->getAAResults ();
24062437
24072438 AMDGPU::IsaVersion IV = AMDGPU::getIsaVersion (ST->getCPU ());
24082439
0 commit comments