aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/CodeGen/VirtRegMap.cpp
diff options
context:
space:
mode:
authorAkshat Oke <Akshat.Oke@amd.com>2025-04-30 14:10:46 +0530
committerGitHub <noreply@github.com>2025-04-30 14:10:46 +0530
commite91cbd4f299fd3f42928aff63f5d95f07be3f7fc (patch)
tree7242455dfb93f8afad3d50e87496edb414751e60 /llvm/lib/CodeGen/VirtRegMap.cpp
parentf62f36b91de684ddfe129532e3a5086009b16f34 (diff)
downloadllvm-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.cpp85
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);
}