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"
36
37
#include " llvm/CodeGen/MachineInstr.h"
37
38
#include " llvm/CodeGen/MachineLoopInfo.h"
38
39
#include " llvm/CodeGen/MachineOperand.h"
40
+ #include " llvm/CodeGen/MachinePassManager.h"
39
41
#include " llvm/CodeGen/MachinePostDominators.h"
40
42
#include " llvm/CodeGen/MachineRegisterInfo.h"
41
43
#include " llvm/CodeGen/MachineSizeOpts.h"
45
47
#include " llvm/CodeGen/TargetPassConfig.h"
46
48
#include " llvm/CodeGen/TargetRegisterInfo.h"
47
49
#include " llvm/CodeGen/TargetSubtargetInfo.h"
50
+ #include " llvm/IR/Analysis.h"
48
51
#include " llvm/IR/BasicBlock.h"
49
52
#include " llvm/IR/DebugInfoMetadata.h"
50
53
#include " llvm/IR/LLVMContext.h"
@@ -114,7 +117,7 @@ STATISTIC(NumPostRACopySink, "Number of copies sunk after RA");
114
117
115
118
namespace {
116
119
117
- class MachineSinking : public MachineFunctionPass {
120
+ class MachineSinking {
118
121
const TargetSubtargetInfo *STI = nullptr ;
119
122
const TargetInstrInfo *TII = nullptr ;
120
123
const TargetRegisterInfo *TRI = nullptr ;
@@ -127,6 +130,8 @@ class MachineSinking : public MachineFunctionPass {
127
130
const MachineBranchProbabilityInfo *MBPI = nullptr ;
128
131
AliasAnalysis *AA = nullptr ;
129
132
RegisterClassInfo RegClassInfo;
133
+ Pass *LegacyPass;
134
+ MachineFunctionAnalysisManager *MFAM;
130
135
131
136
// Remember which edges have been considered for breaking.
132
137
SmallSet<std::pair<MachineBasicBlock *, MachineBasicBlock *>, 8 >
@@ -182,30 +187,14 @@ class MachineSinking : public MachineFunctionPass {
182
187
bool EnableSinkAndFold;
183
188
184
189
public:
185
- static char ID; // Pass identification
190
+ MachineSinking (Pass *LegacyPass, MachineFunctionAnalysisManager *MFAM,
191
+ bool EnableSinkAndFold)
192
+ : LegacyPass(LegacyPass), MFAM(MFAM),
193
+ EnableSinkAndFold (EnableSinkAndFold) {}
186
194
187
- MachineSinking () : MachineFunctionPass(ID) {
188
- initializeMachineSinkingPass (*PassRegistry::getPassRegistry ());
189
- }
190
-
191
- bool runOnMachineFunction (MachineFunction &MF) override ;
192
-
193
- void getAnalysisUsage (AnalysisUsage &AU) const override {
194
- MachineFunctionPass::getAnalysisUsage (AU);
195
- AU.addRequired <AAResultsWrapperPass>();
196
- AU.addRequired <MachineDominatorTreeWrapperPass>();
197
- AU.addRequired <MachinePostDominatorTreeWrapperPass>();
198
- AU.addRequired <MachineCycleInfoWrapperPass>();
199
- AU.addRequired <MachineBranchProbabilityInfoWrapperPass>();
200
- AU.addPreserved <MachineCycleInfoWrapperPass>();
201
- AU.addPreserved <MachineLoopInfoWrapperPass>();
202
- AU.addRequired <ProfileSummaryInfoWrapperPass>();
203
- if (UseBlockFreqInfo)
204
- AU.addRequired <MachineBlockFrequencyInfoWrapperPass>();
205
- AU.addRequired <TargetPassConfig>();
206
- }
195
+ bool run (MachineFunction &MF);
207
196
208
- void releaseMemory () override {
197
+ void releaseMemory () {
209
198
CEBCandidates.clear ();
210
199
CEMergeCandidates.clear ();
211
200
}
@@ -277,21 +266,47 @@ class MachineSinking : public MachineFunctionPass {
277
266
const MachineBasicBlock &MBB);
278
267
};
279
268
269
+ class MachineSinkingLegacy : public MachineFunctionPass {
270
+ public:
271
+ static char ID;
272
+
273
+ MachineSinkingLegacy () : MachineFunctionPass(ID) {
274
+ initializeMachineSinkingLegacyPass (*PassRegistry::getPassRegistry ());
275
+ }
276
+
277
+ bool runOnMachineFunction (MachineFunction &MF) override ;
278
+
279
+ void getAnalysisUsage (AnalysisUsage &AU) const override {
280
+ MachineFunctionPass::getAnalysisUsage (AU);
281
+ AU.addRequired <AAResultsWrapperPass>();
282
+ AU.addRequired <MachineDominatorTreeWrapperPass>();
283
+ AU.addRequired <MachinePostDominatorTreeWrapperPass>();
284
+ AU.addRequired <MachineCycleInfoWrapperPass>();
285
+ AU.addRequired <MachineBranchProbabilityInfoWrapperPass>();
286
+ AU.addPreserved <MachineCycleInfoWrapperPass>();
287
+ AU.addPreserved <MachineLoopInfoWrapperPass>();
288
+ AU.addRequired <ProfileSummaryInfoWrapperPass>();
289
+ if (UseBlockFreqInfo)
290
+ AU.addRequired <MachineBlockFrequencyInfoWrapperPass>();
291
+ AU.addRequired <TargetPassConfig>();
292
+ }
293
+ };
294
+
280
295
} // end anonymous namespace
281
296
282
- char MachineSinking ::ID = 0 ;
297
+ char MachineSinkingLegacy ::ID = 0 ;
283
298
284
- char &llvm::MachineSinkingID = MachineSinking ::ID;
299
+ char &llvm::MachineSinkingLegacyID = MachineSinkingLegacy ::ID;
285
300
286
- INITIALIZE_PASS_BEGIN (MachineSinking , DEBUG_TYPE, " Machine code sinking" , false ,
301
+ INITIALIZE_PASS_BEGIN (MachineSinkingLegacy , DEBUG_TYPE, " Machine code sinking" , false ,
287
302
false )
288
303
INITIALIZE_PASS_DEPENDENCY(ProfileSummaryInfoWrapperPass)
289
304
INITIALIZE_PASS_DEPENDENCY(MachineBranchProbabilityInfoWrapperPass)
290
305
INITIALIZE_PASS_DEPENDENCY(MachineDominatorTreeWrapperPass)
291
306
INITIALIZE_PASS_DEPENDENCY(MachineCycleInfoWrapperPass)
292
307
INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass)
293
- INITIALIZE_PASS_END(MachineSinking , DEBUG_TYPE, " Machine code sinking" , false ,
294
- false )
308
+ INITIALIZE_PASS_END(MachineSinkingLegacy , DEBUG_TYPE, " Machine code sinking" ,
309
+ false , false )
295
310
296
311
// / Return true if a target defined block prologue instruction interferes
297
312
// / with a sink candidate.
@@ -711,28 +726,66 @@ void MachineSinking::FindCycleSinkCandidates(
711
726
}
712
727
}
713
728
714
- bool MachineSinking::runOnMachineFunction (MachineFunction &MF) {
729
+ PreservedAnalyses
730
+ MachineSinkingPass::run (MachineFunction &MF,
731
+ MachineFunctionAnalysisManager &MFAM) {
732
+ MachineSinking Impl (nullptr , &MFAM, EnableSinkAndFold);
733
+ bool Changed = Impl.run (MF);
734
+ if (!Changed)
735
+ return PreservedAnalyses::all ();
736
+ auto PA = getMachineFunctionPassPreservedAnalyses ();
737
+ PA.preserve <MachineCycleAnalysis>();
738
+ PA.preserve <MachineLoopAnalysis>();
739
+ return PA;
740
+ }
741
+
742
+ void MachineSinkingPass::printPipeline (
743
+ raw_ostream &OS, function_ref<StringRef(StringRef)> MapClassName2PassName) {
744
+ OS << " machine-sink" ;
745
+ if (EnableSinkAndFold)
746
+ OS << " <enable-sink-fold>" ;
747
+ }
748
+
749
+ bool MachineSinkingLegacy::runOnMachineFunction (MachineFunction &MF) {
715
750
if (skipFunction (MF.getFunction ()))
716
751
return false ;
717
752
753
+ TargetPassConfig *PassConfig = &getAnalysis<TargetPassConfig>();
754
+ bool EnableSinkAndFold = PassConfig->getEnableSinkAndFold ();
755
+
756
+ MachineSinking Impl (this , nullptr , EnableSinkAndFold);
757
+ return Impl.run (MF);
758
+ }
759
+
760
+ #define GET_ANALYSIS (ANALYSIS, INFIX, GETTER ) \
761
+ ((LegacyPass) \
762
+ ? &LegacyPass->getAnalysis<ANALYSIS##INFIX##WrapperPass>().GETTER() \
763
+ : &MFAM->getResult<ANALYSIS##Analysis>(MF))
764
+
765
+ bool MachineSinking::run (MachineFunction &MF) {
718
766
LLVM_DEBUG (dbgs () << " ******** Machine Sinking ********\n " );
719
767
720
768
STI = &MF.getSubtarget ();
721
769
TII = STI->getInstrInfo ();
722
770
TRI = STI->getRegisterInfo ();
723
771
MRI = &MF.getRegInfo ();
724
- DT = &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree ();
725
- PDT = &getAnalysis<MachinePostDominatorTreeWrapperPass>().getPostDomTree ();
726
- CI = &getAnalysis<MachineCycleInfoWrapperPass>().getCycleInfo ();
727
- PSI = &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI ();
728
- MBFI = UseBlockFreqInfo
729
- ? &getAnalysis<MachineBlockFrequencyInfoWrapperPass>().getMBFI ()
730
- : nullptr ;
731
- MBPI = &getAnalysis<MachineBranchProbabilityInfoWrapperPass>().getMBPI ();
732
- AA = &getAnalysis<AAResultsWrapperPass>().getAAResults ();
772
+ DT = GET_ANALYSIS (MachineDominatorTree, , getDomTree);
773
+ PDT = GET_ANALYSIS (MachinePostDominatorTree, , getPostDomTree);
774
+ CI = GET_ANALYSIS (MachineCycle, Info, getCycleInfo);
775
+ PSI = (LegacyPass)
776
+ ? &LegacyPass->getAnalysis <ProfileSummaryInfoWrapperPass>().getPSI ()
777
+ : MFAM->getResult <ModuleAnalysisManagerMachineFunctionProxy>(MF)
778
+ .getCachedResult <ProfileSummaryAnalysis>(*MF.getFunction ().getParent ());
779
+ MBFI = UseBlockFreqInfo ? GET_ANALYSIS (MachineBlockFrequency, Info, getMBFI)
780
+ : nullptr ;
781
+ MBPI = GET_ANALYSIS (MachineBranchProbability, Info, getMBPI);
782
+ AA = (LegacyPass)
783
+ ? &LegacyPass->getAnalysis <AAResultsWrapperPass>().getAAResults ()
784
+ : &MFAM->getResult <FunctionAnalysisManagerMachineFunctionProxy>(MF)
785
+ .getManager ()
786
+ .getResult <AAManager>(MF.getFunction ());
787
+
733
788
RegClassInfo.runOnMachineFunction (MF);
734
- TargetPassConfig *PassConfig = &getAnalysis<TargetPassConfig>();
735
- EnableSinkAndFold = PassConfig->getEnableSinkAndFold ();
736
789
737
790
bool EverMadeChange = false ;
738
791
@@ -748,7 +801,8 @@ bool MachineSinking::runOnMachineFunction(MachineFunction &MF) {
748
801
749
802
// If we have anything we marked as toSplit, split it now.
750
803
for (const auto &Pair : ToSplit) {
751
- auto NewSucc = Pair.first ->SplitCriticalEdge (Pair.second , *this );
804
+ auto NewSucc =
805
+ Pair.first ->SplitCriticalEdge (Pair.second , LegacyPass, MFAM, nullptr );
752
806
if (NewSucc != nullptr ) {
753
807
LLVM_DEBUG (dbgs () << " *** Splitting critical edge: "
754
808
<< printMBBReference (*Pair.first ) << " -- "
@@ -807,6 +861,7 @@ bool MachineSinking::runOnMachineFunction(MachineFunction &MF) {
807
861
MRI->clearKillFlags (I);
808
862
RegsToClearKillFlags.clear ();
809
863
864
+ releaseMemory ();
810
865
return EverMadeChange;
811
866
}
812
867
0 commit comments