33
33
#include " llvm/ADT/Sequence.h"
34
34
#include " llvm/Analysis/AliasAnalysis.h"
35
35
#include " llvm/CodeGen/MachineLoopInfo.h"
36
+ #include " llvm/CodeGen/MachinePassManager.h"
36
37
#include " llvm/CodeGen/MachinePostDominators.h"
37
38
#include " llvm/Support/DebugCounter.h"
38
39
#include " llvm/TargetParser/TargetParser.h"
@@ -597,7 +598,7 @@ class WaitcntGeneratorGFX12Plus : public WaitcntGenerator {
597
598
AMDGPU::Waitcnt getAllZeroWaitcnt (bool IncludeVSCnt) const override ;
598
599
};
599
600
600
- class SIInsertWaitcnts : public MachineFunctionPass {
601
+ class SIInsertWaitcnts {
601
602
private:
602
603
const GCNSubtarget *ST = nullptr ;
603
604
const SIInstrInfo *TII = nullptr ;
@@ -636,9 +637,9 @@ class SIInsertWaitcnts : public MachineFunctionPass {
636
637
InstCounterType MaxCounter = NUM_NORMAL_INST_CNTS;
637
638
638
639
public:
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 ) {
642
643
(void )ForceExpCounter;
643
644
(void )ForceLgkmCounter;
644
645
(void )ForceVMCounter;
@@ -648,20 +649,7 @@ class SIInsertWaitcnts : public MachineFunctionPass {
648
649
bool isPreheaderToFlush (MachineBasicBlock &MBB,
649
650
WaitcntBrackets &ScoreBrackets);
650
651
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);
665
653
666
654
bool isForceEmitWaitcnt () const {
667
655
for (auto T : inst_counter_types ())
@@ -749,6 +737,36 @@ class SIInsertWaitcnts : public MachineFunctionPass {
749
737
WaitcntBrackets &ScoreBrackets);
750
738
};
751
739
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
+
752
770
} // end anonymous namespace
753
771
754
772
RegInterval WaitcntBrackets::getRegInterval (const MachineInstr *MI,
@@ -1133,19 +1151,19 @@ bool WaitcntBrackets::counterOutOfOrder(InstCounterType T) const {
1133
1151
return hasMixedPendingEvents (T);
1134
1152
}
1135
1153
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 )
1138
1156
INITIALIZE_PASS_DEPENDENCY(MachineLoopInfoWrapperPass)
1139
1157
INITIALIZE_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 )
1142
1160
1143
- char SIInsertWaitcnts ::ID = 0;
1161
+ char SIInsertWaitcntsLegacy ::ID = 0;
1144
1162
1145
- char &llvm::SIInsertWaitcntsID = SIInsertWaitcnts ::ID;
1163
+ char &llvm::SIInsertWaitcntsID = SIInsertWaitcntsLegacy ::ID;
1146
1164
1147
1165
FunctionPass *llvm::createSIInsertWaitcntsPass () {
1148
- return new SIInsertWaitcnts ();
1166
+ return new SIInsertWaitcntsLegacy ();
1149
1167
}
1150
1168
1151
1169
static bool updateOperandIfDifferent (MachineInstr &MI, AMDGPU::OpName OpName,
@@ -2481,16 +2499,29 @@ bool SIInsertWaitcnts::shouldFlushVmCnt(MachineLoop *ML,
2481
2499
return HasVMemLoad && UsesVgprLoadedOutside && ST->hasVmemWriteVgprInOrder ();
2482
2500
}
2483
2501
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) {
2485
2520
ST = &MF.getSubtarget <GCNSubtarget>();
2486
2521
TII = ST->getInstrInfo ();
2487
2522
TRI = &TII->getRegisterInfo ();
2488
2523
MRI = &MF.getRegInfo ();
2489
2524
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 ();
2494
2525
2495
2526
AMDGPU::IsaVersion IV = AMDGPU::getIsaVersion (ST->getCPU ());
2496
2527
0 commit comments