15
15
//
16
16
// ===----------------------------------------------------------------------===//
17
17
18
+ #include " llvm/CodeGen/MachineSink.h"
18
19
#include " llvm/ADT/DenseSet.h"
19
20
#include " llvm/ADT/DepthFirstIterator.h"
20
21
#include " llvm/ADT/MapVector.h"
37
38
#include " llvm/CodeGen/MachineInstr.h"
38
39
#include " llvm/CodeGen/MachineLoopInfo.h"
39
40
#include " llvm/CodeGen/MachineOperand.h"
41
+ #include " llvm/CodeGen/MachinePassManager.h"
40
42
#include " llvm/CodeGen/MachinePostDominators.h"
41
43
#include " llvm/CodeGen/MachineRegisterInfo.h"
42
44
#include " llvm/CodeGen/MachineSizeOpts.h"
47
49
#include " llvm/CodeGen/TargetRegisterInfo.h"
48
50
#include " llvm/CodeGen/TargetSchedule.h"
49
51
#include " llvm/CodeGen/TargetSubtargetInfo.h"
52
+ #include " llvm/IR/Analysis.h"
50
53
#include " llvm/IR/BasicBlock.h"
51
54
#include " llvm/IR/DebugInfoMetadata.h"
52
55
#include " llvm/IR/LLVMContext.h"
@@ -118,7 +121,7 @@ using RegSubRegPair = TargetInstrInfo::RegSubRegPair;
118
121
119
122
namespace {
120
123
121
- class MachineSinking : public MachineFunctionPass {
124
+ class MachineSinking {
122
125
const TargetSubtargetInfo *STI = nullptr ;
123
126
const TargetInstrInfo *TII = nullptr ;
124
127
const TargetRegisterInfo *TRI = nullptr ;
@@ -132,6 +135,8 @@ class MachineSinking : public MachineFunctionPass {
132
135
AliasAnalysis *AA = nullptr ;
133
136
RegisterClassInfo RegClassInfo;
134
137
TargetSchedModel SchedModel;
138
+ Pass *LegacyPass;
139
+ MachineFunctionAnalysisManager *MFAM;
135
140
136
141
// Remember which edges have been considered for breaking.
137
142
SmallSet<std::pair<MachineBasicBlock *, MachineBasicBlock *>, 8 >
@@ -189,30 +194,14 @@ class MachineSinking : public MachineFunctionPass {
189
194
bool EnableSinkAndFold;
190
195
191
196
public:
192
- static char ID; // Pass identification
197
+ MachineSinking (Pass *LegacyPass, MachineFunctionAnalysisManager *MFAM,
198
+ bool EnableSinkAndFold)
199
+ : LegacyPass(LegacyPass), MFAM(MFAM),
200
+ EnableSinkAndFold (EnableSinkAndFold) {}
193
201
194
- MachineSinking () : MachineFunctionPass(ID) {
195
- initializeMachineSinkingPass (*PassRegistry::getPassRegistry ());
196
- }
197
-
198
- bool runOnMachineFunction (MachineFunction &MF) override ;
199
-
200
- void getAnalysisUsage (AnalysisUsage &AU) const override {
201
- MachineFunctionPass::getAnalysisUsage (AU);
202
- AU.addRequired <AAResultsWrapperPass>();
203
- AU.addRequired <MachineDominatorTreeWrapperPass>();
204
- AU.addRequired <MachinePostDominatorTreeWrapperPass>();
205
- AU.addRequired <MachineCycleInfoWrapperPass>();
206
- AU.addRequired <MachineBranchProbabilityInfoWrapperPass>();
207
- AU.addPreserved <MachineCycleInfoWrapperPass>();
208
- AU.addPreserved <MachineLoopInfoWrapperPass>();
209
- AU.addRequired <ProfileSummaryInfoWrapperPass>();
210
- if (UseBlockFreqInfo)
211
- AU.addRequired <MachineBlockFrequencyInfoWrapperPass>();
212
- AU.addRequired <TargetPassConfig>();
213
- }
202
+ bool run (MachineFunction &MF);
214
203
215
- void releaseMemory () override {
204
+ void releaseMemory () {
216
205
CEBCandidates.clear ();
217
206
CEMergeCandidates.clear ();
218
207
}
@@ -290,21 +279,47 @@ class MachineSinking : public MachineFunctionPass {
290
279
bool registerPressureExceedsLimit (const MachineBasicBlock &MBB);
291
280
};
292
281
282
+ class MachineSinkingLegacy : public MachineFunctionPass {
283
+ public:
284
+ static char ID;
285
+
286
+ MachineSinkingLegacy () : MachineFunctionPass(ID) {
287
+ initializeMachineSinkingLegacyPass (*PassRegistry::getPassRegistry ());
288
+ }
289
+
290
+ bool runOnMachineFunction (MachineFunction &MF) override ;
291
+
292
+ void getAnalysisUsage (AnalysisUsage &AU) const override {
293
+ MachineFunctionPass::getAnalysisUsage (AU);
294
+ AU.addRequired <AAResultsWrapperPass>();
295
+ AU.addRequired <MachineDominatorTreeWrapperPass>();
296
+ AU.addRequired <MachinePostDominatorTreeWrapperPass>();
297
+ AU.addRequired <MachineCycleInfoWrapperPass>();
298
+ AU.addRequired <MachineBranchProbabilityInfoWrapperPass>();
299
+ AU.addPreserved <MachineCycleInfoWrapperPass>();
300
+ AU.addPreserved <MachineLoopInfoWrapperPass>();
301
+ AU.addRequired <ProfileSummaryInfoWrapperPass>();
302
+ if (UseBlockFreqInfo)
303
+ AU.addRequired <MachineBlockFrequencyInfoWrapperPass>();
304
+ AU.addRequired <TargetPassConfig>();
305
+ }
306
+ };
307
+
293
308
} // end anonymous namespace
294
309
295
- char MachineSinking ::ID = 0 ;
310
+ char MachineSinkingLegacy ::ID = 0 ;
296
311
297
- char &llvm::MachineSinkingID = MachineSinking ::ID;
312
+ char &llvm::MachineSinkingLegacyID = MachineSinkingLegacy ::ID;
298
313
299
- INITIALIZE_PASS_BEGIN (MachineSinking , DEBUG_TYPE, " Machine code sinking" , false ,
314
+ INITIALIZE_PASS_BEGIN (MachineSinkingLegacy , DEBUG_TYPE, " Machine code sinking" , false ,
300
315
false )
301
316
INITIALIZE_PASS_DEPENDENCY(ProfileSummaryInfoWrapperPass)
302
317
INITIALIZE_PASS_DEPENDENCY(MachineBranchProbabilityInfoWrapperPass)
303
318
INITIALIZE_PASS_DEPENDENCY(MachineDominatorTreeWrapperPass)
304
319
INITIALIZE_PASS_DEPENDENCY(MachineCycleInfoWrapperPass)
305
320
INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass)
306
- INITIALIZE_PASS_END(MachineSinking , DEBUG_TYPE, " Machine code sinking" , false ,
307
- false )
321
+ INITIALIZE_PASS_END(MachineSinkingLegacy , DEBUG_TYPE, " Machine code sinking" ,
322
+ false , false )
308
323
309
324
// / Return true if a target defined block prologue instruction interferes
310
325
// / with a sink candidate.
@@ -728,28 +743,66 @@ void MachineSinking::FindCycleSinkCandidates(
728
743
}
729
744
}
730
745
731
- bool MachineSinking::runOnMachineFunction (MachineFunction &MF) {
746
+ PreservedAnalyses
747
+ MachineSinkingPass::run (MachineFunction &MF,
748
+ MachineFunctionAnalysisManager &MFAM) {
749
+ MachineSinking Impl (nullptr , &MFAM, EnableSinkAndFold);
750
+ bool Changed = Impl.run (MF);
751
+ if (!Changed)
752
+ return PreservedAnalyses::all ();
753
+ auto PA = getMachineFunctionPassPreservedAnalyses ();
754
+ PA.preserve <MachineCycleAnalysis>();
755
+ PA.preserve <MachineLoopAnalysis>();
756
+ return PA;
757
+ }
758
+
759
+ void MachineSinkingPass::printPipeline (
760
+ raw_ostream &OS, function_ref<StringRef(StringRef)> MapClassName2PassName) {
761
+ OS << " machine-sink" ;
762
+ if (EnableSinkAndFold)
763
+ OS << " <enable-sink-fold>" ;
764
+ }
765
+
766
+ bool MachineSinkingLegacy::runOnMachineFunction (MachineFunction &MF) {
732
767
if (skipFunction (MF.getFunction ()))
733
768
return false ;
734
769
770
+ TargetPassConfig *PassConfig = &getAnalysis<TargetPassConfig>();
771
+ bool EnableSinkAndFold = PassConfig->getEnableSinkAndFold ();
772
+
773
+ MachineSinking Impl (this , nullptr , EnableSinkAndFold);
774
+ return Impl.run (MF);
775
+ }
776
+
777
+ #define GET_ANALYSIS (ANALYSIS, INFIX, GETTER ) \
778
+ ((LegacyPass) \
779
+ ? &LegacyPass->getAnalysis<ANALYSIS##INFIX##WrapperPass>().GETTER() \
780
+ : &MFAM->getResult<ANALYSIS##Analysis>(MF))
781
+
782
+ bool MachineSinking::run (MachineFunction &MF) {
735
783
LLVM_DEBUG (dbgs () << " ******** Machine Sinking ********\n " );
736
784
737
785
STI = &MF.getSubtarget ();
738
786
TII = STI->getInstrInfo ();
739
787
TRI = STI->getRegisterInfo ();
740
788
MRI = &MF.getRegInfo ();
741
- DT = &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree ();
742
- PDT = &getAnalysis<MachinePostDominatorTreeWrapperPass>().getPostDomTree ();
743
- CI = &getAnalysis<MachineCycleInfoWrapperPass>().getCycleInfo ();
744
- PSI = &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI ();
745
- MBFI = UseBlockFreqInfo
746
- ? &getAnalysis<MachineBlockFrequencyInfoWrapperPass>().getMBFI ()
747
- : nullptr ;
748
- MBPI = &getAnalysis<MachineBranchProbabilityInfoWrapperPass>().getMBPI ();
749
- AA = &getAnalysis<AAResultsWrapperPass>().getAAResults ();
789
+ DT = GET_ANALYSIS (MachineDominatorTree, , getDomTree);
790
+ PDT = GET_ANALYSIS (MachinePostDominatorTree, , getPostDomTree);
791
+ CI = GET_ANALYSIS (MachineCycle, Info, getCycleInfo);
792
+ PSI = (LegacyPass)
793
+ ? &LegacyPass->getAnalysis <ProfileSummaryInfoWrapperPass>().getPSI ()
794
+ : MFAM->getResult <ModuleAnalysisManagerMachineFunctionProxy>(MF)
795
+ .getCachedResult <ProfileSummaryAnalysis>(*MF.getFunction ().getParent ());
796
+ MBFI = UseBlockFreqInfo ? GET_ANALYSIS (MachineBlockFrequency, Info, getMBFI)
797
+ : nullptr ;
798
+ MBPI = GET_ANALYSIS (MachineBranchProbability, Info, getMBPI);
799
+ AA = (LegacyPass)
800
+ ? &LegacyPass->getAnalysis <AAResultsWrapperPass>().getAAResults ()
801
+ : &MFAM->getResult <FunctionAnalysisManagerMachineFunctionProxy>(MF)
802
+ .getManager ()
803
+ .getResult <AAManager>(MF.getFunction ());
804
+
750
805
RegClassInfo.runOnMachineFunction (MF);
751
- TargetPassConfig *PassConfig = &getAnalysis<TargetPassConfig>();
752
- EnableSinkAndFold = PassConfig->getEnableSinkAndFold ();
753
806
754
807
bool EverMadeChange = false ;
755
808
@@ -768,7 +821,7 @@ bool MachineSinking::runOnMachineFunction(MachineFunction &MF) {
768
821
MachineDomTreeUpdater::UpdateStrategy::Lazy);
769
822
for (const auto &Pair : ToSplit) {
770
823
auto NewSucc =
771
- Pair.first ->SplitCriticalEdge (Pair.second , * this , nullptr , &MDTU);
824
+ Pair.first ->SplitCriticalEdge (Pair.second , LegacyPass, MFAM , nullptr , &MDTU);
772
825
if (NewSucc != nullptr ) {
773
826
LLVM_DEBUG (dbgs () << " *** Splitting critical edge: "
774
827
<< printMBBReference (*Pair.first ) << " -- "
@@ -858,6 +911,7 @@ bool MachineSinking::runOnMachineFunction(MachineFunction &MF) {
858
911
MRI->clearKillFlags (I);
859
912
RegsToClearKillFlags.clear ();
860
913
914
+ releaseMemory ();
861
915
return EverMadeChange;
862
916
}
863
917
0 commit comments