Skip to content

Commit 77f44a9

Browse files
authored
[CodeGen][NewPM] Port MachineSink to NPM (#115434)
Targets can set the EnableSinkAndFold option in CGPassBuilderOptions for the NPM pipeline in buildCodeGenPipeline(... &Opts, ...)
1 parent 05589ee commit 77f44a9

21 files changed

+200
-53
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
//===- MachineSink.h --------------------------------------------*- C++ -*-===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#ifndef LLVM_CODEGEN_MACHINESINK_H
10+
#define LLVM_CODEGEN_MACHINESINK_H
11+
12+
#include "llvm/CodeGen/MachinePassManager.h"
13+
14+
namespace llvm {
15+
16+
class MachineSinkingPass : public PassInfoMixin<MachineSinkingPass> {
17+
bool EnableSinkAndFold;
18+
19+
public:
20+
MachineSinkingPass(bool EnableSinkAndFold = false)
21+
: EnableSinkAndFold(EnableSinkAndFold) {}
22+
23+
PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &);
24+
25+
void printPipeline(raw_ostream &OS,
26+
function_ref<StringRef(StringRef)> MapClassName2PassName);
27+
};
28+
29+
} // namespace llvm
30+
#endif // LLVM_CODEGEN_MACHINESINK_H

llvm/include/llvm/CodeGen/Passes.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,7 @@ namespace llvm {
353353
extern char &EarlyMachineLICMID;
354354

355355
/// MachineSinking - This pass performs sinking on machine instructions.
356-
extern char &MachineSinkingID;
356+
extern char &MachineSinkingLegacyID;
357357

358358
/// MachineCopyPropagation - This pass performs copy propagation on
359359
/// machine instructions.

llvm/include/llvm/InitializePasses.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ void initializeMachinePostDominatorTreeWrapperPassPass(PassRegistry &);
208208
void initializeMachineRegionInfoPassPass(PassRegistry &);
209209
void initializeMachineSanitizerBinaryMetadataPass(PassRegistry &);
210210
void initializeMachineSchedulerLegacyPass(PassRegistry &);
211-
void initializeMachineSinkingPass(PassRegistry &);
211+
void initializeMachineSinkingLegacyPass(PassRegistry &);
212212
void initializeMachineTraceMetricsWrapperPassPass(PassRegistry &);
213213
void initializeMachineUniformityInfoPrinterPassPass(PassRegistry &);
214214
void initializeMachineUniformityAnalysisPassPass(PassRegistry &);

llvm/include/llvm/Passes/CodeGenPassBuilder.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
#include "llvm/CodeGen/MachineModuleInfo.h"
5353
#include "llvm/CodeGen/MachinePassManager.h"
5454
#include "llvm/CodeGen/MachineScheduler.h"
55+
#include "llvm/CodeGen/MachineSink.h"
5556
#include "llvm/CodeGen/MachineVerifier.h"
5657
#include "llvm/CodeGen/OptimizePHIs.h"
5758
#include "llvm/CodeGen/PHIElimination.h"
@@ -1044,7 +1045,7 @@ void CodeGenPassBuilder<Derived, TargetMachineT>::addMachineSSAOptimization(
10441045
addPass(EarlyMachineLICMPass());
10451046
addPass(MachineCSEPass());
10461047

1047-
addPass(MachineSinkingPass());
1048+
addPass(MachineSinkingPass(Opt.EnableSinkAndFold));
10481049

10491050
addPass(PeepholeOptimizerPass());
10501051
// Clean-up the dead code that may have been generated by peephole

llvm/include/llvm/Passes/MachinePassRegistry.def

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,13 @@ MACHINE_FUNCTION_PASS("verify<machine-trace-metrics>", MachineTraceMetricsVerifi
190190
#define MACHINE_FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, \
191191
PARAMS)
192192
#endif
193+
MACHINE_FUNCTION_PASS_WITH_PARAMS(
194+
"machine-sink", "MachineSinkingPass",
195+
[](bool EnableSinkAndFold) {
196+
return MachineSinkingPass(EnableSinkAndFold);
197+
},
198+
parseMachineSinkingPassOptions, "enable-sink-fold")
199+
193200
MACHINE_FUNCTION_PASS_WITH_PARAMS(
194201
"regallocfast", "RegAllocFastPass",
195202
[](RegAllocFastPass::Options Opts) { return RegAllocFastPass(Opts); },
@@ -258,7 +265,6 @@ DUMMY_MACHINE_FUNCTION_PASS("machine-combiner", MachineCombinerPass)
258265
DUMMY_MACHINE_FUNCTION_PASS("static-data-splitter", StaticDataSplitter)
259266
DUMMY_MACHINE_FUNCTION_PASS("machine-function-splitter", MachineFunctionSplitterPass)
260267
DUMMY_MACHINE_FUNCTION_PASS("machine-sanmd", MachineSanitizerBinaryMetadata)
261-
DUMMY_MACHINE_FUNCTION_PASS("machine-sink", MachineSinkingPass)
262268
DUMMY_MACHINE_FUNCTION_PASS("machine-uniformity", MachineUniformityInfoWrapperPass)
263269
DUMMY_MACHINE_FUNCTION_PASS("machineinstr-printer", MachineFunctionPrinterPass)
264270
DUMMY_MACHINE_FUNCTION_PASS("mirfs-discriminators", MIRAddFSDiscriminatorsPass)

llvm/include/llvm/Target/CGPassBuilderOption.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ struct CGPassBuilderOption {
4949
bool EnableBlockPlacementStats = false;
5050
bool EnableGlobalMergeFunc = false;
5151
bool EnableMachineFunctionSplitter = false;
52+
bool EnableSinkAndFold = false;
5253
bool MISchedPostRA = false;
5354
bool EarlyLiveIntervals = false;
5455
bool GCEmptyBlocks = false;

llvm/lib/CodeGen/CodeGen.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ void llvm::initializeCodeGen(PassRegistry &Registry) {
9595
initializeMachinePostDominatorTreeWrapperPassPass(Registry);
9696
initializeMachineRegionInfoPassPass(Registry);
9797
initializeMachineSchedulerLegacyPass(Registry);
98-
initializeMachineSinkingPass(Registry);
98+
initializeMachineSinkingLegacyPass(Registry);
9999
initializeMachineUniformityAnalysisPassPass(Registry);
100100
initializeMachineUniformityInfoPrinterPassPass(Registry);
101101
initializeMachineVerifierLegacyPassPass(Registry);

llvm/lib/CodeGen/MachineSink.cpp

Lines changed: 129 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
//
1616
//===----------------------------------------------------------------------===//
1717

18+
#include "llvm/CodeGen/MachineSink.h"
1819
#include "llvm/ADT/DenseSet.h"
1920
#include "llvm/ADT/DepthFirstIterator.h"
2021
#include "llvm/ADT/MapVector.h"
@@ -26,6 +27,8 @@
2627
#include "llvm/Analysis/AliasAnalysis.h"
2728
#include "llvm/Analysis/CFG.h"
2829
#include "llvm/Analysis/ProfileSummaryInfo.h"
30+
#include "llvm/CodeGen/LiveIntervals.h"
31+
#include "llvm/CodeGen/LiveVariables.h"
2932
#include "llvm/CodeGen/MachineBasicBlock.h"
3033
#include "llvm/CodeGen/MachineBlockFrequencyInfo.h"
3134
#include "llvm/CodeGen/MachineBranchProbabilityInfo.h"
@@ -42,6 +45,7 @@
4245
#include "llvm/CodeGen/MachineSizeOpts.h"
4346
#include "llvm/CodeGen/RegisterClassInfo.h"
4447
#include "llvm/CodeGen/RegisterPressure.h"
48+
#include "llvm/CodeGen/SlotIndexes.h"
4549
#include "llvm/CodeGen/TargetInstrInfo.h"
4650
#include "llvm/CodeGen/TargetPassConfig.h"
4751
#include "llvm/CodeGen/TargetRegisterInfo.h"
@@ -118,7 +122,7 @@ using RegSubRegPair = TargetInstrInfo::RegSubRegPair;
118122

119123
namespace {
120124

121-
class MachineSinking : public MachineFunctionPass {
125+
class MachineSinking {
122126
const TargetSubtargetInfo *STI = nullptr;
123127
const TargetInstrInfo *TII = nullptr;
124128
const TargetRegisterInfo *TRI = nullptr;
@@ -132,6 +136,11 @@ class MachineSinking : public MachineFunctionPass {
132136
AliasAnalysis *AA = nullptr;
133137
RegisterClassInfo RegClassInfo;
134138
TargetSchedModel SchedModel;
139+
// Required for split critical edge
140+
LiveIntervals *LIS;
141+
SlotIndexes *SI;
142+
LiveVariables *LV;
143+
MachineLoopInfo *MLI;
135144

136145
// Remember which edges have been considered for breaking.
137146
SmallSet<std::pair<MachineBasicBlock *, MachineBasicBlock *>, 8>
@@ -189,30 +198,19 @@ class MachineSinking : public MachineFunctionPass {
189198
bool EnableSinkAndFold;
190199

191200
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() {
216214
CEBCandidates.clear();
217215
CEMergeCandidates.clear();
218216
}
@@ -290,21 +288,47 @@ class MachineSinking : public MachineFunctionPass {
290288
bool registerPressureExceedsLimit(const MachineBasicBlock &MBB);
291289
};
292290

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+
293317
} // end anonymous namespace
294318

295-
char MachineSinking::ID = 0;
319+
char MachineSinkingLegacy::ID = 0;
296320

297-
char &llvm::MachineSinkingID = MachineSinking::ID;
321+
char &llvm::MachineSinkingLegacyID = MachineSinkingLegacy::ID;
298322

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)
301325
INITIALIZE_PASS_DEPENDENCY(ProfileSummaryInfoWrapperPass)
302326
INITIALIZE_PASS_DEPENDENCY(MachineBranchProbabilityInfoWrapperPass)
303327
INITIALIZE_PASS_DEPENDENCY(MachineDominatorTreeWrapperPass)
304328
INITIALIZE_PASS_DEPENDENCY(MachineCycleInfoWrapperPass)
305329
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)
308332

309333
/// Return true if a target defined block prologue instruction interferes
310334
/// with a sink candidate.
@@ -728,28 +752,87 @@ void MachineSinking::FindCycleSinkCandidates(
728752
}
729753
}
730754

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) {
732794
if (skipFunction(MF.getFunction()))
733795
return false;
734796

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) {
735828
LLVM_DEBUG(dbgs() << "******** Machine Sinking ********\n");
736829

737830
STI = &MF.getSubtarget();
738831
TII = STI->getInstrInfo();
739832
TRI = STI->getRegisterInfo();
740833
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+
750835
RegClassInfo.runOnMachineFunction(MF);
751-
TargetPassConfig *PassConfig = &getAnalysis<TargetPassConfig>();
752-
EnableSinkAndFold = PassConfig->getEnableSinkAndFold();
753836

754837
bool EverMadeChange = false;
755838

@@ -767,8 +850,8 @@ bool MachineSinking::runOnMachineFunction(MachineFunction &MF) {
767850
MachineDomTreeUpdater MDTU(DT, PDT,
768851
MachineDomTreeUpdater::UpdateStrategy::Lazy);
769852
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);
772855
if (NewSucc != nullptr) {
773856
LLVM_DEBUG(dbgs() << " *** Splitting critical edge: "
774857
<< printMBBReference(*Pair.first) << " -- "
@@ -858,6 +941,7 @@ bool MachineSinking::runOnMachineFunction(MachineFunction &MF) {
858941
MRI->clearKillFlags(I);
859942
RegsToClearKillFlags.clear();
860943

944+
releaseMemory();
861945
return EverMadeChange;
862946
}
863947

llvm/lib/CodeGen/TargetPassConfig.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,7 @@ static IdentifyingPassPtr overridePass(AnalysisID StandardID,
324324
if (StandardID == &MachineLICMID)
325325
return applyDisable(TargetID, DisablePostRAMachineLICM);
326326

327-
if (StandardID == &MachineSinkingID)
327+
if (StandardID == &MachineSinkingLegacyID)
328328
return applyDisable(TargetID, DisableMachineSink);
329329

330330
if (StandardID == &PostRAMachineSinkingID)
@@ -1316,7 +1316,7 @@ void TargetPassConfig::addMachineSSAOptimization() {
13161316
addPass(&EarlyMachineLICMID);
13171317
addPass(&MachineCSELegacyID);
13181318

1319-
addPass(&MachineSinkingID);
1319+
addPass(&MachineSinkingLegacyID);
13201320

13211321
addPass(&PeepholeOptimizerLegacyID);
13221322
// Clean-up the dead code that may have been generated by peephole

0 commit comments

Comments
 (0)