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"
@@ -597,7 +598,7 @@ class WaitcntGeneratorGFX12Plus : public WaitcntGenerator {
597598 AMDGPU::Waitcnt getAllZeroWaitcnt (bool IncludeVSCnt) const override ;
598599};
599600
600- class SIInsertWaitcnts : public MachineFunctionPass {
601+ class SIInsertWaitcnts {
601602private:
602603 const GCNSubtarget *ST = nullptr ;
603604 const SIInstrInfo *TII = nullptr ;
@@ -636,9 +637,9 @@ class SIInsertWaitcnts : public MachineFunctionPass {
636637 InstCounterType MaxCounter = NUM_NORMAL_INST_CNTS;
637638
638639public:
639- static char ID;
640-
641- SIInsertWaitcnts () : MachineFunctionPass(ID ) {
640+ SIInsertWaitcnts (MachineLoopInfo *MLI, MachinePostDominatorTree *PDT,
641+ AliasAnalysis *AA)
642+ : MLI(MLI), PDT(PDT), AA(AA ) {
642643 (void )ForceExpCounter;
643644 (void )ForceLgkmCounter;
644645 (void )ForceVMCounter;
@@ -648,20 +649,7 @@ class SIInsertWaitcnts : public MachineFunctionPass {
648649 bool isPreheaderToFlush (MachineBasicBlock &MBB,
649650 WaitcntBrackets &ScoreBrackets);
650651 bool isVMEMOrFlatVMEM (const MachineInstr &MI) const ;
651- bool runOnMachineFunction (MachineFunction &MF) override ;
652-
653- StringRef getPassName () const override {
654- return " SI insert wait instructions" ;
655- }
656-
657- void getAnalysisUsage (AnalysisUsage &AU) const override {
658- AU.setPreservesCFG ();
659- AU.addRequired <MachineLoopInfoWrapperPass>();
660- AU.addRequired <MachinePostDominatorTreeWrapperPass>();
661- AU.addUsedIfAvailable <AAResultsWrapperPass>();
662- AU.addPreserved <AAResultsWrapperPass>();
663- MachineFunctionPass::getAnalysisUsage (AU);
664- }
652+ bool run (MachineFunction &MF);
665653
666654 bool isForceEmitWaitcnt () const {
667655 for (auto T : inst_counter_types ())
@@ -749,6 +737,36 @@ class SIInsertWaitcnts : public MachineFunctionPass {
749737 WaitcntBrackets &ScoreBrackets);
750738};
751739
740+ class SIInsertWaitcntsLegacy : public MachineFunctionPass {
741+ public:
742+ static char ID;
743+ SIInsertWaitcntsLegacy () : MachineFunctionPass(ID) {}
744+
745+ bool runOnMachineFunction (MachineFunction &MF) override {
746+ auto *MLI = &getAnalysis<MachineLoopInfoWrapperPass>().getLI ();
747+ auto *PDT =
748+ &getAnalysis<MachinePostDominatorTreeWrapperPass>().getPostDomTree ();
749+ AliasAnalysis *AA = nullptr ;
750+ if (auto *AAR = getAnalysisIfAvailable<AAResultsWrapperPass>())
751+ AA = &AAR->getAAResults ();
752+
753+ return SIInsertWaitcnts (MLI, PDT, AA).run (MF);
754+ }
755+
756+ StringRef getPassName () const override {
757+ return " SI insert wait instructions" ;
758+ }
759+
760+ void getAnalysisUsage (AnalysisUsage &AU) const override {
761+ AU.setPreservesCFG ();
762+ AU.addRequired <MachineLoopInfoWrapperPass>();
763+ AU.addRequired <MachinePostDominatorTreeWrapperPass>();
764+ AU.addUsedIfAvailable <AAResultsWrapperPass>();
765+ AU.addPreserved <AAResultsWrapperPass>();
766+ MachineFunctionPass::getAnalysisUsage (AU);
767+ }
768+ };
769+
752770} // end anonymous namespace
753771
754772RegInterval WaitcntBrackets::getRegInterval (const MachineInstr *MI,
@@ -1133,19 +1151,19 @@ bool WaitcntBrackets::counterOutOfOrder(InstCounterType T) const {
11331151 return hasMixedPendingEvents (T);
11341152}
11351153
1136- INITIALIZE_PASS_BEGIN (SIInsertWaitcnts , DEBUG_TYPE, " SI Insert Waitcnts" , false ,
1137- false )
1154+ INITIALIZE_PASS_BEGIN (SIInsertWaitcntsLegacy , DEBUG_TYPE, " SI Insert Waitcnts" ,
1155+ false , false )
11381156INITIALIZE_PASS_DEPENDENCY(MachineLoopInfoWrapperPass)
11391157INITIALIZE_PASS_DEPENDENCY(MachinePostDominatorTreeWrapperPass)
1140- INITIALIZE_PASS_END(SIInsertWaitcnts , DEBUG_TYPE, " SI Insert Waitcnts" , false ,
1141- false )
1158+ INITIALIZE_PASS_END(SIInsertWaitcntsLegacy , DEBUG_TYPE, " SI Insert Waitcnts" ,
1159+ false , false )
11421160
1143- char SIInsertWaitcnts ::ID = 0;
1161+ char SIInsertWaitcntsLegacy ::ID = 0;
11441162
1145- char &llvm::SIInsertWaitcntsID = SIInsertWaitcnts ::ID;
1163+ char &llvm::SIInsertWaitcntsID = SIInsertWaitcntsLegacy ::ID;
11461164
11471165FunctionPass *llvm::createSIInsertWaitcntsPass () {
1148- return new SIInsertWaitcnts ();
1166+ return new SIInsertWaitcntsLegacy ();
11491167}
11501168
11511169static bool updateOperandIfDifferent (MachineInstr &MI, AMDGPU::OpName OpName,
@@ -2481,16 +2499,29 @@ bool SIInsertWaitcnts::shouldFlushVmCnt(MachineLoop *ML,
24812499 return HasVMemLoad && UsesVgprLoadedOutside && ST->hasVmemWriteVgprInOrder ();
24822500}
24832501
2484- bool SIInsertWaitcnts::runOnMachineFunction (MachineFunction &MF) {
2502+ PreservedAnalyses
2503+ SIInsertWaitcntsPass::run (MachineFunction &MF,
2504+ MachineFunctionAnalysisManager &MFAM) {
2505+ auto *MLI = &MFAM.getResult <MachineLoopAnalysis>(MF);
2506+ auto *PDT = &MFAM.getResult <MachinePostDominatorTreeAnalysis>(MF);
2507+ auto *AA = MFAM.getResult <FunctionAnalysisManagerMachineFunctionProxy>(MF)
2508+ .getManager ()
2509+ .getCachedResult <AAManager>(MF.getFunction ());
2510+
2511+ if (!SIInsertWaitcnts (MLI, PDT, AA).run (MF))
2512+ return PreservedAnalyses::all ();
2513+
2514+ return getMachineFunctionPassPreservedAnalyses ()
2515+ .preserveSet <CFGAnalyses>()
2516+ .preserve <AAManager>();
2517+ }
2518+
2519+ bool SIInsertWaitcnts::run (MachineFunction &MF) {
24852520 ST = &MF.getSubtarget <GCNSubtarget>();
24862521 TII = ST->getInstrInfo ();
24872522 TRI = &TII->getRegisterInfo ();
24882523 MRI = &MF.getRegInfo ();
24892524 const SIMachineFunctionInfo *MFI = MF.getInfo <SIMachineFunctionInfo>();
2490- MLI = &getAnalysis<MachineLoopInfoWrapperPass>().getLI ();
2491- PDT = &getAnalysis<MachinePostDominatorTreeWrapperPass>().getPostDomTree ();
2492- if (auto *AAR = getAnalysisIfAvailable<AAResultsWrapperPass>())
2493- AA = &AAR->getAAResults ();
24942525
24952526 AMDGPU::IsaVersion IV = AMDGPU::getIsaVersion (ST->getCPU ());
24962527
0 commit comments