Skip to content

Commit 061150d

Browse files
committed
WIP: [CodeGen][NPM] Port VirtRegRewriter to NPM
Not sure why this is squished into VirtRegMap.h
1 parent f20b44e commit 061150d

File tree

9 files changed

+106
-21
lines changed

9 files changed

+106
-21
lines changed

llvm/include/llvm/CodeGen/VirtRegMap.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,19 @@ class VirtRegMapPrinterPass : public PassInfoMixin<VirtRegMapPrinterPass> {
235235
MachineFunctionAnalysisManager &MFAM);
236236
static bool isRequired() { return true; }
237237
};
238+
239+
class VirtRegRewriterPass : public PassInfoMixin<VirtRegRewriterPass> {
240+
bool ClearVirtRegs = true;
241+
public:
242+
VirtRegRewriterPass(bool ClearVirtRegs = true) : ClearVirtRegs(ClearVirtRegs) {}
243+
PreservedAnalyses run(MachineFunction &MF,
244+
MachineFunctionAnalysisManager &MFAM);
245+
246+
static bool isRequired() { return true; }
247+
248+
void printPipeline(raw_ostream &OS, function_ref<StringRef(StringRef)>) const;
249+
};
250+
238251
} // end llvm namespace
239252

240253
#endif // LLVM_CODEGEN_VIRTREGMAP_H

llvm/include/llvm/InitializePasses.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,7 @@ void initializeUnreachableBlockElimLegacyPassPass(PassRegistry &);
316316
void initializeUnreachableMachineBlockElimPass(PassRegistry &);
317317
void initializeVerifierLegacyPassPass(PassRegistry &);
318318
void initializeVirtRegMapWrapperLegacyPass(PassRegistry &);
319-
void initializeVirtRegRewriterPass(PassRegistry &);
319+
void initializeVirtRegRewriterLegacyPass(PassRegistry &);
320320
void initializeWasmEHPreparePass(PassRegistry &);
321321
void initializeWinEHPreparePass(PassRegistry &);
322322
void initializeWriteBitcodePassPass(PassRegistry &);

llvm/include/llvm/Passes/CodeGenPassBuilder.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@
8181
#include "llvm/CodeGen/TargetPassConfig.h"
8282
#include "llvm/CodeGen/TwoAddressInstructionPass.h"
8383
#include "llvm/CodeGen/UnreachableBlockElim.h"
84+
#include "llvm/CodeGen/VirtRegMap.h"
8485
#include "llvm/CodeGen/WasmEHPrepare.h"
8586
#include "llvm/CodeGen/WinEHPrepare.h"
8687
#include "llvm/IR/PassManager.h"

llvm/include/llvm/Passes/MachinePassRegistry.def

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,12 @@ MACHINE_FUNCTION_PASS_WITH_PARAMS(
215215
return parseRegAllocGreedyFilterFunc(*PB, Params);
216216
}, "reg-filter"
217217
)
218+
219+
MACHINE_FUNCTION_PASS_WITH_PARAMS(
220+
"virt-reg-rewriter", "VirtRegRewriterPass",
221+
[](bool ClearVirtRegs) { return VirtRegRewriterPass(ClearVirtRegs); },
222+
parseVirtRegRewriterPassOptions, "no-clear-vregs;clear-vregs")
223+
218224
#undef MACHINE_FUNCTION_PASS_WITH_PARAMS
219225

220226
// After a pass is converted to new pass manager, its entry should be moved from
@@ -287,6 +293,5 @@ DUMMY_MACHINE_FUNCTION_PASS("shrink-wrap", ShrinkWrapPass)
287293
DUMMY_MACHINE_FUNCTION_PASS("stack-frame-layout", StackFrameLayoutAnalysisPass)
288294
DUMMY_MACHINE_FUNCTION_PASS("stackmap-liveness", StackMapLivenessPass)
289295
DUMMY_MACHINE_FUNCTION_PASS("unpack-mi-bundles", UnpackMachineBundlesPass)
290-
DUMMY_MACHINE_FUNCTION_PASS("virtregrewriter", VirtRegRewriterPass)
291296
DUMMY_MACHINE_FUNCTION_PASS("xray-instrumentation", XRayInstrumentationPass)
292297
#undef DUMMY_MACHINE_FUNCTION_PASS

llvm/lib/CodeGen/CodeGen.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ void llvm::initializeCodeGen(PassRegistry &Registry) {
141141
initializeUnreachableBlockElimLegacyPassPass(Registry);
142142
initializeUnreachableMachineBlockElimPass(Registry);
143143
initializeVirtRegMapWrapperLegacyPass(Registry);
144-
initializeVirtRegRewriterPass(Registry);
144+
initializeVirtRegRewriterLegacyPass(Registry);
145145
initializeWasmEHPreparePass(Registry);
146146
initializeWinEHPreparePass(Registry);
147147
initializeXRayInstrumentationPass(Registry);

llvm/lib/CodeGen/VirtRegMap.cpp

Lines changed: 68 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include "llvm/CodeGen/MachineFunctionPass.h"
3030
#include "llvm/CodeGen/MachineInstr.h"
3131
#include "llvm/CodeGen/MachineOperand.h"
32+
#include "llvm/CodeGen/MachinePassManager.h"
3233
#include "llvm/CodeGen/MachineRegisterInfo.h"
3334
#include "llvm/CodeGen/SlotIndexes.h"
3435
#include "llvm/CodeGen/TargetFrameLowering.h"
@@ -197,7 +198,7 @@ VirtRegMap VirtRegMapAnalysis::run(MachineFunction &MF,
197198
//
198199
namespace {
199200

200-
class VirtRegRewriter : public MachineFunctionPass {
201+
class VirtRegRewriter {
201202
MachineFunction *MF = nullptr;
202203
const TargetRegisterInfo *TRI = nullptr;
203204
const TargetInstrInfo *TII = nullptr;
@@ -223,9 +224,22 @@ class VirtRegRewriter : public MachineFunctionPass {
223224

224225
public:
225226
static char ID;
226-
VirtRegRewriter(bool ClearVirtRegs_ = true) :
227-
MachineFunctionPass(ID),
228-
ClearVirtRegs(ClearVirtRegs_) {}
227+
VirtRegRewriter(bool ClearVirtRegs, SlotIndexes *Indexes, LiveIntervals *LIS,
228+
LiveRegMatrix *LRM, VirtRegMap *VRM,
229+
LiveDebugVariables *DebugVars)
230+
: Indexes(Indexes), LIS(LIS), LRM(LRM), VRM(VRM), DebugVars(DebugVars),
231+
ClearVirtRegs(ClearVirtRegs) {}
232+
233+
bool run(MachineFunction&);
234+
235+
};
236+
237+
class VirtRegRewriterLegacy : public MachineFunctionPass {
238+
public:
239+
static char ID;
240+
bool ClearVirtRegs;
241+
VirtRegRewriterLegacy(bool ClearVirtRegs = true) :
242+
MachineFunctionPass(ID), ClearVirtRegs(ClearVirtRegs) {}
229243

230244
void getAnalysisUsage(AnalysisUsage &AU) const override;
231245

@@ -243,22 +257,22 @@ class VirtRegRewriter : public MachineFunctionPass {
243257

244258
} // end anonymous namespace
245259

246-
char VirtRegRewriter::ID = 0;
260+
char VirtRegRewriterLegacy::ID = 0;
247261

248-
char &llvm::VirtRegRewriterID = VirtRegRewriter::ID;
262+
char &llvm::VirtRegRewriterID = VirtRegRewriterLegacy::ID;
249263

250-
INITIALIZE_PASS_BEGIN(VirtRegRewriter, "virtregrewriter",
264+
INITIALIZE_PASS_BEGIN(VirtRegRewriterLegacy, "virtregrewriter",
251265
"Virtual Register Rewriter", false, false)
252266
INITIALIZE_PASS_DEPENDENCY(SlotIndexesWrapperPass)
253267
INITIALIZE_PASS_DEPENDENCY(LiveIntervalsWrapperPass)
254268
INITIALIZE_PASS_DEPENDENCY(LiveDebugVariablesWrapperLegacy)
255269
INITIALIZE_PASS_DEPENDENCY(LiveRegMatrixWrapperLegacy)
256270
INITIALIZE_PASS_DEPENDENCY(LiveStacksWrapperLegacy)
257271
INITIALIZE_PASS_DEPENDENCY(VirtRegMapWrapperLegacy)
258-
INITIALIZE_PASS_END(VirtRegRewriter, "virtregrewriter",
272+
INITIALIZE_PASS_END(VirtRegRewriterLegacy, "virtregrewriter",
259273
"Virtual Register Rewriter", false, false)
260274

261-
void VirtRegRewriter::getAnalysisUsage(AnalysisUsage &AU) const {
275+
void VirtRegRewriterLegacy::getAnalysisUsage(AnalysisUsage &AU) const {
262276
AU.setPreservesCFG();
263277
AU.addRequired<LiveIntervalsWrapperPass>();
264278
AU.addPreserved<LiveIntervalsWrapperPass>();
@@ -276,16 +290,47 @@ void VirtRegRewriter::getAnalysisUsage(AnalysisUsage &AU) const {
276290
MachineFunctionPass::getAnalysisUsage(AU);
277291
}
278292

279-
bool VirtRegRewriter::runOnMachineFunction(MachineFunction &fn) {
293+
bool VirtRegRewriterLegacy::runOnMachineFunction(MachineFunction &MF) {
294+
VirtRegMap &VRM = getAnalysis<VirtRegMapWrapperLegacy>().getVRM();
295+
LiveIntervals &LIS = getAnalysis<LiveIntervalsWrapperPass>().getLIS();
296+
LiveRegMatrix &LRM = getAnalysis<LiveRegMatrixWrapperLegacy>().getLRM();
297+
SlotIndexes &Indexes = getAnalysis<SlotIndexesWrapperPass>().getSI();
298+
LiveDebugVariables &DebugVars =
299+
getAnalysis<LiveDebugVariablesWrapperLegacy>().getLDV();
300+
301+
VirtRegRewriter R(ClearVirtRegs, &Indexes, &LIS, &LRM, &VRM, &DebugVars);
302+
return R.run(MF);
303+
}
304+
305+
PreservedAnalyses VirtRegRewriterPass::run(MachineFunction &MF,
306+
MachineFunctionAnalysisManager &MFAM) {
307+
VirtRegMap &VRM = MFAM.getResult<VirtRegMapAnalysis>(MF);
308+
LiveIntervals &LIS = MFAM.getResult<LiveIntervalsAnalysis>(MF);
309+
LiveRegMatrix &LRM = MFAM.getResult<LiveRegMatrixAnalysis>(MF);
310+
SlotIndexes &Indexes = MFAM.getResult<SlotIndexesAnalysis>(MF);
311+
LiveDebugVariables &DebugVars = MFAM.getResult<LiveDebugVariablesAnalysis>(MF);
312+
313+
VirtRegRewriter R(ClearVirtRegs, &Indexes, &LIS, &LRM, &VRM, &DebugVars);
314+
if (!R.run(MF))
315+
return PreservedAnalyses::all();
316+
auto PA = getMachineFunctionPassPreservedAnalyses();
317+
PA.preserveSet<CFGAnalyses>();
318+
PA.preserve<LiveIntervalsAnalysis>();
319+
PA.preserve<SlotIndexesAnalysis>();
320+
PA.preserve<LiveStacksAnalysis>();
321+
// LiveDebugVariables is preserved by default, so clear it
322+
// if this VRegRewriter is the last one in the pipeline.
323+
if (ClearVirtRegs)
324+
PA.abandon<LiveDebugVariablesAnalysis>();
325+
return PA;
326+
}
327+
328+
bool VirtRegRewriter::run(MachineFunction &fn) {
280329
MF = &fn;
281330
TRI = MF->getSubtarget().getRegisterInfo();
282331
TII = MF->getSubtarget().getInstrInfo();
283332
MRI = &MF->getRegInfo();
284-
Indexes = &getAnalysis<SlotIndexesWrapperPass>().getSI();
285-
LIS = &getAnalysis<LiveIntervalsWrapperPass>().getLIS();
286-
LRM = &getAnalysis<LiveRegMatrixWrapperLegacy>().getLRM();
287-
VRM = &getAnalysis<VirtRegMapWrapperLegacy>().getVRM();
288-
DebugVars = &getAnalysis<LiveDebugVariablesWrapperLegacy>().getLDV();
333+
289334
LLVM_DEBUG(dbgs() << "********** REWRITE VIRTUAL REGISTERS **********\n"
290335
<< "********** Function: " << MF->getName() << '\n');
291336
LLVM_DEBUG(VRM->dump());
@@ -726,6 +771,13 @@ void VirtRegRewriter::rewrite() {
726771
RewriteRegs.clear();
727772
}
728773

774+
void VirtRegRewriterPass::printPipeline(raw_ostream &OS, function_ref<StringRef(StringRef)>) const {
775+
OS << "virt-reg-rewriter<";
776+
if (!ClearVirtRegs)
777+
OS << "no-";
778+
OS << "clear-vregs>";
779+
}
780+
729781
FunctionPass *llvm::createVirtRegRewriter(bool ClearVirtRegs) {
730-
return new VirtRegRewriter(ClearVirtRegs);
782+
return new VirtRegRewriterLegacy(ClearVirtRegs);
731783
}

llvm/lib/Passes/PassBuilder.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1438,6 +1438,19 @@ Expected<bool> parseMachineSinkingPassOptions(StringRef Params) {
14381438
"MachineSinkingPass");
14391439
}
14401440

1441+
Expected<bool> parseVirtRegRewriterPassOptions(StringRef Params) {
1442+
bool ClearVirtRegs = true;
1443+
if (!Params.empty()) {
1444+
ClearVirtRegs = !Params.consume_front("no-");
1445+
if (Params != "clear-vregs")
1446+
return make_error<StringError>(
1447+
formatv("invalid VirtRegRewriter pass parameter '{0}' ", Params)
1448+
.str(),
1449+
inconvertibleErrorCode());
1450+
}
1451+
return ClearVirtRegs;
1452+
}
1453+
14411454
} // namespace
14421455

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

llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2237,7 +2237,7 @@ Error AMDGPUCodeGenPassBuilder::addRegAssignmentOptimized(
22372237
// many things rely on the use lists of the physical registers, such as the
22382238
// verifier. This is only necessary with allocators which use LiveIntervals,
22392239
// since FastRegAlloc does the replacements itself.
2240-
// TODO: addPass(VirtRegRewriterPass(false));
2240+
addPass(VirtRegRewriterPass(false));
22412241

22422242
// At this point, the sgpr-regalloc has been done and it is good to have the
22432243
// stack slot coloring to try to optimize the SGPR spill stack indices before
@@ -2253,7 +2253,7 @@ Error AMDGPUCodeGenPassBuilder::addRegAssignmentOptimized(
22532253
// For allocating other wwm register operands.
22542254
addRegAlloc<RAGreedyPass>(addPass, RegAllocPhase::WWM);
22552255
addPass(SILowerWWMCopiesPass());
2256-
// TODO: addPass(VirtRegRewriterPass(false));
2256+
addPass(VirtRegRewriterPass(false));
22572257
// TODO: addPass(AMDGPUReserveWWMRegsPass());
22582258

22592259
// For allocating per-thread VGPRs.

llvm/test/CodeGen/X86/pr30821.mir

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# RUN: llc -x mir < %s -run-pass=greedy,virtregrewriter,stack-slot-coloring | FileCheck %s
2+
# RUN: llc -x mir < %s -passes=greedy,virt-reg-rewriter,stack-slot-coloring | FileCheck %s
23
--- |
34
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
45
target triple = "x86_64-unknown-linux-gnu"

0 commit comments

Comments
 (0)