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"
26
27
#include " llvm/Analysis/AliasAnalysis.h"
27
28
#include " llvm/Analysis/CFG.h"
28
29
#include " llvm/Analysis/ProfileSummaryInfo.h"
30
+ #include " llvm/CodeGen/LiveIntervals.h"
31
+ #include " llvm/CodeGen/LiveVariables.h"
29
32
#include " llvm/CodeGen/MachineBasicBlock.h"
30
33
#include " llvm/CodeGen/MachineBlockFrequencyInfo.h"
31
34
#include " llvm/CodeGen/MachineBranchProbabilityInfo.h"
42
45
#include " llvm/CodeGen/MachineSizeOpts.h"
43
46
#include " llvm/CodeGen/RegisterClassInfo.h"
44
47
#include " llvm/CodeGen/RegisterPressure.h"
48
+ #include " llvm/CodeGen/SlotIndexes.h"
45
49
#include " llvm/CodeGen/TargetInstrInfo.h"
46
50
#include " llvm/CodeGen/TargetPassConfig.h"
47
51
#include " llvm/CodeGen/TargetRegisterInfo.h"
@@ -118,7 +122,7 @@ using RegSubRegPair = TargetInstrInfo::RegSubRegPair;
118
122
119
123
namespace {
120
124
121
- class MachineSinking : public MachineFunctionPass {
125
+ class MachineSinking {
122
126
const TargetSubtargetInfo *STI = nullptr ;
123
127
const TargetInstrInfo *TII = nullptr ;
124
128
const TargetRegisterInfo *TRI = nullptr ;
@@ -132,6 +136,11 @@ class MachineSinking : public MachineFunctionPass {
132
136
AliasAnalysis *AA = nullptr ;
133
137
RegisterClassInfo RegClassInfo;
134
138
TargetSchedModel SchedModel;
139
+ // Required for split critical edge
140
+ LiveIntervals *LIS;
141
+ SlotIndexes *SI;
142
+ LiveVariables *LV;
143
+ MachineLoopInfo *MLI;
135
144
136
145
// Remember which edges have been considered for breaking.
137
146
SmallSet<std::pair<MachineBasicBlock *, MachineBasicBlock *>, 8 >
@@ -189,30 +198,19 @@ class MachineSinking : public MachineFunctionPass {
189
198
bool EnableSinkAndFold;
190
199
191
200
public:
192
- static char ID; // Pass identification
193
-
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
- }
214
-
215
- void releaseMemory () override {
201
+ MachineSinking (bool EnableSinkAndFold, MachineDominatorTree *DT,
202
+ MachinePostDominatorTree *PDT, LiveVariables *LV,
203
+ MachineLoopInfo *MLI, SlotIndexes *SI, LiveIntervals *LIS,
204
+ MachineCycleInfo *CI, ProfileSummaryInfo *PSI,
205
+ MachineBlockFrequencyInfo *MBFI,
206
+ const MachineBranchProbabilityInfo *MBPI, AliasAnalysis *AA)
207
+ : DT(DT), PDT(PDT), CI(CI), PSI(PSI), MBFI(MBFI), MBPI(MBPI), AA(AA),
208
+ LIS (LIS), SI(SI), LV(LV), MLI(MLI),
209
+ EnableSinkAndFold(EnableSinkAndFold) {}
210
+
211
+ bool run (MachineFunction &MF);
212
+
213
+ void releaseMemory () {
216
214
CEBCandidates.clear ();
217
215
CEMergeCandidates.clear ();
218
216
}
@@ -290,21 +288,47 @@ class MachineSinking : public MachineFunctionPass {
290
288
bool registerPressureExceedsLimit (const MachineBasicBlock &MBB);
291
289
};
292
290
291
+ class MachineSinkingLegacy : public MachineFunctionPass {
292
+ public:
293
+ static char ID;
294
+
295
+ MachineSinkingLegacy () : MachineFunctionPass(ID) {
296
+ initializeMachineSinkingLegacyPass (*PassRegistry::getPassRegistry ());
297
+ }
298
+
299
+ bool runOnMachineFunction (MachineFunction &MF) override ;
300
+
301
+ void getAnalysisUsage (AnalysisUsage &AU) const override {
302
+ MachineFunctionPass::getAnalysisUsage (AU);
303
+ AU.addRequired <AAResultsWrapperPass>();
304
+ AU.addRequired <MachineDominatorTreeWrapperPass>();
305
+ AU.addRequired <MachinePostDominatorTreeWrapperPass>();
306
+ AU.addRequired <MachineCycleInfoWrapperPass>();
307
+ AU.addRequired <MachineBranchProbabilityInfoWrapperPass>();
308
+ AU.addPreserved <MachineCycleInfoWrapperPass>();
309
+ AU.addPreserved <MachineLoopInfoWrapperPass>();
310
+ AU.addRequired <ProfileSummaryInfoWrapperPass>();
311
+ if (UseBlockFreqInfo)
312
+ AU.addRequired <MachineBlockFrequencyInfoWrapperPass>();
313
+ AU.addRequired <TargetPassConfig>();
314
+ }
315
+ };
316
+
293
317
} // end anonymous namespace
294
318
295
- char MachineSinking ::ID = 0 ;
319
+ char MachineSinkingLegacy ::ID = 0 ;
296
320
297
- char &llvm::MachineSinkingID = MachineSinking ::ID;
321
+ char &llvm::MachineSinkingLegacyID = MachineSinkingLegacy ::ID;
298
322
299
- INITIALIZE_PASS_BEGIN (MachineSinking , DEBUG_TYPE, " Machine code sinking" , false ,
300
- false )
323
+ INITIALIZE_PASS_BEGIN (MachineSinkingLegacy , DEBUG_TYPE, " Machine code sinking" ,
324
+ false , false )
301
325
INITIALIZE_PASS_DEPENDENCY(ProfileSummaryInfoWrapperPass)
302
326
INITIALIZE_PASS_DEPENDENCY(MachineBranchProbabilityInfoWrapperPass)
303
327
INITIALIZE_PASS_DEPENDENCY(MachineDominatorTreeWrapperPass)
304
328
INITIALIZE_PASS_DEPENDENCY(MachineCycleInfoWrapperPass)
305
329
INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass)
306
- INITIALIZE_PASS_END(MachineSinking , DEBUG_TYPE, " Machine code sinking" , false ,
307
- false )
330
+ INITIALIZE_PASS_END(MachineSinkingLegacy , DEBUG_TYPE, " Machine code sinking" ,
331
+ false , false )
308
332
309
333
// / Return true if a target defined block prologue instruction interferes
310
334
// / with a sink candidate.
@@ -728,28 +752,87 @@ void MachineSinking::FindCycleSinkCandidates(
728
752
}
729
753
}
730
754
731
- bool MachineSinking::runOnMachineFunction (MachineFunction &MF) {
755
+ PreservedAnalyses
756
+ MachineSinkingPass::run (MachineFunction &MF,
757
+ MachineFunctionAnalysisManager &MFAM) {
758
+ auto *DT = &MFAM.getResult <MachineDominatorTreeAnalysis>(MF);
759
+ auto *PDT = &MFAM.getResult <MachinePostDominatorTreeAnalysis>(MF);
760
+ auto *CI = &MFAM.getResult <MachineCycleAnalysis>(MF);
761
+ auto *PSI = MFAM.getResult <ModuleAnalysisManagerMachineFunctionProxy>(MF)
762
+ .getCachedResult <ProfileSummaryAnalysis>(
763
+ *MF.getFunction ().getParent ());
764
+ auto *MBFI = UseBlockFreqInfo
765
+ ? &MFAM.getResult <MachineBlockFrequencyAnalysis>(MF)
766
+ : nullptr ;
767
+ auto *MBPI = &MFAM.getResult <MachineBranchProbabilityAnalysis>(MF);
768
+ auto *AA = &MFAM.getResult <FunctionAnalysisManagerMachineFunctionProxy>(MF)
769
+ .getManager ()
770
+ .getResult <AAManager>(MF.getFunction ());
771
+ auto *LIS = MFAM.getCachedResult <LiveIntervalsAnalysis>(MF);
772
+ auto *SI = MFAM.getCachedResult <SlotIndexesAnalysis>(MF);
773
+ auto *LV = MFAM.getCachedResult <LiveVariablesAnalysis>(MF);
774
+ auto *MLI = MFAM.getCachedResult <MachineLoopAnalysis>(MF);
775
+ MachineSinking Impl (EnableSinkAndFold, DT, PDT, LV, MLI, SI, LIS, CI, PSI,
776
+ MBFI, MBPI, AA);
777
+ bool Changed = Impl.run (MF);
778
+ if (!Changed)
779
+ return PreservedAnalyses::all ();
780
+ auto PA = getMachineFunctionPassPreservedAnalyses ();
781
+ PA.preserve <MachineCycleAnalysis>();
782
+ PA.preserve <MachineLoopAnalysis>();
783
+ return PA;
784
+ }
785
+
786
+ void MachineSinkingPass::printPipeline (
787
+ raw_ostream &OS, function_ref<StringRef(StringRef)> MapClassName2PassName) {
788
+ OS << MapClassName2PassName (name ()); // ideally machine-sink
789
+ if (EnableSinkAndFold)
790
+ OS << " <enable-sink-fold>" ;
791
+ }
792
+
793
+ bool MachineSinkingLegacy::runOnMachineFunction (MachineFunction &MF) {
732
794
if (skipFunction (MF.getFunction ()))
733
795
return false ;
734
796
797
+ TargetPassConfig *PassConfig = &getAnalysis<TargetPassConfig>();
798
+ bool EnableSinkAndFold = PassConfig->getEnableSinkAndFold ();
799
+
800
+ auto *DT = &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree ();
801
+ auto *PDT =
802
+ &getAnalysis<MachinePostDominatorTreeWrapperPass>().getPostDomTree ();
803
+ auto *CI = &getAnalysis<MachineCycleInfoWrapperPass>().getCycleInfo ();
804
+ auto *PSI = &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI ();
805
+ auto *MBFI =
806
+ UseBlockFreqInfo
807
+ ? &getAnalysis<MachineBlockFrequencyInfoWrapperPass>().getMBFI ()
808
+ : nullptr ;
809
+ auto *MBPI =
810
+ &getAnalysis<MachineBranchProbabilityInfoWrapperPass>().getMBPI ();
811
+ auto *AA = &getAnalysis<AAResultsWrapperPass>().getAAResults ();
812
+ // Get analyses for split critical edge.
813
+ auto *LISWrapper = getAnalysisIfAvailable<LiveIntervalsWrapperPass>();
814
+ auto *LIS = LISWrapper ? &LISWrapper->getLIS () : nullptr ;
815
+ auto *SIWrapper = getAnalysisIfAvailable<SlotIndexesWrapperPass>();
816
+ auto *SI = SIWrapper ? &SIWrapper->getSI () : nullptr ;
817
+ auto *LVWrapper = getAnalysisIfAvailable<LiveVariablesWrapperPass>();
818
+ auto *LV = LVWrapper ? &LVWrapper->getLV () : nullptr ;
819
+ auto *MLIWrapper = getAnalysisIfAvailable<MachineLoopInfoWrapperPass>();
820
+ auto *MLI = MLIWrapper ? &MLIWrapper->getLI () : nullptr ;
821
+
822
+ MachineSinking Impl (EnableSinkAndFold, DT, PDT, LV, MLI, SI, LIS, CI, PSI,
823
+ MBFI, MBPI, AA);
824
+ return Impl.run (MF);
825
+ }
826
+
827
+ bool MachineSinking::run (MachineFunction &MF) {
735
828
LLVM_DEBUG (dbgs () << " ******** Machine Sinking ********\n " );
736
829
737
830
STI = &MF.getSubtarget ();
738
831
TII = STI->getInstrInfo ();
739
832
TRI = STI->getRegisterInfo ();
740
833
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 ();
834
+
750
835
RegClassInfo.runOnMachineFunction (MF);
751
- TargetPassConfig *PassConfig = &getAnalysis<TargetPassConfig>();
752
- EnableSinkAndFold = PassConfig->getEnableSinkAndFold ();
753
836
754
837
bool EverMadeChange = false ;
755
838
@@ -767,8 +850,8 @@ bool MachineSinking::runOnMachineFunction(MachineFunction &MF) {
767
850
MachineDomTreeUpdater MDTU (DT, PDT,
768
851
MachineDomTreeUpdater::UpdateStrategy::Lazy);
769
852
for (const auto &Pair : ToSplit) {
770
- auto NewSucc =
771
- Pair.first -> SplitCriticalEdge (Pair. second , * this , nullptr , &MDTU);
853
+ auto NewSucc = Pair. first -> SplitCriticalEdge (
854
+ Pair.second , {LIS, SI, LV, MLI} , nullptr , &MDTU);
772
855
if (NewSucc != nullptr ) {
773
856
LLVM_DEBUG (dbgs () << " *** Splitting critical edge: "
774
857
<< printMBBReference (*Pair.first ) << " -- "
@@ -858,6 +941,7 @@ bool MachineSinking::runOnMachineFunction(MachineFunction &MF) {
858
941
MRI->clearKillFlags (I);
859
942
RegsToClearKillFlags.clear ();
860
943
944
+ releaseMemory ();
861
945
return EverMadeChange;
862
946
}
863
947
0 commit comments