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"
@@ -594,7 +595,7 @@ class WaitcntGeneratorGFX12Plus : public WaitcntGenerator {
594
595
AMDGPU::Waitcnt getAllZeroWaitcnt (bool IncludeVSCnt) const override ;
595
596
};
596
597
597
- class SIInsertWaitcnts : public MachineFunctionPass {
598
+ class SIInsertWaitcnts {
598
599
private:
599
600
const GCNSubtarget *ST = nullptr ;
600
601
const SIInstrInfo *TII = nullptr ;
@@ -633,9 +634,9 @@ class SIInsertWaitcnts : public MachineFunctionPass {
633
634
InstCounterType MaxCounter = NUM_NORMAL_INST_CNTS;
634
635
635
636
public:
636
- static char ID;
637
-
638
- SIInsertWaitcnts () : MachineFunctionPass(ID ) {
637
+ SIInsertWaitcnts (MachineLoopInfo *MLI, MachinePostDominatorTree *PDT,
638
+ AliasAnalysis *AA)
639
+ : MLI(MLI), PDT(PDT), AA(AA ) {
639
640
(void )ForceExpCounter;
640
641
(void )ForceLgkmCounter;
641
642
(void )ForceVMCounter;
@@ -645,20 +646,7 @@ class SIInsertWaitcnts : public MachineFunctionPass {
645
646
bool isPreheaderToFlush (MachineBasicBlock &MBB,
646
647
WaitcntBrackets &ScoreBrackets);
647
648
bool isVMEMOrFlatVMEM (const MachineInstr &MI) const ;
648
- bool runOnMachineFunction (MachineFunction &MF) override ;
649
-
650
- StringRef getPassName () const override {
651
- return " SI insert wait instructions" ;
652
- }
653
-
654
- void getAnalysisUsage (AnalysisUsage &AU) const override {
655
- AU.setPreservesCFG ();
656
- AU.addRequired <MachineLoopInfoWrapperPass>();
657
- AU.addRequired <MachinePostDominatorTreeWrapperPass>();
658
- AU.addUsedIfAvailable <AAResultsWrapperPass>();
659
- AU.addPreserved <AAResultsWrapperPass>();
660
- MachineFunctionPass::getAnalysisUsage (AU);
661
- }
649
+ bool run (MachineFunction &MF);
662
650
663
651
bool isForceEmitWaitcnt () const {
664
652
for (auto T : inst_counter_types ())
@@ -742,6 +730,36 @@ class SIInsertWaitcnts : public MachineFunctionPass {
742
730
WaitcntBrackets &ScoreBrackets);
743
731
};
744
732
733
+ class SIInsertWaitcntsLegacy : public MachineFunctionPass {
734
+ public:
735
+ static char ID;
736
+ SIInsertWaitcntsLegacy () : MachineFunctionPass(ID) {}
737
+
738
+ bool runOnMachineFunction (MachineFunction &MF) override {
739
+ auto *MLI = &getAnalysis<MachineLoopInfoWrapperPass>().getLI ();
740
+ auto *PDT =
741
+ &getAnalysis<MachinePostDominatorTreeWrapperPass>().getPostDomTree ();
742
+ AliasAnalysis *AA = nullptr ;
743
+ if (auto *AAR = getAnalysisIfAvailable<AAResultsWrapperPass>())
744
+ AA = &AAR->getAAResults ();
745
+
746
+ return SIInsertWaitcnts (MLI, PDT, AA).run (MF);
747
+ }
748
+
749
+ StringRef getPassName () const override {
750
+ return " SI insert wait instructions" ;
751
+ }
752
+
753
+ void getAnalysisUsage (AnalysisUsage &AU) const override {
754
+ AU.setPreservesCFG ();
755
+ AU.addRequired <MachineLoopInfoWrapperPass>();
756
+ AU.addRequired <MachinePostDominatorTreeWrapperPass>();
757
+ AU.addUsedIfAvailable <AAResultsWrapperPass>();
758
+ AU.addPreserved <AAResultsWrapperPass>();
759
+ MachineFunctionPass::getAnalysisUsage (AU);
760
+ }
761
+ };
762
+
745
763
} // end anonymous namespace
746
764
747
765
RegInterval WaitcntBrackets::getRegInterval (const MachineInstr *MI,
@@ -1124,19 +1142,19 @@ bool WaitcntBrackets::counterOutOfOrder(InstCounterType T) const {
1124
1142
return hasMixedPendingEvents (T);
1125
1143
}
1126
1144
1127
- INITIALIZE_PASS_BEGIN (SIInsertWaitcnts , DEBUG_TYPE, " SI Insert Waitcnts" , false ,
1128
- false )
1145
+ INITIALIZE_PASS_BEGIN (SIInsertWaitcntsLegacy , DEBUG_TYPE, " SI Insert Waitcnts" ,
1146
+ false , false )
1129
1147
INITIALIZE_PASS_DEPENDENCY(MachineLoopInfoWrapperPass)
1130
1148
INITIALIZE_PASS_DEPENDENCY(MachinePostDominatorTreeWrapperPass)
1131
- INITIALIZE_PASS_END(SIInsertWaitcnts , DEBUG_TYPE, " SI Insert Waitcnts" , false ,
1132
- false )
1149
+ INITIALIZE_PASS_END(SIInsertWaitcntsLegacy , DEBUG_TYPE, " SI Insert Waitcnts" ,
1150
+ false , false )
1133
1151
1134
- char SIInsertWaitcnts ::ID = 0;
1152
+ char SIInsertWaitcntsLegacy ::ID = 0;
1135
1153
1136
- char &llvm::SIInsertWaitcntsID = SIInsertWaitcnts ::ID;
1154
+ char &llvm::SIInsertWaitcntsID = SIInsertWaitcntsLegacy ::ID;
1137
1155
1138
1156
FunctionPass *llvm::createSIInsertWaitcntsPass () {
1139
- return new SIInsertWaitcnts ();
1157
+ return new SIInsertWaitcntsLegacy ();
1140
1158
}
1141
1159
1142
1160
static bool updateOperandIfDifferent (MachineInstr &MI, AMDGPU::OpName OpName,
@@ -2406,16 +2424,29 @@ bool SIInsertWaitcnts::shouldFlushVmCnt(MachineLoop *ML,
2406
2424
return HasVMemLoad && UsesVgprLoadedOutside && ST->hasVmemWriteVgprInOrder ();
2407
2425
}
2408
2426
2409
- bool SIInsertWaitcnts::runOnMachineFunction (MachineFunction &MF) {
2427
+ PreservedAnalyses
2428
+ SIInsertWaitcntsPass::run (MachineFunction &MF,
2429
+ MachineFunctionAnalysisManager &MFAM) {
2430
+ auto *MLI = &MFAM.getResult <MachineLoopAnalysis>(MF);
2431
+ auto *PDT = &MFAM.getResult <MachinePostDominatorTreeAnalysis>(MF);
2432
+ auto *AA = MFAM.getResult <FunctionAnalysisManagerMachineFunctionProxy>(MF)
2433
+ .getManager ()
2434
+ .getCachedResult <AAManager>(MF.getFunction ());
2435
+
2436
+ if (!SIInsertWaitcnts (MLI, PDT, AA).run (MF))
2437
+ return PreservedAnalyses::all ();
2438
+
2439
+ return getMachineFunctionPassPreservedAnalyses ()
2440
+ .preserveSet <CFGAnalyses>()
2441
+ .preserve <AAManager>();
2442
+ }
2443
+
2444
+ bool SIInsertWaitcnts::run (MachineFunction &MF) {
2410
2445
ST = &MF.getSubtarget <GCNSubtarget>();
2411
2446
TII = ST->getInstrInfo ();
2412
2447
TRI = &TII->getRegisterInfo ();
2413
2448
MRI = &MF.getRegInfo ();
2414
2449
const SIMachineFunctionInfo *MFI = MF.getInfo <SIMachineFunctionInfo>();
2415
- MLI = &getAnalysis<MachineLoopInfoWrapperPass>().getLI ();
2416
- PDT = &getAnalysis<MachinePostDominatorTreeWrapperPass>().getPostDomTree ();
2417
- if (auto *AAR = getAnalysisIfAvailable<AAResultsWrapperPass>())
2418
- AA = &AAR->getAAResults ();
2419
2450
2420
2451
AMDGPU::IsaVersion IV = AMDGPU::getIsaVersion (ST->getCPU ());
2421
2452
0 commit comments