Skip to content

Commit 1b41043

Browse files
committed
[CodeGen][NewPM] Port MachineSink to NPM
Targets can set the EnableSinkAndFold option in CGPassBuilderOptions for the NPM pipeline in buildCodeGenPipeline(... &Opts, ...)
1 parent 6236214 commit 1b41043

21 files changed

+167
-49
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
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, function_ref<StringRef(StringRef)> MapClassName2PassName);
26+
};
27+
28+
} // namespace llvm
29+
#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
@@ -349,7 +349,7 @@ namespace llvm {
349349
extern char &EarlyMachineLICMID;
350350

351351
/// MachineSinking - This pass performs sinking on machine instructions.
352-
extern char &MachineSinkingID;
352+
extern char &MachineSinkingLegacyID;
353353

354354
/// MachineCopyPropagation - This pass performs copy propagation on
355355
/// machine instructions.

llvm/include/llvm/InitializePasses.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ void initializeMachinePostDominatorTreeWrapperPassPass(PassRegistry &);
209209
void initializeMachineRegionInfoPassPass(PassRegistry &);
210210
void initializeMachineSanitizerBinaryMetadataPass(PassRegistry &);
211211
void initializeMachineSchedulerPass(PassRegistry &);
212-
void initializeMachineSinkingPass(PassRegistry &);
212+
void initializeMachineSinkingLegacyPass(PassRegistry &);
213213
void initializeMachineTraceMetricsWrapperPassPass(PassRegistry &);
214214
void initializeMachineUniformityInfoPrinterPassPass(PassRegistry &);
215215
void initializeMachineUniformityAnalysisPassPass(PassRegistry &);

llvm/include/llvm/Passes/CodeGenPassBuilder.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
#include "llvm/CodeGen/MachineLICM.h"
5050
#include "llvm/CodeGen/MachineModuleInfo.h"
5151
#include "llvm/CodeGen/MachinePassManager.h"
52+
#include "llvm/CodeGen/MachineSink.h"
5253
#include "llvm/CodeGen/MachineVerifier.h"
5354
#include "llvm/CodeGen/OptimizePHIs.h"
5455
#include "llvm/CodeGen/PHIElimination.h"
@@ -1038,7 +1039,7 @@ void CodeGenPassBuilder<Derived, TargetMachineT>::addMachineSSAOptimization(
10381039
addPass(EarlyMachineLICMPass());
10391040
addPass(MachineCSEPass());
10401041

1041-
addPass(MachineSinkingPass());
1042+
addPass(MachineSinkingPass(Opt.EnableSinkAndFold));
10421043

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

llvm/include/llvm/Passes/MachinePassRegistry.def

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,13 +176,21 @@ MACHINE_FUNCTION_PASS("verify<machine-trace-metrics>", MachineTraceMetricsVerifi
176176
#define MACHINE_FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, \
177177
PARAMS)
178178
#endif
179+
MACHINE_FUNCTION_PASS_WITH_PARAMS(
180+
"machine-sink", "MachineSinkingPass",
181+
[](bool EnableSinkAndFold) {
182+
return MachineSinkingPass(EnableSinkAndFold);
183+
},
184+
parseMachineSinkingPassOptions, "enable-sink-fold")
185+
179186
MACHINE_FUNCTION_PASS_WITH_PARAMS(
180187
"regallocfast", "RegAllocFast",
181188
[](RegAllocFastPassOptions Opts) { return RegAllocFastPass(Opts); },
182189
[PB = this](StringRef Params) {
183190
return parseRegAllocFastPassOptions(*PB, Params);
184191
},
185192
"filter=reg-filter;no-clear-vregs")
193+
186194
#undef MACHINE_FUNCTION_PASS_WITH_PARAMS
187195

188196
// After a pass is converted to new pass manager, its entry should be moved from
@@ -238,7 +246,6 @@ DUMMY_MACHINE_FUNCTION_PASS("machine-function-splitter", MachineFunctionSplitter
238246
DUMMY_MACHINE_FUNCTION_PASS("machine-latecleanup", MachineLateInstrsCleanupPass)
239247
DUMMY_MACHINE_FUNCTION_PASS("machine-sanmd", MachineSanitizerBinaryMetadata)
240248
DUMMY_MACHINE_FUNCTION_PASS("machine-scheduler", MachineSchedulerPass)
241-
DUMMY_MACHINE_FUNCTION_PASS("machine-sink", MachineSinkingPass)
242249
DUMMY_MACHINE_FUNCTION_PASS("machine-uniformity", MachineUniformityInfoWrapperPass)
243250
DUMMY_MACHINE_FUNCTION_PASS("machineinstr-printer", MachineFunctionPrinterPass)
244251
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
@@ -33,6 +33,7 @@ struct CGPassBuilderOption {
3333
bool EnableBlockPlacementStats = false;
3434
bool EnableGlobalMergeFunc = false;
3535
bool EnableMachineFunctionSplitter = false;
36+
bool EnableSinkAndFold = false;
3637
bool MISchedPostRA = false;
3738
bool EarlyLiveIntervals = false;
3839
bool GCEmptyBlocks = false;

llvm/lib/CodeGen/CodeGen.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ void llvm::initializeCodeGen(PassRegistry &Registry) {
9494
initializeMachinePostDominatorTreeWrapperPassPass(Registry);
9595
initializeMachineRegionInfoPassPass(Registry);
9696
initializeMachineSchedulerPass(Registry);
97-
initializeMachineSinkingPass(Registry);
97+
initializeMachineSinkingLegacyPass(Registry);
9898
initializeMachineUniformityAnalysisPassPass(Registry);
9999
initializeMachineUniformityInfoPrinterPassPass(Registry);
100100
initializeMachineVerifierLegacyPassPass(Registry);

llvm/lib/CodeGen/MachineSink.cpp

Lines changed: 96 additions & 41 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"
@@ -36,6 +37,7 @@
3637
#include "llvm/CodeGen/MachineInstr.h"
3738
#include "llvm/CodeGen/MachineLoopInfo.h"
3839
#include "llvm/CodeGen/MachineOperand.h"
40+
#include "llvm/CodeGen/MachinePassManager.h"
3941
#include "llvm/CodeGen/MachinePostDominators.h"
4042
#include "llvm/CodeGen/MachineRegisterInfo.h"
4143
#include "llvm/CodeGen/MachineSizeOpts.h"
@@ -45,6 +47,7 @@
4547
#include "llvm/CodeGen/TargetPassConfig.h"
4648
#include "llvm/CodeGen/TargetRegisterInfo.h"
4749
#include "llvm/CodeGen/TargetSubtargetInfo.h"
50+
#include "llvm/IR/Analysis.h"
4851
#include "llvm/IR/BasicBlock.h"
4952
#include "llvm/IR/DebugInfoMetadata.h"
5053
#include "llvm/IR/LLVMContext.h"
@@ -114,7 +117,7 @@ STATISTIC(NumPostRACopySink, "Number of copies sunk after RA");
114117

115118
namespace {
116119

117-
class MachineSinking : public MachineFunctionPass {
120+
class MachineSinking {
118121
const TargetSubtargetInfo *STI = nullptr;
119122
const TargetInstrInfo *TII = nullptr;
120123
const TargetRegisterInfo *TRI = nullptr;
@@ -127,6 +130,8 @@ class MachineSinking : public MachineFunctionPass {
127130
const MachineBranchProbabilityInfo *MBPI = nullptr;
128131
AliasAnalysis *AA = nullptr;
129132
RegisterClassInfo RegClassInfo;
133+
Pass *LegacyPass;
134+
MachineFunctionAnalysisManager *MFAM;
130135

131136
// Remember which edges have been considered for breaking.
132137
SmallSet<std::pair<MachineBasicBlock *, MachineBasicBlock *>, 8>
@@ -182,30 +187,14 @@ class MachineSinking : public MachineFunctionPass {
182187
bool EnableSinkAndFold;
183188

184189
public:
185-
static char ID; // Pass identification
190+
MachineSinking(Pass *LegacyPass, MachineFunctionAnalysisManager *MFAM,
191+
bool EnableSinkAndFold)
192+
: LegacyPass(LegacyPass), MFAM(MFAM),
193+
EnableSinkAndFold(EnableSinkAndFold) {}
186194

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);
207196

208-
void releaseMemory() override {
197+
void releaseMemory() {
209198
CEBCandidates.clear();
210199
CEMergeCandidates.clear();
211200
}
@@ -277,21 +266,47 @@ class MachineSinking : public MachineFunctionPass {
277266
const MachineBasicBlock &MBB);
278267
};
279268

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+
280295
} // end anonymous namespace
281296

282-
char MachineSinking::ID = 0;
297+
char MachineSinkingLegacy::ID = 0;
283298

284-
char &llvm::MachineSinkingID = MachineSinking::ID;
299+
char &llvm::MachineSinkingLegacyID = MachineSinkingLegacy::ID;
285300

286-
INITIALIZE_PASS_BEGIN(MachineSinking, DEBUG_TYPE, "Machine code sinking", false,
301+
INITIALIZE_PASS_BEGIN(MachineSinkingLegacy, DEBUG_TYPE, "Machine code sinking", false,
287302
false)
288303
INITIALIZE_PASS_DEPENDENCY(ProfileSummaryInfoWrapperPass)
289304
INITIALIZE_PASS_DEPENDENCY(MachineBranchProbabilityInfoWrapperPass)
290305
INITIALIZE_PASS_DEPENDENCY(MachineDominatorTreeWrapperPass)
291306
INITIALIZE_PASS_DEPENDENCY(MachineCycleInfoWrapperPass)
292307
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)
295310

296311
/// Return true if a target defined block prologue instruction interferes
297312
/// with a sink candidate.
@@ -711,28 +726,66 @@ void MachineSinking::FindCycleSinkCandidates(
711726
}
712727
}
713728

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) {
715750
if (skipFunction(MF.getFunction()))
716751
return false;
717752

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

720768
STI = &MF.getSubtarget();
721769
TII = STI->getInstrInfo();
722770
TRI = STI->getRegisterInfo();
723771
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+
733788
RegClassInfo.runOnMachineFunction(MF);
734-
TargetPassConfig *PassConfig = &getAnalysis<TargetPassConfig>();
735-
EnableSinkAndFold = PassConfig->getEnableSinkAndFold();
736789

737790
bool EverMadeChange = false;
738791

@@ -748,7 +801,8 @@ bool MachineSinking::runOnMachineFunction(MachineFunction &MF) {
748801

749802
// If we have anything we marked as toSplit, split it now.
750803
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);
752806
if (NewSucc != nullptr) {
753807
LLVM_DEBUG(dbgs() << " *** Splitting critical edge: "
754808
<< printMBBReference(*Pair.first) << " -- "
@@ -807,6 +861,7 @@ bool MachineSinking::runOnMachineFunction(MachineFunction &MF) {
807861
MRI->clearKillFlags(I);
808862
RegsToClearKillFlags.clear();
809863

864+
releaseMemory();
810865
return EverMadeChange;
811866
}
812867

llvm/lib/CodeGen/TargetPassConfig.cpp

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

324-
if (StandardID == &MachineSinkingID)
324+
if (StandardID == &MachineSinkingLegacyID)
325325
return applyDisable(TargetID, DisableMachineSink);
326326

327327
if (StandardID == &PostRAMachineSinkingID)
@@ -1313,7 +1313,7 @@ void TargetPassConfig::addMachineSSAOptimization() {
13131313
addPass(&EarlyMachineLICMID);
13141314
addPass(&MachineCSELegacyID);
13151315

1316-
addPass(&MachineSinkingID);
1316+
addPass(&MachineSinkingLegacyID);
13171317

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

llvm/lib/Passes/PassBuilder.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@
115115
#include "llvm/CodeGen/MachinePassManager.h"
116116
#include "llvm/CodeGen/MachinePostDominators.h"
117117
#include "llvm/CodeGen/MachineRegisterInfo.h"
118+
#include "llvm/CodeGen/MachineSink.h"
118119
#include "llvm/CodeGen/MachineTraceMetrics.h"
119120
#include "llvm/CodeGen/MachineVerifier.h"
120121
#include "llvm/CodeGen/OptimizePHIs.h"
@@ -1282,6 +1283,11 @@ Expected<RealtimeSanitizerOptions> parseRtSanPassOptions(StringRef Params) {
12821283
return Result;
12831284
}
12841285

1286+
Expected<bool> parseMachineSinkingPassOptions(StringRef Params) {
1287+
return PassBuilder::parseSinglePassOption(Params, "enable-sink-fold",
1288+
"MachineSinkingPass");
1289+
}
1290+
12851291
} // namespace
12861292

12871293
/// Tests whether a pass name starts with a valid prefix for a default pipeline

llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -494,7 +494,7 @@ void NVPTXPassConfig::addMachineSSAOptimization() {
494494
addPass(&EarlyMachineLICMID);
495495
addPass(&MachineCSELegacyID);
496496

497-
addPass(&MachineSinkingID);
497+
addPass(&MachineSinkingLegacyID);
498498
printAndVerify("After Machine LICM, CSE and Sinking passes");
499499

500500
addPass(&PeepholeOptimizerLegacyID);

llvm/test/CodeGen/AArch64/loop-sink.mir

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
22
# RUN: llc -mtriple aarch64 -run-pass=machine-sink -sink-insts-to-avoid-spills -aarch64-enable-sink-fold=true %s -o - 2>&1 | FileCheck %s
3+
# RUN: llc -mtriple aarch64 -passes="machine-sink<enable-sink-fold>" -sink-insts-to-avoid-spills %s -o - 2>&1 | FileCheck %s
34
--- |
45
target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
56
target triple = "aarch64"

0 commit comments

Comments
 (0)