Skip to content

Commit b1194b9

Browse files
committed
[CodeGen][NPM] Port VirtRegRewriter to NPM
Not sure why this is squished into VirtRegMap.h
1 parent f69e5df commit b1194b9

File tree

12 files changed

+115
-22
lines changed

12 files changed

+115
-22
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
@@ -82,6 +82,7 @@
8282
#include "llvm/CodeGen/TargetPassConfig.h"
8383
#include "llvm/CodeGen/TwoAddressInstructionPass.h"
8484
#include "llvm/CodeGen/UnreachableBlockElim.h"
85+
#include "llvm/CodeGen/VirtRegMap.h"
8586
#include "llvm/CodeGen/WasmEHPrepare.h"
8687
#include "llvm/CodeGen/WinEHPrepare.h"
8788
#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
@@ -216,6 +216,12 @@ MACHINE_FUNCTION_PASS_WITH_PARAMS(
216216
return parseRegAllocGreedyFilterFunc(*PB, Params);
217217
}, "reg-filter"
218218
)
219+
220+
MACHINE_FUNCTION_PASS_WITH_PARAMS(
221+
"virt-reg-rewriter", "VirtRegRewriterPass",
222+
[](bool ClearVirtRegs) { return VirtRegRewriterPass(ClearVirtRegs); },
223+
parseVirtRegRewriterPassOptions, "no-clear-vregs;clear-vregs")
224+
219225
#undef MACHINE_FUNCTION_PASS_WITH_PARAMS
220226

221227
// 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
@@ -1439,6 +1439,19 @@ Expected<bool> parseMachineSinkingPassOptions(StringRef Params) {
14391439
"MachineSinkingPass");
14401440
}
14411441

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

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

llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp

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

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

22602260
// For allocating per-thread VGPRs.
22612261
addRegAlloc<RAGreedyPass>(addPass, RegAllocPhase::VGPR);
22622262

22632263
// TODO: addPreRewrite();
2264-
addPass(VirtRegRewriterPass(false));
2264+
addPass(VirtRegRewriterPass(true));
22652265

22662266
// TODO: addPass(AMDGPUMarkLastScratchLoadPass());
22672267
return Error::success();

llvm/test/CodeGen/AMDGPU/alloc-aligned-tuples-gfx90a.mir

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
# RUN: llc -mtriple=amdgcn -mcpu=gfx90a -start-before=greedy,0 -stop-after=virtregrewriter,2 -verify-machineinstrs -o - %s | FileCheck --check-prefixes=GCN,GFX90A %s
2+
3+
# RUN: llc -enable-new-pm -mtriple=amdgcn -mcpu=gfx90a -start-before=greedy,0 -stop-after=virtregrewriter,2 -verify-machineinstrs -o - %s | FileCheck --check-prefixes=GCN,GFX90A %s
24
# Using the unaligned vector tuples are OK as long as they aren't used
35
# in a real instruction.
46

llvm/test/CodeGen/AMDGPU/fold-restore-undef-use.mir

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
22
# RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx90a -stress-regalloc=4 -verify-regalloc -start-before=greedy,0 -stop-after=virtregrewriter,0 %s -o - | FileCheck %s
33

4+
# RUN: llc -enable-new-pm -mtriple=amdgcn-amd-amdhsa -mcpu=gfx90a -stress-regalloc=4 -verify-regalloc -passes="greedy<sgpr>,virt-reg-rewriter<no-clear-vregs>" %s -o - | FileCheck %s
5+
46
# Check that we don't generate *** Bad machine code: Instruction loads
57
# from dead spill slot ***
68

llvm/test/CodeGen/AMDGPU/greedy-remark-crash-unassigned-reg.mir

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22
# RUN: -start-before=greedy,0 -stop-after=virtregrewriter,0 -pass-remarks='.*' -pass-remarks-output=%t.yaml -o /dev/null %s
33
# RUN: FileCheck %s < %t.yaml
44

5+
# RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 \
6+
# RUN: -passes='greedy<sgpr>,virt-reg-rewriter<no-clear-vregs>' -pass-remarks='.*' -pass-remarks-output=%t.yaml -o /dev/null %s
7+
# RUN: FileCheck %s < %t.yaml
8+
59
# CHECK: Name: SpillReloadCopies
610
# CHECK-NEXT: Function: func
711
# CHECK-NEXT: Args:

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)