diff options
author | Akshat Oke <Akshat.Oke@amd.com> | 2025-04-30 14:10:46 +0530 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-04-30 14:10:46 +0530 |
commit | e91cbd4f299fd3f42928aff63f5d95f07be3f7fc (patch) | |
tree | 7242455dfb93f8afad3d50e87496edb414751e60 /llvm/lib/CodeGen/VirtRegMap.cpp | |
parent | f62f36b91de684ddfe129532e3a5086009b16f34 (diff) | |
download | llvm-e91cbd4f299fd3f42928aff63f5d95f07be3f7fc.zip llvm-e91cbd4f299fd3f42928aff63f5d95f07be3f7fc.tar.gz llvm-e91cbd4f299fd3f42928aff63f5d95f07be3f7fc.tar.bz2 |
[CodeGen][NPM] Port VirtRegRewriter to NPM (#130564)
Diffstat (limited to 'llvm/lib/CodeGen/VirtRegMap.cpp')
-rw-r--r-- | llvm/lib/CodeGen/VirtRegMap.cpp | 85 |
1 files changed, 69 insertions, 16 deletions
diff --git a/llvm/lib/CodeGen/VirtRegMap.cpp b/llvm/lib/CodeGen/VirtRegMap.cpp index 0fc3e5d..60859fd 100644 --- a/llvm/lib/CodeGen/VirtRegMap.cpp +++ b/llvm/lib/CodeGen/VirtRegMap.cpp @@ -197,7 +197,7 @@ VirtRegMap VirtRegMapAnalysis::run(MachineFunction &MF, // namespace { -class VirtRegRewriter : public MachineFunctionPass { +class VirtRegRewriter { MachineFunction *MF = nullptr; const TargetRegisterInfo *TRI = nullptr; const TargetInstrInfo *TII = nullptr; @@ -223,9 +223,21 @@ class VirtRegRewriter : public MachineFunctionPass { public: static char ID; - VirtRegRewriter(bool ClearVirtRegs_ = true) : - MachineFunctionPass(ID), - ClearVirtRegs(ClearVirtRegs_) {} + VirtRegRewriter(bool ClearVirtRegs, SlotIndexes *Indexes, LiveIntervals *LIS, + LiveRegMatrix *LRM, VirtRegMap *VRM, + LiveDebugVariables *DebugVars) + : Indexes(Indexes), LIS(LIS), LRM(LRM), VRM(VRM), DebugVars(DebugVars), + ClearVirtRegs(ClearVirtRegs) {} + + bool run(MachineFunction &); +}; + +class VirtRegRewriterLegacy : public MachineFunctionPass { +public: + static char ID; + bool ClearVirtRegs; + VirtRegRewriterLegacy(bool ClearVirtRegs = true) + : MachineFunctionPass(ID), ClearVirtRegs(ClearVirtRegs) {} void getAnalysisUsage(AnalysisUsage &AU) const override; @@ -243,11 +255,11 @@ public: } // end anonymous namespace -char VirtRegRewriter::ID = 0; +char VirtRegRewriterLegacy::ID = 0; -char &llvm::VirtRegRewriterID = VirtRegRewriter::ID; +char &llvm::VirtRegRewriterID = VirtRegRewriterLegacy::ID; -INITIALIZE_PASS_BEGIN(VirtRegRewriter, "virtregrewriter", +INITIALIZE_PASS_BEGIN(VirtRegRewriterLegacy, "virtregrewriter", "Virtual Register Rewriter", false, false) INITIALIZE_PASS_DEPENDENCY(SlotIndexesWrapperPass) INITIALIZE_PASS_DEPENDENCY(LiveIntervalsWrapperPass) @@ -255,10 +267,10 @@ INITIALIZE_PASS_DEPENDENCY(LiveDebugVariablesWrapperLegacy) INITIALIZE_PASS_DEPENDENCY(LiveRegMatrixWrapperLegacy) INITIALIZE_PASS_DEPENDENCY(LiveStacksWrapperLegacy) INITIALIZE_PASS_DEPENDENCY(VirtRegMapWrapperLegacy) -INITIALIZE_PASS_END(VirtRegRewriter, "virtregrewriter", +INITIALIZE_PASS_END(VirtRegRewriterLegacy, "virtregrewriter", "Virtual Register Rewriter", false, false) -void VirtRegRewriter::getAnalysisUsage(AnalysisUsage &AU) const { +void VirtRegRewriterLegacy::getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesCFG(); AU.addRequired<LiveIntervalsWrapperPass>(); AU.addPreserved<LiveIntervalsWrapperPass>(); @@ -276,16 +288,50 @@ void VirtRegRewriter::getAnalysisUsage(AnalysisUsage &AU) const { MachineFunctionPass::getAnalysisUsage(AU); } -bool VirtRegRewriter::runOnMachineFunction(MachineFunction &fn) { +bool VirtRegRewriterLegacy::runOnMachineFunction(MachineFunction &MF) { + VirtRegMap &VRM = getAnalysis<VirtRegMapWrapperLegacy>().getVRM(); + LiveIntervals &LIS = getAnalysis<LiveIntervalsWrapperPass>().getLIS(); + LiveRegMatrix &LRM = getAnalysis<LiveRegMatrixWrapperLegacy>().getLRM(); + SlotIndexes &Indexes = getAnalysis<SlotIndexesWrapperPass>().getSI(); + LiveDebugVariables &DebugVars = + getAnalysis<LiveDebugVariablesWrapperLegacy>().getLDV(); + + VirtRegRewriter R(ClearVirtRegs, &Indexes, &LIS, &LRM, &VRM, &DebugVars); + return R.run(MF); +} + +PreservedAnalyses +VirtRegRewriterPass::run(MachineFunction &MF, + MachineFunctionAnalysisManager &MFAM) { + VirtRegMap &VRM = MFAM.getResult<VirtRegMapAnalysis>(MF); + LiveIntervals &LIS = MFAM.getResult<LiveIntervalsAnalysis>(MF); + LiveRegMatrix &LRM = MFAM.getResult<LiveRegMatrixAnalysis>(MF); + SlotIndexes &Indexes = MFAM.getResult<SlotIndexesAnalysis>(MF); + LiveDebugVariables &DebugVars = + MFAM.getResult<LiveDebugVariablesAnalysis>(MF); + + VirtRegRewriter R(ClearVirtRegs, &Indexes, &LIS, &LRM, &VRM, &DebugVars); + if (!R.run(MF)) + return PreservedAnalyses::all(); + + auto PA = getMachineFunctionPassPreservedAnalyses(); + PA.preserveSet<CFGAnalyses>(); + PA.preserve<LiveIntervalsAnalysis>(); + PA.preserve<SlotIndexesAnalysis>(); + PA.preserve<LiveStacksAnalysis>(); + // LiveDebugVariables is preserved by default, so clear it + // if this VRegRewriter is the last one in the pipeline. + if (ClearVirtRegs) + PA.abandon<LiveDebugVariablesAnalysis>(); + return PA; +} + +bool VirtRegRewriter::run(MachineFunction &fn) { MF = &fn; TRI = MF->getSubtarget().getRegisterInfo(); TII = MF->getSubtarget().getInstrInfo(); MRI = &MF->getRegInfo(); - Indexes = &getAnalysis<SlotIndexesWrapperPass>().getSI(); - LIS = &getAnalysis<LiveIntervalsWrapperPass>().getLIS(); - LRM = &getAnalysis<LiveRegMatrixWrapperLegacy>().getLRM(); - VRM = &getAnalysis<VirtRegMapWrapperLegacy>().getVRM(); - DebugVars = &getAnalysis<LiveDebugVariablesWrapperLegacy>().getLDV(); + LLVM_DEBUG(dbgs() << "********** REWRITE VIRTUAL REGISTERS **********\n" << "********** Function: " << MF->getName() << '\n'); LLVM_DEBUG(VRM->dump()); @@ -726,6 +772,13 @@ void VirtRegRewriter::rewrite() { RewriteRegs.clear(); } +void VirtRegRewriterPass::printPipeline( + raw_ostream &OS, function_ref<StringRef(StringRef)>) const { + OS << "virt-reg-rewriter"; + if (!ClearVirtRegs) + OS << "<no-clear-vregs>"; +} + FunctionPass *llvm::createVirtRegRewriter(bool ClearVirtRegs) { - return new VirtRegRewriter(ClearVirtRegs); + return new VirtRegRewriterLegacy(ClearVirtRegs); } |