Skip to content

Commit 6f444ce

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 c366c19 commit 6f444ce

21 files changed

+166
-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
@@ -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
@@ -51,6 +51,7 @@
5151
#include "llvm/CodeGen/MachineModuleInfo.h"
5252
#include "llvm/CodeGen/MachinePassManager.h"
5353
#include "llvm/CodeGen/MachineScheduler.h"
54+
#include "llvm/CodeGen/MachineSink.h"
5455
#include "llvm/CodeGen/MachineVerifier.h"
5556
#include "llvm/CodeGen/OptimizePHIs.h"
5657
#include "llvm/CodeGen/PHIElimination.h"
@@ -1042,7 +1043,7 @@ void CodeGenPassBuilder<Derived, TargetMachineT>::addMachineSSAOptimization(
10421043
addPass(EarlyMachineLICMPass());
10431044
addPass(MachineCSEPass());
10441045

1045-
addPass(MachineSinkingPass());
1046+
addPass(MachineSinkingPass(Opt.EnableSinkAndFold));
10461047

10471048
addPass(PeepholeOptimizerPass());
10481049
// 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
@@ -189,13 +189,21 @@ MACHINE_FUNCTION_PASS("verify<machine-trace-metrics>", MachineTraceMetricsVerifi
189189
#define MACHINE_FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, \
190190
PARAMS)
191191
#endif
192+
MACHINE_FUNCTION_PASS_WITH_PARAMS(
193+
"machine-sink", "MachineSinkingPass",
194+
[](bool EnableSinkAndFold) {
195+
return MachineSinkingPass(EnableSinkAndFold);
196+
},
197+
parseMachineSinkingPassOptions, "enable-sink-fold")
198+
192199
MACHINE_FUNCTION_PASS_WITH_PARAMS(
193200
"regallocfast", "RegAllocFastPass",
194201
[](RegAllocFastPassOptions Opts) { return RegAllocFastPass(Opts); },
195202
[PB = this](StringRef Params) {
196203
return parseRegAllocFastPassOptions(*PB, Params);
197204
},
198205
"filter=reg-filter;no-clear-vregs")
206+
199207
#undef MACHINE_FUNCTION_PASS_WITH_PARAMS
200208

201209
// After a pass is converted to new pass manager, its entry should be moved from
@@ -249,7 +257,6 @@ DUMMY_MACHINE_FUNCTION_PASS("static-data-splitter", StaticDataSplitter)
249257
DUMMY_MACHINE_FUNCTION_PASS("machine-function-splitter", MachineFunctionSplitterPass)
250258
DUMMY_MACHINE_FUNCTION_PASS("machine-latecleanup", MachineLateInstrsCleanupPass)
251259
DUMMY_MACHINE_FUNCTION_PASS("machine-sanmd", MachineSanitizerBinaryMetadata)
252-
DUMMY_MACHINE_FUNCTION_PASS("machine-sink", MachineSinkingPass)
253260
DUMMY_MACHINE_FUNCTION_PASS("machine-uniformity", MachineUniformityInfoWrapperPass)
254261
DUMMY_MACHINE_FUNCTION_PASS("machineinstr-printer", MachineFunctionPrinterPass)
255262
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
@@ -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: 95 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"
@@ -37,6 +38,7 @@
3738
#include "llvm/CodeGen/MachineInstr.h"
3839
#include "llvm/CodeGen/MachineLoopInfo.h"
3940
#include "llvm/CodeGen/MachineOperand.h"
41+
#include "llvm/CodeGen/MachinePassManager.h"
4042
#include "llvm/CodeGen/MachinePostDominators.h"
4143
#include "llvm/CodeGen/MachineRegisterInfo.h"
4244
#include "llvm/CodeGen/MachineSizeOpts.h"
@@ -47,6 +49,7 @@
4749
#include "llvm/CodeGen/TargetRegisterInfo.h"
4850
#include "llvm/CodeGen/TargetSchedule.h"
4951
#include "llvm/CodeGen/TargetSubtargetInfo.h"
52+
#include "llvm/IR/Analysis.h"
5053
#include "llvm/IR/BasicBlock.h"
5154
#include "llvm/IR/DebugInfoMetadata.h"
5255
#include "llvm/IR/LLVMContext.h"
@@ -118,7 +121,7 @@ using RegSubRegPair = TargetInstrInfo::RegSubRegPair;
118121

119122
namespace {
120123

121-
class MachineSinking : public MachineFunctionPass {
124+
class MachineSinking {
122125
const TargetSubtargetInfo *STI = nullptr;
123126
const TargetInstrInfo *TII = nullptr;
124127
const TargetRegisterInfo *TRI = nullptr;
@@ -132,6 +135,8 @@ class MachineSinking : public MachineFunctionPass {
132135
AliasAnalysis *AA = nullptr;
133136
RegisterClassInfo RegClassInfo;
134137
TargetSchedModel SchedModel;
138+
Pass *LegacyPass;
139+
MachineFunctionAnalysisManager *MFAM;
135140

136141
// Remember which edges have been considered for breaking.
137142
SmallSet<std::pair<MachineBasicBlock *, MachineBasicBlock *>, 8>
@@ -189,30 +194,14 @@ class MachineSinking : public MachineFunctionPass {
189194
bool EnableSinkAndFold;
190195

191196
public:
192-
static char ID; // Pass identification
197+
MachineSinking(Pass *LegacyPass, MachineFunctionAnalysisManager *MFAM,
198+
bool EnableSinkAndFold)
199+
: LegacyPass(LegacyPass), MFAM(MFAM),
200+
EnableSinkAndFold(EnableSinkAndFold) {}
193201

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

215-
void releaseMemory() override {
204+
void releaseMemory() {
216205
CEBCandidates.clear();
217206
CEMergeCandidates.clear();
218207
}
@@ -290,21 +279,47 @@ class MachineSinking : public MachineFunctionPass {
290279
bool registerPressureExceedsLimit(const MachineBasicBlock &MBB);
291280
};
292281

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+
293308
} // end anonymous namespace
294309

295-
char MachineSinking::ID = 0;
310+
char MachineSinkingLegacy::ID = 0;
296311

297-
char &llvm::MachineSinkingID = MachineSinking::ID;
312+
char &llvm::MachineSinkingLegacyID = MachineSinkingLegacy::ID;
298313

299-
INITIALIZE_PASS_BEGIN(MachineSinking, DEBUG_TYPE, "Machine code sinking", false,
314+
INITIALIZE_PASS_BEGIN(MachineSinkingLegacy, DEBUG_TYPE, "Machine code sinking", false,
300315
false)
301316
INITIALIZE_PASS_DEPENDENCY(ProfileSummaryInfoWrapperPass)
302317
INITIALIZE_PASS_DEPENDENCY(MachineBranchProbabilityInfoWrapperPass)
303318
INITIALIZE_PASS_DEPENDENCY(MachineDominatorTreeWrapperPass)
304319
INITIALIZE_PASS_DEPENDENCY(MachineCycleInfoWrapperPass)
305320
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)
308323

309324
/// Return true if a target defined block prologue instruction interferes
310325
/// with a sink candidate.
@@ -728,28 +743,66 @@ void MachineSinking::FindCycleSinkCandidates(
728743
}
729744
}
730745

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) {
732767
if (skipFunction(MF.getFunction()))
733768
return false;
734769

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

737785
STI = &MF.getSubtarget();
738786
TII = STI->getInstrInfo();
739787
TRI = STI->getRegisterInfo();
740788
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+
750805
RegClassInfo.runOnMachineFunction(MF);
751-
TargetPassConfig *PassConfig = &getAnalysis<TargetPassConfig>();
752-
EnableSinkAndFold = PassConfig->getEnableSinkAndFold();
753806

754807
bool EverMadeChange = false;
755808

@@ -768,7 +821,7 @@ bool MachineSinking::runOnMachineFunction(MachineFunction &MF) {
768821
MachineDomTreeUpdater::UpdateStrategy::Lazy);
769822
for (const auto &Pair : ToSplit) {
770823
auto NewSucc =
771-
Pair.first->SplitCriticalEdge(Pair.second, *this, nullptr, &MDTU);
824+
Pair.first->SplitCriticalEdge(Pair.second, LegacyPass, MFAM, nullptr, &MDTU);
772825
if (NewSucc != nullptr) {
773826
LLVM_DEBUG(dbgs() << " *** Splitting critical edge: "
774827
<< printMBBReference(*Pair.first) << " -- "
@@ -858,6 +911,7 @@ bool MachineSinking::runOnMachineFunction(MachineFunction &MF) {
858911
MRI->clearKillFlags(I);
859912
RegsToClearKillFlags.clear();
860913

914+
releaseMemory();
861915
return EverMadeChange;
862916
}
863917

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

llvm/lib/Passes/PassBuilder.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@
121121
#include "llvm/CodeGen/MachinePostDominators.h"
122122
#include "llvm/CodeGen/MachineRegisterInfo.h"
123123
#include "llvm/CodeGen/MachineScheduler.h"
124+
#include "llvm/CodeGen/MachineSink.h"
124125
#include "llvm/CodeGen/MachineTraceMetrics.h"
125126
#include "llvm/CodeGen/MachineVerifier.h"
126127
#include "llvm/CodeGen/OptimizePHIs.h"
@@ -1414,6 +1415,11 @@ parseBoundsCheckingOptions(StringRef Params) {
14141415
return Options;
14151416
}
14161417

1418+
Expected<bool> parseMachineSinkingPassOptions(StringRef Params) {
1419+
return PassBuilder::parseSinglePassOption(Params, "enable-sink-fold",
1420+
"MachineSinkingPass");
1421+
}
1422+
14171423
} // namespace
14181424

14191425
/// 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
@@ -506,7 +506,7 @@ void NVPTXPassConfig::addMachineSSAOptimization() {
506506
addPass(&EarlyMachineLICMID);
507507
addPass(&MachineCSELegacyID);
508508

509-
addPass(&MachineSinkingID);
509+
addPass(&MachineSinkingLegacyID);
510510
printAndVerify("After Machine LICM, CSE and Sinking passes");
511511

512512
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)