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"
@@ -585,7 +586,7 @@ class WaitcntGeneratorGFX12Plus : public WaitcntGenerator {
585
586
AMDGPU::Waitcnt getAllZeroWaitcnt (bool IncludeVSCnt) const override ;
586
587
};
587
588
588
- class SIInsertWaitcnts : public MachineFunctionPass {
589
+ class SIInsertWaitcnts {
589
590
private:
590
591
const GCNSubtarget *ST = nullptr ;
591
592
const SIInstrInfo *TII = nullptr ;
@@ -624,9 +625,9 @@ class SIInsertWaitcnts : public MachineFunctionPass {
624
625
InstCounterType MaxCounter = NUM_NORMAL_INST_CNTS;
625
626
626
627
public:
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 ) {
630
631
(void )ForceExpCounter;
631
632
(void )ForceLgkmCounter;
632
633
(void )ForceVMCounter;
@@ -636,20 +637,7 @@ class SIInsertWaitcnts : public MachineFunctionPass {
636
637
bool isPreheaderToFlush (MachineBasicBlock &MBB,
637
638
WaitcntBrackets &ScoreBrackets);
638
639
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);
653
641
654
642
bool isForceEmitWaitcnt () const {
655
643
for (auto T : inst_counter_types ())
@@ -733,6 +721,36 @@ class SIInsertWaitcnts : public MachineFunctionPass {
733
721
WaitcntBrackets &ScoreBrackets);
734
722
};
735
723
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
+
736
754
} // end anonymous namespace
737
755
738
756
RegInterval WaitcntBrackets::getRegInterval (const MachineInstr *MI,
@@ -1112,19 +1130,19 @@ bool WaitcntBrackets::counterOutOfOrder(InstCounterType T) const {
1112
1130
return hasMixedPendingEvents (T);
1113
1131
}
1114
1132
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 )
1117
1135
INITIALIZE_PASS_DEPENDENCY(MachineLoopInfoWrapperPass)
1118
1136
INITIALIZE_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 )
1121
1139
1122
- char SIInsertWaitcnts ::ID = 0;
1140
+ char SIInsertWaitcntsLegacy ::ID = 0;
1123
1141
1124
- char &llvm::SIInsertWaitcntsID = SIInsertWaitcnts ::ID;
1142
+ char &llvm::SIInsertWaitcntsID = SIInsertWaitcntsLegacy ::ID;
1125
1143
1126
1144
FunctionPass *llvm::createSIInsertWaitcntsPass () {
1127
- return new SIInsertWaitcnts ();
1145
+ return new SIInsertWaitcntsLegacy ();
1128
1146
}
1129
1147
1130
1148
static bool updateOperandIfDifferent (MachineInstr &MI, AMDGPU::OpName OpName,
@@ -2393,16 +2411,29 @@ bool SIInsertWaitcnts::shouldFlushVmCnt(MachineLoop *ML,
2393
2411
return HasVMemLoad && UsesVgprLoadedOutside && ST->hasVmemWriteVgprInOrder ();
2394
2412
}
2395
2413
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) {
2397
2432
ST = &MF.getSubtarget <GCNSubtarget>();
2398
2433
TII = ST->getInstrInfo ();
2399
2434
TRI = &TII->getRegisterInfo ();
2400
2435
MRI = &MF.getRegInfo ();
2401
2436
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 ();
2406
2437
2407
2438
AMDGPU::IsaVersion IV = AMDGPU::getIsaVersion (ST->getCPU ());
2408
2439
0 commit comments