From 172c6d6bf5030a7ceba9b2028acc9bd0157fd228 Mon Sep 17 00:00:00 2001 From: Akshat Oke Date: Fri, 8 Nov 2024 11:46:15 +0000 Subject: [PATCH 1/7] [CodeGen][NewPM] Port LiveDebugVariables to NPM --- .../include/llvm/CodeGen/LiveDebugVariables.h | 49 +++++++++-- llvm/include/llvm/InitializePasses.h | 2 +- llvm/lib/CodeGen/CodeGen.cpp | 2 +- llvm/lib/CodeGen/LiveDebugVariables.cpp | 88 +++++++++++-------- llvm/lib/CodeGen/RegAllocBasic.cpp | 6 +- llvm/lib/CodeGen/RegAllocGreedy.cpp | 8 +- llvm/lib/CodeGen/RegAllocGreedy.h | 3 +- llvm/lib/CodeGen/StackSlotColoring.cpp | 2 +- llvm/lib/CodeGen/VirtRegMap.cpp | 8 +- .../LoongArchDeadRegisterDefinitions.cpp | 2 +- .../RISCV/RISCVDeadRegisterDefinitions.cpp | 2 +- llvm/lib/Target/RISCV/RISCVInsertVSETVLI.cpp | 2 +- 12 files changed, 114 insertions(+), 60 deletions(-) diff --git a/llvm/include/llvm/CodeGen/LiveDebugVariables.h b/llvm/include/llvm/CodeGen/LiveDebugVariables.h index a4b5a87fd3887..81dcd22d214fc 100644 --- a/llvm/include/llvm/CodeGen/LiveDebugVariables.h +++ b/llvm/include/llvm/CodeGen/LiveDebugVariables.h @@ -21,7 +21,9 @@ #define LLVM_CODEGEN_LIVEDEBUGVARIABLES_H #include "llvm/CodeGen/MachineFunctionPass.h" +#include "llvm/IR/PassManager.h" #include "llvm/Support/Compiler.h" +#include namespace llvm { @@ -29,15 +31,24 @@ template class ArrayRef; class LiveIntervals; class VirtRegMap; -class LiveDebugVariables : public MachineFunctionPass { - void *pImpl = nullptr; +class LiveDebugVariables { +private: + void *PImpl; public: - static char ID; // Pass identification, replacement for typeid + LiveDebugVariables() = default; + ~LiveDebugVariables(); + + LiveDebugVariables(LiveDebugVariables &&Other) : PImpl(Other.PImpl) { + Other.PImpl = nullptr; + } + + LiveDebugVariables &operator=(LiveDebugVariables &&Other); - LiveDebugVariables(); - ~LiveDebugVariables() override; + LiveDebugVariables &operator=(const LiveDebugVariables &) = delete; + LiveDebugVariables(const LiveDebugVariables &) = delete; + void analyze(MachineFunction &MF, LiveIntervals *LIS); /// splitRegister - Move any user variables in OldReg to the live ranges in /// NewRegs where they are live. Mark the values as unavailable where no new /// register is live. @@ -52,9 +63,23 @@ class LiveDebugVariables : public MachineFunctionPass { /// dump - Print data structures to dbgs(). void dump() const; -private: + void releaseMemory(); +}; + +class LiveDebugVariablesWrapperPass : public MachineFunctionPass { + std::unique_ptr Impl; + +public: + static char ID; // Pass identification, replacement for typeid + + LiveDebugVariablesWrapperPass(); + bool runOnMachineFunction(MachineFunction &) override; - void releaseMemory() override; + + LiveDebugVariables &getLDV() { return *Impl; } + const LiveDebugVariables &getLDV() const { return *Impl; } + + void releaseMemory() override { Impl->releaseMemory(); } void getAnalysisUsage(AnalysisUsage &) const override; MachineFunctionProperties getSetProperties() const override { @@ -63,6 +88,16 @@ class LiveDebugVariables : public MachineFunctionPass { } }; +class LiveDebugVariablesAnalysis + : public AnalysisInfoMixin { + friend AnalysisInfoMixin; + static AnalysisKey Key; + +public: + using Result = LiveDebugVariables; + Result run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM); +}; + } // end namespace llvm #endif // LLVM_CODEGEN_LIVEDEBUGVARIABLES_H diff --git a/llvm/include/llvm/InitializePasses.h b/llvm/include/llvm/InitializePasses.h index 88bca2c75c949..7a79c0f19b145 100644 --- a/llvm/include/llvm/InitializePasses.h +++ b/llvm/include/llvm/InitializePasses.h @@ -154,7 +154,7 @@ void initializeLegalizerPass(PassRegistry &); void initializeGISelCSEAnalysisWrapperPassPass(PassRegistry &); void initializeGISelKnownBitsAnalysisPass(PassRegistry &); void initializeLiveDebugValuesPass(PassRegistry &); -void initializeLiveDebugVariablesPass(PassRegistry &); +void initializeLiveDebugVariablesWrapperPassPass(PassRegistry &); void initializeLiveIntervalsWrapperPassPass(PassRegistry &); void initializeLiveRangeShrinkPass(PassRegistry &); void initializeLiveRegMatrixWrapperLegacyPass(PassRegistry &); diff --git a/llvm/lib/CodeGen/CodeGen.cpp b/llvm/lib/CodeGen/CodeGen.cpp index 408395fefc298..07605a54b3193 100644 --- a/llvm/lib/CodeGen/CodeGen.cpp +++ b/llvm/lib/CodeGen/CodeGen.cpp @@ -59,7 +59,7 @@ void llvm::initializeCodeGen(PassRegistry &Registry) { initializeInterleavedAccessPass(Registry); initializeJMCInstrumenterPass(Registry); initializeLiveDebugValuesPass(Registry); - initializeLiveDebugVariablesPass(Registry); + initializeLiveDebugVariablesWrapperPassPass(Registry); initializeLiveIntervalsWrapperPassPass(Registry); initializeLiveRangeShrinkPass(Registry); initializeLiveStacksPass(Registry); diff --git a/llvm/lib/CodeGen/LiveDebugVariables.cpp b/llvm/lib/CodeGen/LiveDebugVariables.cpp index 2ff346d3fd022..6b26e8c9555d2 100644 --- a/llvm/lib/CodeGen/LiveDebugVariables.cpp +++ b/llvm/lib/CodeGen/LiveDebugVariables.cpp @@ -74,24 +74,25 @@ EnableLDV("live-debug-variables", cl::init(true), STATISTIC(NumInsertedDebugValues, "Number of DBG_VALUEs inserted"); STATISTIC(NumInsertedDebugLabels, "Number of DBG_LABELs inserted"); -char LiveDebugVariables::ID = 0; +char LiveDebugVariablesWrapperPass::ID = 0; -INITIALIZE_PASS_BEGIN(LiveDebugVariables, DEBUG_TYPE, - "Debug Variable Analysis", false, false) +INITIALIZE_PASS_BEGIN(LiveDebugVariablesWrapperPass, DEBUG_TYPE, + "Debug Variable Analysis", false, false) INITIALIZE_PASS_DEPENDENCY(MachineDominatorTreeWrapperPass) INITIALIZE_PASS_DEPENDENCY(LiveIntervalsWrapperPass) -INITIALIZE_PASS_END(LiveDebugVariables, DEBUG_TYPE, - "Debug Variable Analysis", false, false) +INITIALIZE_PASS_END(LiveDebugVariablesWrapperPass, DEBUG_TYPE, + "Debug Variable Analysis", false, false) -void LiveDebugVariables::getAnalysisUsage(AnalysisUsage &AU) const { +void LiveDebugVariablesWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const { AU.addRequired(); AU.addRequiredTransitive(); AU.setPreservesAll(); MachineFunctionPass::getAnalysisUsage(AU); } -LiveDebugVariables::LiveDebugVariables() : MachineFunctionPass(ID) { - initializeLiveDebugVariablesPass(*PassRegistry::getPassRegistry()); +LiveDebugVariablesWrapperPass::LiveDebugVariablesWrapperPass() + : MachineFunctionPass(ID) { + initializeLiveDebugVariablesWrapperPassPass(*PassRegistry::getPassRegistry()); } enum : unsigned { UndefLocNo = ~0U }; @@ -530,7 +531,6 @@ class UserLabel { /// Implementation of the LiveDebugVariables pass. class LDVImpl { - LiveDebugVariables &pass; LocMap::Allocator allocator; MachineFunction *MF = nullptr; LiveIntervals *LIS; @@ -634,7 +634,7 @@ class LDVImpl { void computeIntervals(); public: - LDVImpl(LiveDebugVariables *ps) : pass(*ps) {} + LDVImpl(LiveIntervals *LIS) : LIS(LIS) {} bool runOnMachineFunction(MachineFunction &mf, bool InstrRef); @@ -1263,7 +1263,6 @@ void LDVImpl::computeIntervals() { bool LDVImpl::runOnMachineFunction(MachineFunction &mf, bool InstrRef) { clear(); MF = &mf; - LIS = &pass.getAnalysis().getLIS(); TRI = mf.getSubtarget().getRegisterInfo(); LLVM_DEBUG(dbgs() << "********** COMPUTING LIVE DEBUG VARIABLES: " << mf.getName() << " **********\n"); @@ -1298,31 +1297,50 @@ static void removeDebugInstrs(MachineFunction &mf) { } } -bool LiveDebugVariables::runOnMachineFunction(MachineFunction &mf) { - if (!EnableLDV) - return false; - if (!mf.getFunction().getSubprogram()) { - removeDebugInstrs(mf); - return false; - } +bool LiveDebugVariablesWrapperPass::runOnMachineFunction(MachineFunction &mf) { + auto *LIS = &getAnalysis().getLIS(); - // Have we been asked to track variable locations using instruction - // referencing? - bool InstrRef = mf.useDebugInstrRef(); + Impl = std::make_unique(); + Impl->analyze(mf, LIS); + return false; +} + +AnalysisKey LiveDebugVariablesAnalysis::Key; + +LiveDebugVariables +LiveDebugVariablesAnalysis::run(MachineFunction &MF, + MachineFunctionAnalysisManager &MFAM) { + auto *LIS = &MFAM.getResult(MF); + LiveDebugVariables LDV; + LDV.analyze(MF, LIS); + return LDV; +} - if (!pImpl) - pImpl = new LDVImpl(this); - return static_cast(pImpl)->runOnMachineFunction(mf, InstrRef); +LiveDebugVariables::~LiveDebugVariables() { + if (PImpl) + delete static_cast(PImpl); } void LiveDebugVariables::releaseMemory() { - if (pImpl) - static_cast(pImpl)->clear(); + if (PImpl) + static_cast(PImpl)->clear(); } -LiveDebugVariables::~LiveDebugVariables() { - if (pImpl) - delete static_cast(pImpl); +void LiveDebugVariables::analyze(MachineFunction &MF, LiveIntervals *LIS) { + if (!EnableLDV) + return; + if (!MF.getFunction().getSubprogram()) { + removeDebugInstrs(MF); + return; + } + + if (!PImpl) + PImpl = new LDVImpl(LIS); // reuse same object across analysis runs + + // Have we been asked to track variable locations using instruction + // referencing? + bool InstrRef = MF.useDebugInstrRef(); + static_cast(PImpl)->runOnMachineFunction(MF, InstrRef); } //===----------------------------------------------------------------------===// @@ -1504,8 +1522,8 @@ void LDVImpl::splitRegister(Register OldReg, ArrayRef NewRegs) { void LiveDebugVariables:: splitRegister(Register OldReg, ArrayRef NewRegs, LiveIntervals &LIS) { - if (pImpl) - static_cast(pImpl)->splitRegister(OldReg, NewRegs); + if (PImpl) + static_cast(PImpl)->splitRegister(OldReg, NewRegs); } void UserValue::rewriteLocations(VirtRegMap &VRM, const MachineFunction &MF, @@ -1956,13 +1974,13 @@ void LDVImpl::emitDebugValues(VirtRegMap *VRM) { } void LiveDebugVariables::emitDebugValues(VirtRegMap *VRM) { - if (pImpl) - static_cast(pImpl)->emitDebugValues(VRM); + if (PImpl) + static_cast(PImpl)->emitDebugValues(VRM); } #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) LLVM_DUMP_METHOD void LiveDebugVariables::dump() const { - if (pImpl) - static_cast(pImpl)->print(dbgs()); + if (PImpl) + static_cast(PImpl)->print(dbgs()); } #endif diff --git a/llvm/lib/CodeGen/RegAllocBasic.cpp b/llvm/lib/CodeGen/RegAllocBasic.cpp index 55d806e768b91..647bbdb66a3fe 100644 --- a/llvm/lib/CodeGen/RegAllocBasic.cpp +++ b/llvm/lib/CodeGen/RegAllocBasic.cpp @@ -130,7 +130,7 @@ char &llvm::RABasicID = RABasic::ID; INITIALIZE_PASS_BEGIN(RABasic, "regallocbasic", "Basic Register Allocator", false, false) -INITIALIZE_PASS_DEPENDENCY(LiveDebugVariables) +INITIALIZE_PASS_DEPENDENCY(LiveDebugVariablesWrapperPass) INITIALIZE_PASS_DEPENDENCY(SlotIndexesWrapperPass) INITIALIZE_PASS_DEPENDENCY(LiveIntervalsWrapperPass) INITIALIZE_PASS_DEPENDENCY(RegisterCoalescer) @@ -180,8 +180,8 @@ void RABasic::getAnalysisUsage(AnalysisUsage &AU) const { AU.addRequired(); AU.addPreserved(); AU.addPreserved(); - AU.addRequired(); - AU.addPreserved(); + AU.addRequired(); + AU.addPreserved(); AU.addRequired(); AU.addPreserved(); AU.addRequired(); diff --git a/llvm/lib/CodeGen/RegAllocGreedy.cpp b/llvm/lib/CodeGen/RegAllocGreedy.cpp index d0d2c585f0b54..8930e2e6d1a6e 100644 --- a/llvm/lib/CodeGen/RegAllocGreedy.cpp +++ b/llvm/lib/CodeGen/RegAllocGreedy.cpp @@ -151,7 +151,7 @@ char &llvm::RAGreedyID = RAGreedy::ID; INITIALIZE_PASS_BEGIN(RAGreedy, "greedy", "Greedy Register Allocator", false, false) -INITIALIZE_PASS_DEPENDENCY(LiveDebugVariables) +INITIALIZE_PASS_DEPENDENCY(LiveDebugVariablesWrapperPass) INITIALIZE_PASS_DEPENDENCY(SlotIndexesWrapperPass) INITIALIZE_PASS_DEPENDENCY(LiveIntervalsWrapperPass) INITIALIZE_PASS_DEPENDENCY(RegisterCoalescer) @@ -204,8 +204,8 @@ void RAGreedy::getAnalysisUsage(AnalysisUsage &AU) const { AU.addPreserved(); AU.addRequired(); AU.addPreserved(); - AU.addRequired(); - AU.addPreserved(); + AU.addRequired(); + AU.addPreserved(); AU.addRequired(); AU.addPreserved(); AU.addRequired(); @@ -2732,7 +2732,7 @@ bool RAGreedy::runOnMachineFunction(MachineFunction &mf) { Loops = &getAnalysis().getLI(); Bundles = &getAnalysis().getEdgeBundles(); SpillPlacer = &getAnalysis().getResult(); - DebugVars = &getAnalysis(); + DebugVars = &getAnalysis().getLDV(); initializeCSRCost(); diff --git a/llvm/lib/CodeGen/RegAllocGreedy.h b/llvm/lib/CodeGen/RegAllocGreedy.h index 9578b8d3bef87..67c7f3acd7b31 100644 --- a/llvm/lib/CodeGen/RegAllocGreedy.h +++ b/llvm/lib/CodeGen/RegAllocGreedy.h @@ -24,6 +24,7 @@ #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringRef.h" #include "llvm/CodeGen/CalcSpillWeights.h" +#include "llvm/CodeGen/LiveDebugVariables.h" #include "llvm/CodeGen/LiveInterval.h" #include "llvm/CodeGen/LiveRangeEdit.h" #include "llvm/CodeGen/MachineFunction.h" @@ -42,7 +43,7 @@ namespace llvm { class AllocationOrder; class AnalysisUsage; class EdgeBundles; -class LiveDebugVariables; +class LiveDebugVariablesWrapperPass; class LiveIntervals; class LiveRegMatrix; class MachineBasicBlock; diff --git a/llvm/lib/CodeGen/StackSlotColoring.cpp b/llvm/lib/CodeGen/StackSlotColoring.cpp index a1fa266354a52..2a3af37b351d7 100644 --- a/llvm/lib/CodeGen/StackSlotColoring.cpp +++ b/llvm/lib/CodeGen/StackSlotColoring.cpp @@ -159,7 +159,7 @@ namespace { // may be invoked multiple times requiring it to save these analyses to be // used by RA later. AU.addPreserved(); - AU.addPreserved(); + AU.addPreserved(); MachineFunctionPass::getAnalysisUsage(AU); } diff --git a/llvm/lib/CodeGen/VirtRegMap.cpp b/llvm/lib/CodeGen/VirtRegMap.cpp index 26a12512c87be..9cf631cd20ea4 100644 --- a/llvm/lib/CodeGen/VirtRegMap.cpp +++ b/llvm/lib/CodeGen/VirtRegMap.cpp @@ -251,7 +251,7 @@ INITIALIZE_PASS_BEGIN(VirtRegRewriter, "virtregrewriter", "Virtual Register Rewriter", false, false) INITIALIZE_PASS_DEPENDENCY(SlotIndexesWrapperPass) INITIALIZE_PASS_DEPENDENCY(LiveIntervalsWrapperPass) -INITIALIZE_PASS_DEPENDENCY(LiveDebugVariables) +INITIALIZE_PASS_DEPENDENCY(LiveDebugVariablesWrapperPass) INITIALIZE_PASS_DEPENDENCY(LiveRegMatrixWrapperLegacy) INITIALIZE_PASS_DEPENDENCY(LiveStacks) INITIALIZE_PASS_DEPENDENCY(VirtRegMapWrapperLegacy) @@ -264,14 +264,14 @@ void VirtRegRewriter::getAnalysisUsage(AnalysisUsage &AU) const { AU.addPreserved(); AU.addRequired(); AU.addPreserved(); - AU.addRequired(); + AU.addRequired(); AU.addRequired(); AU.addPreserved(); AU.addRequired(); AU.addRequired(); if (!ClearVirtRegs) - AU.addPreserved(); + AU.addPreserved(); MachineFunctionPass::getAnalysisUsage(AU); } @@ -285,7 +285,7 @@ bool VirtRegRewriter::runOnMachineFunction(MachineFunction &fn) { LIS = &getAnalysis().getLIS(); LRM = &getAnalysis().getLRM(); VRM = &getAnalysis().getVRM(); - DebugVars = &getAnalysis(); + DebugVars = &getAnalysis().getLDV(); LLVM_DEBUG(dbgs() << "********** REWRITE VIRTUAL REGISTERS **********\n" << "********** Function: " << MF->getName() << '\n'); LLVM_DEBUG(VRM->dump()); diff --git a/llvm/lib/Target/LoongArch/LoongArchDeadRegisterDefinitions.cpp b/llvm/lib/Target/LoongArch/LoongArchDeadRegisterDefinitions.cpp index f0e6837d49a97..96f6f7fe49278 100644 --- a/llvm/lib/Target/LoongArch/LoongArchDeadRegisterDefinitions.cpp +++ b/llvm/lib/Target/LoongArch/LoongArchDeadRegisterDefinitions.cpp @@ -37,7 +37,7 @@ class LoongArchDeadRegisterDefinitions : public MachineFunctionPass { AU.addPreserved(); AU.addRequired(); AU.addPreserved(); - AU.addPreserved(); + AU.addPreserved(); AU.addPreserved(); MachineFunctionPass::getAnalysisUsage(AU); } diff --git a/llvm/lib/Target/RISCV/RISCVDeadRegisterDefinitions.cpp b/llvm/lib/Target/RISCV/RISCVDeadRegisterDefinitions.cpp index 4b35f3bb0a524..a2dbe3faf0e59 100644 --- a/llvm/lib/Target/RISCV/RISCVDeadRegisterDefinitions.cpp +++ b/llvm/lib/Target/RISCV/RISCVDeadRegisterDefinitions.cpp @@ -37,7 +37,7 @@ class RISCVDeadRegisterDefinitions : public MachineFunctionPass { AU.addPreserved(); AU.addRequired(); AU.addPreserved(); - AU.addPreserved(); + AU.addPreserved(); AU.addPreserved(); MachineFunctionPass::getAnalysisUsage(AU); } diff --git a/llvm/lib/Target/RISCV/RISCVInsertVSETVLI.cpp b/llvm/lib/Target/RISCV/RISCVInsertVSETVLI.cpp index 421150a370199..6f3c0b7b0aa1f 100644 --- a/llvm/lib/Target/RISCV/RISCVInsertVSETVLI.cpp +++ b/llvm/lib/Target/RISCV/RISCVInsertVSETVLI.cpp @@ -889,7 +889,7 @@ class RISCVInsertVSETVLI : public MachineFunctionPass { AU.addUsedIfAvailable(); AU.addPreserved(); AU.addPreserved(); - AU.addPreserved(); + AU.addPreserved(); AU.addPreserved(); MachineFunctionPass::getAnalysisUsage(AU); From 352f9094f1efcd5cd724257050c74086b196bfd3 Mon Sep 17 00:00:00 2001 From: Akshat Oke Date: Fri, 22 Nov 2024 11:56:19 +0000 Subject: [PATCH 2/7] Use unique_ptr --- llvm/include/llvm/CodeGen/LiveDebugVariables.h | 15 ++++----------- llvm/lib/CodeGen/LiveDebugVariables.cpp | 18 ++++++++---------- 2 files changed, 12 insertions(+), 21 deletions(-) diff --git a/llvm/include/llvm/CodeGen/LiveDebugVariables.h b/llvm/include/llvm/CodeGen/LiveDebugVariables.h index 81dcd22d214fc..dc59d1be78b91 100644 --- a/llvm/include/llvm/CodeGen/LiveDebugVariables.h +++ b/llvm/include/llvm/CodeGen/LiveDebugVariables.h @@ -33,20 +33,13 @@ class VirtRegMap; class LiveDebugVariables { private: - void *PImpl; + struct Deleter { + void operator()(void *Ptr) const; + }; + std::unique_ptr PImpl; public: LiveDebugVariables() = default; - ~LiveDebugVariables(); - - LiveDebugVariables(LiveDebugVariables &&Other) : PImpl(Other.PImpl) { - Other.PImpl = nullptr; - } - - LiveDebugVariables &operator=(LiveDebugVariables &&Other); - - LiveDebugVariables &operator=(const LiveDebugVariables &) = delete; - LiveDebugVariables(const LiveDebugVariables &) = delete; void analyze(MachineFunction &MF, LiveIntervals *LIS); /// splitRegister - Move any user variables in OldReg to the live ranges in diff --git a/llvm/lib/CodeGen/LiveDebugVariables.cpp b/llvm/lib/CodeGen/LiveDebugVariables.cpp index 6b26e8c9555d2..68acec5555c15 100644 --- a/llvm/lib/CodeGen/LiveDebugVariables.cpp +++ b/llvm/lib/CodeGen/LiveDebugVariables.cpp @@ -1316,14 +1316,13 @@ LiveDebugVariablesAnalysis::run(MachineFunction &MF, return LDV; } -LiveDebugVariables::~LiveDebugVariables() { - if (PImpl) - delete static_cast(PImpl); +void LiveDebugVariables::Deleter::operator()(void *Ptr) const { + delete static_cast(Ptr); } void LiveDebugVariables::releaseMemory() { if (PImpl) - static_cast(PImpl)->clear(); + static_cast(PImpl.get())->clear(); } void LiveDebugVariables::analyze(MachineFunction &MF, LiveIntervals *LIS) { @@ -1334,13 +1333,12 @@ void LiveDebugVariables::analyze(MachineFunction &MF, LiveIntervals *LIS) { return; } - if (!PImpl) - PImpl = new LDVImpl(LIS); // reuse same object across analysis runs + PImpl.reset(new LDVImpl(LIS)); // Have we been asked to track variable locations using instruction // referencing? bool InstrRef = MF.useDebugInstrRef(); - static_cast(PImpl)->runOnMachineFunction(MF, InstrRef); + static_cast(PImpl.get())->runOnMachineFunction(MF, InstrRef); } //===----------------------------------------------------------------------===// @@ -1523,7 +1521,7 @@ void LDVImpl::splitRegister(Register OldReg, ArrayRef NewRegs) { void LiveDebugVariables:: splitRegister(Register OldReg, ArrayRef NewRegs, LiveIntervals &LIS) { if (PImpl) - static_cast(PImpl)->splitRegister(OldReg, NewRegs); + static_cast(PImpl.get())->splitRegister(OldReg, NewRegs); } void UserValue::rewriteLocations(VirtRegMap &VRM, const MachineFunction &MF, @@ -1975,12 +1973,12 @@ void LDVImpl::emitDebugValues(VirtRegMap *VRM) { void LiveDebugVariables::emitDebugValues(VirtRegMap *VRM) { if (PImpl) - static_cast(PImpl)->emitDebugValues(VRM); + static_cast(PImpl.get())->emitDebugValues(VRM); } #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) LLVM_DUMP_METHOD void LiveDebugVariables::dump() const { if (PImpl) - static_cast(PImpl)->print(dbgs()); + static_cast(PImpl.get())->print(dbgs()); } #endif From bc70f894b36806996b7a062ab1ce644a326488b5 Mon Sep 17 00:00:00 2001 From: Akshat Oke Date: Mon, 2 Dec 2024 08:11:06 +0000 Subject: [PATCH 3/7] Rename to Legacy, add printer and invalidate --- .../include/llvm/CodeGen/LiveDebugVariables.h | 17 ++++++- llvm/include/llvm/InitializePasses.h | 2 +- llvm/lib/CodeGen/CodeGen.cpp | 2 +- llvm/lib/CodeGen/LiveDebugVariables.cpp | 45 ++++++++++++++----- llvm/lib/CodeGen/RegAllocBasic.cpp | 6 +-- llvm/lib/CodeGen/RegAllocGreedy.cpp | 8 ++-- llvm/lib/CodeGen/RegAllocGreedy.h | 2 +- llvm/lib/CodeGen/StackSlotColoring.cpp | 2 +- llvm/lib/CodeGen/VirtRegMap.cpp | 8 ++-- .../LoongArchDeadRegisterDefinitions.cpp | 2 +- .../RISCV/RISCVDeadRegisterDefinitions.cpp | 2 +- llvm/lib/Target/RISCV/RISCVInsertVSETVLI.cpp | 2 +- 12 files changed, 66 insertions(+), 32 deletions(-) diff --git a/llvm/include/llvm/CodeGen/LiveDebugVariables.h b/llvm/include/llvm/CodeGen/LiveDebugVariables.h index dc59d1be78b91..45c3bb8051e1e 100644 --- a/llvm/include/llvm/CodeGen/LiveDebugVariables.h +++ b/llvm/include/llvm/CodeGen/LiveDebugVariables.h @@ -53,19 +53,26 @@ class LiveDebugVariables { /// @param VRM Rename virtual registers according to map. void emitDebugValues(VirtRegMap *VRM); +#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) /// dump - Print data structures to dbgs(). void dump() const; +#endif + + void print(raw_ostream &OS) const; void releaseMemory(); + + bool invalidate(MachineFunction &MF, const PreservedAnalyses &PA, + MachineFunctionAnalysisManager::Invalidator &Inv); }; -class LiveDebugVariablesWrapperPass : public MachineFunctionPass { +class LiveDebugVariablesWrapperLegacy : public MachineFunctionPass { std::unique_ptr Impl; public: static char ID; // Pass identification, replacement for typeid - LiveDebugVariablesWrapperPass(); + LiveDebugVariablesWrapperLegacy(); bool runOnMachineFunction(MachineFunction &) override; @@ -91,6 +98,12 @@ class LiveDebugVariablesAnalysis Result run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM); }; +class LiveDebugVariablesPrinterPass + : public PassInfoMixin { +public: + PreservedAnalyses run(MachineFunction &MF, + MachineFunctionAnalysisManager &MFAM); +}; } // end namespace llvm #endif // LLVM_CODEGEN_LIVEDEBUGVARIABLES_H diff --git a/llvm/include/llvm/InitializePasses.h b/llvm/include/llvm/InitializePasses.h index 7a79c0f19b145..7b81c9a8e143a 100644 --- a/llvm/include/llvm/InitializePasses.h +++ b/llvm/include/llvm/InitializePasses.h @@ -154,7 +154,7 @@ void initializeLegalizerPass(PassRegistry &); void initializeGISelCSEAnalysisWrapperPassPass(PassRegistry &); void initializeGISelKnownBitsAnalysisPass(PassRegistry &); void initializeLiveDebugValuesPass(PassRegistry &); -void initializeLiveDebugVariablesWrapperPassPass(PassRegistry &); +void initializeLiveDebugVariablesWrapperLegacyPass(PassRegistry &); void initializeLiveIntervalsWrapperPassPass(PassRegistry &); void initializeLiveRangeShrinkPass(PassRegistry &); void initializeLiveRegMatrixWrapperLegacyPass(PassRegistry &); diff --git a/llvm/lib/CodeGen/CodeGen.cpp b/llvm/lib/CodeGen/CodeGen.cpp index 07605a54b3193..59428818c1ee7 100644 --- a/llvm/lib/CodeGen/CodeGen.cpp +++ b/llvm/lib/CodeGen/CodeGen.cpp @@ -59,7 +59,7 @@ void llvm::initializeCodeGen(PassRegistry &Registry) { initializeInterleavedAccessPass(Registry); initializeJMCInstrumenterPass(Registry); initializeLiveDebugValuesPass(Registry); - initializeLiveDebugVariablesWrapperPassPass(Registry); + initializeLiveDebugVariablesWrapperLegacyPass(Registry); initializeLiveIntervalsWrapperPassPass(Registry); initializeLiveRangeShrinkPass(Registry); initializeLiveStacksPass(Registry); diff --git a/llvm/lib/CodeGen/LiveDebugVariables.cpp b/llvm/lib/CodeGen/LiveDebugVariables.cpp index 68acec5555c15..d4f1edc3b1db1 100644 --- a/llvm/lib/CodeGen/LiveDebugVariables.cpp +++ b/llvm/lib/CodeGen/LiveDebugVariables.cpp @@ -74,25 +74,27 @@ EnableLDV("live-debug-variables", cl::init(true), STATISTIC(NumInsertedDebugValues, "Number of DBG_VALUEs inserted"); STATISTIC(NumInsertedDebugLabels, "Number of DBG_LABELs inserted"); -char LiveDebugVariablesWrapperPass::ID = 0; +char LiveDebugVariablesWrapperLegacy::ID = 0; -INITIALIZE_PASS_BEGIN(LiveDebugVariablesWrapperPass, DEBUG_TYPE, +INITIALIZE_PASS_BEGIN(LiveDebugVariablesWrapperLegacy, DEBUG_TYPE, "Debug Variable Analysis", false, false) INITIALIZE_PASS_DEPENDENCY(MachineDominatorTreeWrapperPass) INITIALIZE_PASS_DEPENDENCY(LiveIntervalsWrapperPass) -INITIALIZE_PASS_END(LiveDebugVariablesWrapperPass, DEBUG_TYPE, +INITIALIZE_PASS_END(LiveDebugVariablesWrapperLegacy, DEBUG_TYPE, "Debug Variable Analysis", false, false) -void LiveDebugVariablesWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const { +void LiveDebugVariablesWrapperLegacy::getAnalysisUsage( + AnalysisUsage &AU) const { AU.addRequired(); AU.addRequiredTransitive(); AU.setPreservesAll(); MachineFunctionPass::getAnalysisUsage(AU); } -LiveDebugVariablesWrapperPass::LiveDebugVariablesWrapperPass() +LiveDebugVariablesWrapperLegacy::LiveDebugVariablesWrapperLegacy() : MachineFunctionPass(ID) { - initializeLiveDebugVariablesWrapperPassPass(*PassRegistry::getPassRegistry()); + initializeLiveDebugVariablesWrapperLegacyPass( + *PassRegistry::getPassRegistry()); } enum : unsigned { UndefLocNo = ~0U }; @@ -673,7 +675,6 @@ class LDVImpl { } // end anonymous namespace -#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) static void printDebugLoc(const DebugLoc &DL, raw_ostream &CommentOS, const LLVMContext &Ctx) { if (!DL) @@ -761,7 +762,6 @@ void LDVImpl::print(raw_ostream &OS) { for (auto &userLabel : userLabels) userLabel->print(OS, TRI); } -#endif void UserValue::mapVirtRegs(LDVImpl *LDV) { for (const MachineOperand &MO : locations) @@ -1297,7 +1297,8 @@ static void removeDebugInstrs(MachineFunction &mf) { } } -bool LiveDebugVariablesWrapperPass::runOnMachineFunction(MachineFunction &mf) { +bool LiveDebugVariablesWrapperLegacy::runOnMachineFunction( + MachineFunction &mf) { auto *LIS = &getAnalysis().getLIS(); Impl = std::make_unique(); @@ -1316,6 +1317,14 @@ LiveDebugVariablesAnalysis::run(MachineFunction &MF, return LDV; } +PreservedAnalyses +LiveDebugVariablesPrinterPass::run(MachineFunction &MF, + MachineFunctionAnalysisManager &MFAM) { + auto &LDV = MFAM.getResult(MF); + LDV.print(dbgs()); + return PreservedAnalyses::all(); +} + void LiveDebugVariables::Deleter::operator()(void *Ptr) const { delete static_cast(Ptr); } @@ -1325,6 +1334,16 @@ void LiveDebugVariables::releaseMemory() { static_cast(PImpl.get())->clear(); } +bool LiveDebugVariables::invalidate( + MachineFunction &, const PreservedAnalyses &PA, + MachineFunctionAnalysisManager::Invalidator &) { + auto PAC = PA.getChecker(); + // Some architectures split the register allocation into multiple phases based + // on register classes. This requires preserving analyses between the phases + // by default. + return PAC.preservedWhenStateless(); +} + void LiveDebugVariables::analyze(MachineFunction &MF, LiveIntervals *LIS) { if (!EnableLDV) return; @@ -1977,8 +1996,10 @@ void LiveDebugVariables::emitDebugValues(VirtRegMap *VRM) { } #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) -LLVM_DUMP_METHOD void LiveDebugVariables::dump() const { +LLVM_DUMP_METHOD void LiveDebugVariables::dump() const { print(dbgs()); } +#endif + +void LiveDebugVariables::print(raw_ostream &OS) const { if (PImpl) - static_cast(PImpl.get())->print(dbgs()); + static_cast(PImpl.get())->print(OS); } -#endif diff --git a/llvm/lib/CodeGen/RegAllocBasic.cpp b/llvm/lib/CodeGen/RegAllocBasic.cpp index 647bbdb66a3fe..7ee24c960dbe0 100644 --- a/llvm/lib/CodeGen/RegAllocBasic.cpp +++ b/llvm/lib/CodeGen/RegAllocBasic.cpp @@ -130,7 +130,7 @@ char &llvm::RABasicID = RABasic::ID; INITIALIZE_PASS_BEGIN(RABasic, "regallocbasic", "Basic Register Allocator", false, false) -INITIALIZE_PASS_DEPENDENCY(LiveDebugVariablesWrapperPass) +INITIALIZE_PASS_DEPENDENCY(LiveDebugVariablesWrapperLegacy) INITIALIZE_PASS_DEPENDENCY(SlotIndexesWrapperPass) INITIALIZE_PASS_DEPENDENCY(LiveIntervalsWrapperPass) INITIALIZE_PASS_DEPENDENCY(RegisterCoalescer) @@ -180,8 +180,8 @@ void RABasic::getAnalysisUsage(AnalysisUsage &AU) const { AU.addRequired(); AU.addPreserved(); AU.addPreserved(); - AU.addRequired(); - AU.addPreserved(); + AU.addRequired(); + AU.addPreserved(); AU.addRequired(); AU.addPreserved(); AU.addRequired(); diff --git a/llvm/lib/CodeGen/RegAllocGreedy.cpp b/llvm/lib/CodeGen/RegAllocGreedy.cpp index 8930e2e6d1a6e..8564fd8ca96da 100644 --- a/llvm/lib/CodeGen/RegAllocGreedy.cpp +++ b/llvm/lib/CodeGen/RegAllocGreedy.cpp @@ -151,7 +151,7 @@ char &llvm::RAGreedyID = RAGreedy::ID; INITIALIZE_PASS_BEGIN(RAGreedy, "greedy", "Greedy Register Allocator", false, false) -INITIALIZE_PASS_DEPENDENCY(LiveDebugVariablesWrapperPass) +INITIALIZE_PASS_DEPENDENCY(LiveDebugVariablesWrapperLegacy) INITIALIZE_PASS_DEPENDENCY(SlotIndexesWrapperPass) INITIALIZE_PASS_DEPENDENCY(LiveIntervalsWrapperPass) INITIALIZE_PASS_DEPENDENCY(RegisterCoalescer) @@ -204,8 +204,8 @@ void RAGreedy::getAnalysisUsage(AnalysisUsage &AU) const { AU.addPreserved(); AU.addRequired(); AU.addPreserved(); - AU.addRequired(); - AU.addPreserved(); + AU.addRequired(); + AU.addPreserved(); AU.addRequired(); AU.addPreserved(); AU.addRequired(); @@ -2732,7 +2732,7 @@ bool RAGreedy::runOnMachineFunction(MachineFunction &mf) { Loops = &getAnalysis().getLI(); Bundles = &getAnalysis().getEdgeBundles(); SpillPlacer = &getAnalysis().getResult(); - DebugVars = &getAnalysis().getLDV(); + DebugVars = &getAnalysis().getLDV(); initializeCSRCost(); diff --git a/llvm/lib/CodeGen/RegAllocGreedy.h b/llvm/lib/CodeGen/RegAllocGreedy.h index 67c7f3acd7b31..594c481826cf0 100644 --- a/llvm/lib/CodeGen/RegAllocGreedy.h +++ b/llvm/lib/CodeGen/RegAllocGreedy.h @@ -43,7 +43,7 @@ namespace llvm { class AllocationOrder; class AnalysisUsage; class EdgeBundles; -class LiveDebugVariablesWrapperPass; +class LiveDebugVariablesWrapperLegacy; class LiveIntervals; class LiveRegMatrix; class MachineBasicBlock; diff --git a/llvm/lib/CodeGen/StackSlotColoring.cpp b/llvm/lib/CodeGen/StackSlotColoring.cpp index 2a3af37b351d7..cdc530621de62 100644 --- a/llvm/lib/CodeGen/StackSlotColoring.cpp +++ b/llvm/lib/CodeGen/StackSlotColoring.cpp @@ -159,7 +159,7 @@ namespace { // may be invoked multiple times requiring it to save these analyses to be // used by RA later. AU.addPreserved(); - AU.addPreserved(); + AU.addPreserved(); MachineFunctionPass::getAnalysisUsage(AU); } diff --git a/llvm/lib/CodeGen/VirtRegMap.cpp b/llvm/lib/CodeGen/VirtRegMap.cpp index 9cf631cd20ea4..2084e68c16e29 100644 --- a/llvm/lib/CodeGen/VirtRegMap.cpp +++ b/llvm/lib/CodeGen/VirtRegMap.cpp @@ -251,7 +251,7 @@ INITIALIZE_PASS_BEGIN(VirtRegRewriter, "virtregrewriter", "Virtual Register Rewriter", false, false) INITIALIZE_PASS_DEPENDENCY(SlotIndexesWrapperPass) INITIALIZE_PASS_DEPENDENCY(LiveIntervalsWrapperPass) -INITIALIZE_PASS_DEPENDENCY(LiveDebugVariablesWrapperPass) +INITIALIZE_PASS_DEPENDENCY(LiveDebugVariablesWrapperLegacy) INITIALIZE_PASS_DEPENDENCY(LiveRegMatrixWrapperLegacy) INITIALIZE_PASS_DEPENDENCY(LiveStacks) INITIALIZE_PASS_DEPENDENCY(VirtRegMapWrapperLegacy) @@ -264,14 +264,14 @@ void VirtRegRewriter::getAnalysisUsage(AnalysisUsage &AU) const { AU.addPreserved(); AU.addRequired(); AU.addPreserved(); - AU.addRequired(); + AU.addRequired(); AU.addRequired(); AU.addPreserved(); AU.addRequired(); AU.addRequired(); if (!ClearVirtRegs) - AU.addPreserved(); + AU.addPreserved(); MachineFunctionPass::getAnalysisUsage(AU); } @@ -285,7 +285,7 @@ bool VirtRegRewriter::runOnMachineFunction(MachineFunction &fn) { LIS = &getAnalysis().getLIS(); LRM = &getAnalysis().getLRM(); VRM = &getAnalysis().getVRM(); - DebugVars = &getAnalysis().getLDV(); + DebugVars = &getAnalysis().getLDV(); LLVM_DEBUG(dbgs() << "********** REWRITE VIRTUAL REGISTERS **********\n" << "********** Function: " << MF->getName() << '\n'); LLVM_DEBUG(VRM->dump()); diff --git a/llvm/lib/Target/LoongArch/LoongArchDeadRegisterDefinitions.cpp b/llvm/lib/Target/LoongArch/LoongArchDeadRegisterDefinitions.cpp index 96f6f7fe49278..d682b7dbe3ce2 100644 --- a/llvm/lib/Target/LoongArch/LoongArchDeadRegisterDefinitions.cpp +++ b/llvm/lib/Target/LoongArch/LoongArchDeadRegisterDefinitions.cpp @@ -37,7 +37,7 @@ class LoongArchDeadRegisterDefinitions : public MachineFunctionPass { AU.addPreserved(); AU.addRequired(); AU.addPreserved(); - AU.addPreserved(); + AU.addPreserved(); AU.addPreserved(); MachineFunctionPass::getAnalysisUsage(AU); } diff --git a/llvm/lib/Target/RISCV/RISCVDeadRegisterDefinitions.cpp b/llvm/lib/Target/RISCV/RISCVDeadRegisterDefinitions.cpp index a2dbe3faf0e59..7bcf3397df97e 100644 --- a/llvm/lib/Target/RISCV/RISCVDeadRegisterDefinitions.cpp +++ b/llvm/lib/Target/RISCV/RISCVDeadRegisterDefinitions.cpp @@ -37,7 +37,7 @@ class RISCVDeadRegisterDefinitions : public MachineFunctionPass { AU.addPreserved(); AU.addRequired(); AU.addPreserved(); - AU.addPreserved(); + AU.addPreserved(); AU.addPreserved(); MachineFunctionPass::getAnalysisUsage(AU); } diff --git a/llvm/lib/Target/RISCV/RISCVInsertVSETVLI.cpp b/llvm/lib/Target/RISCV/RISCVInsertVSETVLI.cpp index 6f3c0b7b0aa1f..870e393b40411 100644 --- a/llvm/lib/Target/RISCV/RISCVInsertVSETVLI.cpp +++ b/llvm/lib/Target/RISCV/RISCVInsertVSETVLI.cpp @@ -889,7 +889,7 @@ class RISCVInsertVSETVLI : public MachineFunctionPass { AU.addUsedIfAvailable(); AU.addPreserved(); AU.addPreserved(); - AU.addPreserved(); + AU.addPreserved(); AU.addPreserved(); MachineFunctionPass::getAnalysisUsage(AU); From 1ce5e29b6b7eda8284be3ef7a8df9f9eedcb1012 Mon Sep 17 00:00:00 2001 From: Akshat Oke Date: Mon, 2 Dec 2024 08:29:12 +0000 Subject: [PATCH 4/7] Fix invalidate and expose LDVImpl to .h --- .../include/llvm/CodeGen/LiveDebugVariables.h | 6 ++--- llvm/lib/CodeGen/LiveDebugVariables.cpp | 24 +++++++++---------- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/llvm/include/llvm/CodeGen/LiveDebugVariables.h b/llvm/include/llvm/CodeGen/LiveDebugVariables.h index 45c3bb8051e1e..e059a403f56d8 100644 --- a/llvm/include/llvm/CodeGen/LiveDebugVariables.h +++ b/llvm/include/llvm/CodeGen/LiveDebugVariables.h @@ -30,13 +30,11 @@ namespace llvm { template class ArrayRef; class LiveIntervals; class VirtRegMap; +class LDVImpl; class LiveDebugVariables { private: - struct Deleter { - void operator()(void *Ptr) const; - }; - std::unique_ptr PImpl; + std::unique_ptr PImpl; public: LiveDebugVariables() = default; diff --git a/llvm/lib/CodeGen/LiveDebugVariables.cpp b/llvm/lib/CodeGen/LiveDebugVariables.cpp index d4f1edc3b1db1..3998b216f952d 100644 --- a/llvm/lib/CodeGen/LiveDebugVariables.cpp +++ b/llvm/lib/CodeGen/LiveDebugVariables.cpp @@ -277,8 +277,6 @@ using BlockSkipInstsMap = namespace { -class LDVImpl; - /// A user value is a part of a debug info user variable. /// /// A DBG_VALUE instruction notes that (a sub-register of) a virtual register @@ -531,6 +529,10 @@ class UserLabel { void print(raw_ostream &, const TargetRegisterInfo *); }; +} // end anonymous namespace + +namespace llvm { + /// Implementation of the LiveDebugVariables pass. class LDVImpl { LocMap::Allocator allocator; @@ -673,7 +675,7 @@ class LDVImpl { void print(raw_ostream&); }; -} // end anonymous namespace +} // namespace llvm static void printDebugLoc(const DebugLoc &DL, raw_ostream &CommentOS, const LLVMContext &Ctx) { @@ -1325,13 +1327,9 @@ LiveDebugVariablesPrinterPass::run(MachineFunction &MF, return PreservedAnalyses::all(); } -void LiveDebugVariables::Deleter::operator()(void *Ptr) const { - delete static_cast(Ptr); -} - void LiveDebugVariables::releaseMemory() { if (PImpl) - static_cast(PImpl.get())->clear(); + PImpl->clear(); } bool LiveDebugVariables::invalidate( @@ -1341,7 +1339,7 @@ bool LiveDebugVariables::invalidate( // Some architectures split the register allocation into multiple phases based // on register classes. This requires preserving analyses between the phases // by default. - return PAC.preservedWhenStateless(); + return !PAC.preservedWhenStateless(); } void LiveDebugVariables::analyze(MachineFunction &MF, LiveIntervals *LIS) { @@ -1357,7 +1355,7 @@ void LiveDebugVariables::analyze(MachineFunction &MF, LiveIntervals *LIS) { // Have we been asked to track variable locations using instruction // referencing? bool InstrRef = MF.useDebugInstrRef(); - static_cast(PImpl.get())->runOnMachineFunction(MF, InstrRef); + PImpl->runOnMachineFunction(MF, InstrRef); } //===----------------------------------------------------------------------===// @@ -1540,7 +1538,7 @@ void LDVImpl::splitRegister(Register OldReg, ArrayRef NewRegs) { void LiveDebugVariables:: splitRegister(Register OldReg, ArrayRef NewRegs, LiveIntervals &LIS) { if (PImpl) - static_cast(PImpl.get())->splitRegister(OldReg, NewRegs); + PImpl->splitRegister(OldReg, NewRegs); } void UserValue::rewriteLocations(VirtRegMap &VRM, const MachineFunction &MF, @@ -1992,7 +1990,7 @@ void LDVImpl::emitDebugValues(VirtRegMap *VRM) { void LiveDebugVariables::emitDebugValues(VirtRegMap *VRM) { if (PImpl) - static_cast(PImpl.get())->emitDebugValues(VRM); + PImpl->emitDebugValues(VRM); } #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) @@ -2001,5 +1999,5 @@ LLVM_DUMP_METHOD void LiveDebugVariables::dump() const { print(dbgs()); } void LiveDebugVariables::print(raw_ostream &OS) const { if (PImpl) - static_cast(PImpl.get())->print(OS); + PImpl->print(OS); } From 4943aef1d19f1e46b03c67677e6daf65c85aa342 Mon Sep 17 00:00:00 2001 From: Akshat Oke Date: Mon, 2 Dec 2024 21:38:31 +0000 Subject: [PATCH 5/7] Move LDVImpl to LiveDebugVariables --- .../include/llvm/CodeGen/LiveDebugVariables.h | 16 ++++-- llvm/include/llvm/IR/PassManagerImpl.h | 3 +- .../llvm/Passes/MachinePassRegistry.def | 2 + llvm/lib/CodeGen/LiveDebugVariables.cpp | 52 ++++++++++++------- llvm/lib/Passes/PassBuilder.cpp | 1 + 5 files changed, 49 insertions(+), 25 deletions(-) diff --git a/llvm/include/llvm/CodeGen/LiveDebugVariables.h b/llvm/include/llvm/CodeGen/LiveDebugVariables.h index e059a403f56d8..e0801be2a91d7 100644 --- a/llvm/include/llvm/CodeGen/LiveDebugVariables.h +++ b/llvm/include/llvm/CodeGen/LiveDebugVariables.h @@ -23,6 +23,7 @@ #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/IR/PassManager.h" #include "llvm/Support/Compiler.h" +#include "llvm/Support/raw_ostream.h" #include namespace llvm { @@ -30,14 +31,14 @@ namespace llvm { template class ArrayRef; class LiveIntervals; class VirtRegMap; -class LDVImpl; class LiveDebugVariables { -private: - std::unique_ptr PImpl; public: - LiveDebugVariables() = default; + class LDVImpl; + LiveDebugVariables(); + ~LiveDebugVariables(); + LiveDebugVariables(LiveDebugVariables &&); void analyze(MachineFunction &MF, LiveIntervals *LIS); /// splitRegister - Move any user variables in OldReg to the live ranges in @@ -62,6 +63,9 @@ class LiveDebugVariables { bool invalidate(MachineFunction &MF, const PreservedAnalyses &PA, MachineFunctionAnalysisManager::Invalidator &Inv); + +private: + std::unique_ptr PImpl; }; class LiveDebugVariablesWrapperLegacy : public MachineFunctionPass { @@ -98,7 +102,11 @@ class LiveDebugVariablesAnalysis class LiveDebugVariablesPrinterPass : public PassInfoMixin { + raw_ostream &OS; + public: + LiveDebugVariablesPrinterPass(raw_ostream &OS) : OS(OS) {} + PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM); }; diff --git a/llvm/include/llvm/IR/PassManagerImpl.h b/llvm/include/llvm/IR/PassManagerImpl.h index 67e3fbe4f3068..1d7588e1a5bb1 100644 --- a/llvm/include/llvm/IR/PassManagerImpl.h +++ b/llvm/include/llvm/IR/PassManagerImpl.h @@ -19,6 +19,7 @@ #include "llvm/IR/PassInstrumentation.h" #include "llvm/IR/PassManager.h" #include "llvm/Support/CommandLine.h" +#include "llvm/Support/Debug.h" #include "llvm/Support/PrettyStackTrace.h" extern llvm::cl::opt UseNewDbgInfoFormat; @@ -79,7 +80,7 @@ PreservedAnalyses PassManager::run( continue; PreservedAnalyses PassPA = Pass->run(IR, AM, ExtraArgs...); - + llvm::dbgs() << "Running " << Pass->name() << "\n"; // Update the analysis manager as each pass runs and potentially // invalidates analyses. AM.invalidate(IR, PassPA); diff --git a/llvm/include/llvm/Passes/MachinePassRegistry.def b/llvm/include/llvm/Passes/MachinePassRegistry.def index 614e36cfbd1a0..e65bd58dae96b 100644 --- a/llvm/include/llvm/Passes/MachinePassRegistry.def +++ b/llvm/include/llvm/Passes/MachinePassRegistry.def @@ -98,6 +98,7 @@ LOOP_PASS("loop-term-fold", LoopTermFoldPass()) // computed. (We still either need to regenerate kill flags after regalloc, or // preferably fix the scavenger to not depend on them). MACHINE_FUNCTION_ANALYSIS("edge-bundles", EdgeBundlesAnalysis()) +MACHINE_FUNCTION_ANALYSIS("livedebugvars", LiveDebugVariablesAnalysis()) MACHINE_FUNCTION_ANALYSIS("live-intervals", LiveIntervalsAnalysis()) MACHINE_FUNCTION_ANALYSIS("live-reg-matrix", LiveRegMatrixAnalysis()) MACHINE_FUNCTION_ANALYSIS("live-vars", LiveVariablesAnalysis()) @@ -146,6 +147,7 @@ MACHINE_FUNCTION_PASS("opt-phis", OptimizePHIsPass()) MACHINE_FUNCTION_PASS("peephole-opt", PeepholeOptimizerPass()) MACHINE_FUNCTION_PASS("phi-node-elimination", PHIEliminationPass()) MACHINE_FUNCTION_PASS("print", PrintMIRPass()) +MACHINE_FUNCTION_PASS("print", LiveDebugVariablesPrinterPass(errs())) MACHINE_FUNCTION_PASS("print", LiveIntervalsPrinterPass(errs())) MACHINE_FUNCTION_PASS("print", LiveVariablesPrinterPass(errs())) MACHINE_FUNCTION_PASS("print", diff --git a/llvm/lib/CodeGen/LiveDebugVariables.cpp b/llvm/lib/CodeGen/LiveDebugVariables.cpp index 3998b216f952d..f4141cce15508 100644 --- a/llvm/lib/CodeGen/LiveDebugVariables.cpp +++ b/llvm/lib/CodeGen/LiveDebugVariables.cpp @@ -286,6 +286,8 @@ namespace { /// user values are related if they are held by the same virtual register. The /// equivalence class is the transitive closure of that relation. class UserValue { + using LDVImpl = LiveDebugVariables::LDVImpl; + const DILocalVariable *Variable; ///< The debug info variable we are part of. /// The part of the variable we describe. const std::optional Fragment; @@ -534,7 +536,12 @@ class UserLabel { namespace llvm { /// Implementation of the LiveDebugVariables pass. -class LDVImpl { + +LiveDebugVariables::LiveDebugVariables() = default; +LiveDebugVariables::~LiveDebugVariables() = default; +LiveDebugVariables::LiveDebugVariables(LiveDebugVariables &&) = default; + +class LiveDebugVariables::LDVImpl { LocMap::Allocator allocator; MachineFunction *MF = nullptr; LiveIntervals *LIS; @@ -756,7 +763,7 @@ void UserLabel::print(raw_ostream &OS, const TargetRegisterInfo *TRI) { OS << '\n'; } -void LDVImpl::print(raw_ostream &OS) { +void LiveDebugVariables::LDVImpl::print(raw_ostream &OS) { OS << "********** DEBUG VARIABLES **********\n"; for (auto &userValue : userValues) userValue->print(OS, TRI); @@ -765,16 +772,15 @@ void LDVImpl::print(raw_ostream &OS) { userLabel->print(OS, TRI); } -void UserValue::mapVirtRegs(LDVImpl *LDV) { +void UserValue::mapVirtRegs(LiveDebugVariables::LDVImpl *LDV) { for (const MachineOperand &MO : locations) if (MO.isReg() && MO.getReg().isVirtual()) LDV->mapVirtReg(MO.getReg(), this); } -UserValue * -LDVImpl::getUserValue(const DILocalVariable *Var, - std::optional Fragment, - const DebugLoc &DL) { +UserValue *LiveDebugVariables::LDVImpl::getUserValue( + const DILocalVariable *Var, + std::optional Fragment, const DebugLoc &DL) { // FIXME: Handle partially overlapping fragments. See // https://reviews.llvm.org/D70121#1849741. DebugVariable ID(Var, Fragment, DL->getInlinedAt()); @@ -787,19 +793,20 @@ LDVImpl::getUserValue(const DILocalVariable *Var, return UV; } -void LDVImpl::mapVirtReg(Register VirtReg, UserValue *EC) { +void LiveDebugVariables::LDVImpl::mapVirtReg(Register VirtReg, UserValue *EC) { assert(VirtReg.isVirtual() && "Only map VirtRegs"); UserValue *&Leader = virtRegToEqClass[VirtReg]; Leader = UserValue::merge(Leader, EC); } -UserValue *LDVImpl::lookupVirtReg(Register VirtReg) { +UserValue *LiveDebugVariables::LDVImpl::lookupVirtReg(Register VirtReg) { if (UserValue *UV = virtRegToEqClass.lookup(VirtReg)) return UV->getLeader(); return nullptr; } -bool LDVImpl::handleDebugValue(MachineInstr &MI, SlotIndex Idx) { +bool LiveDebugVariables::LDVImpl::handleDebugValue(MachineInstr &MI, + SlotIndex Idx) { // DBG_VALUE loc, offset, variable, expr // DBG_VALUE_LIST variable, expr, locs... if (!MI.isDebugValue()) { @@ -875,8 +882,8 @@ bool LDVImpl::handleDebugValue(MachineInstr &MI, SlotIndex Idx) { return true; } -MachineBasicBlock::iterator LDVImpl::handleDebugInstr(MachineInstr &MI, - SlotIndex Idx) { +MachineBasicBlock::iterator +LiveDebugVariables::LDVImpl::handleDebugInstr(MachineInstr &MI, SlotIndex Idx) { assert(MI.isDebugValueLike() || MI.isDebugPHI()); // In instruction referencing mode, there should be no DBG_VALUE instructions @@ -896,7 +903,8 @@ MachineBasicBlock::iterator LDVImpl::handleDebugInstr(MachineInstr &MI, return NextInst; } -bool LDVImpl::handleDebugLabel(MachineInstr &MI, SlotIndex Idx) { +bool LiveDebugVariables::LDVImpl::handleDebugLabel(MachineInstr &MI, + SlotIndex Idx) { // DBG_LABEL label if (MI.getNumOperands() != 1 || !MI.getOperand(0).isMetadata()) { LLVM_DEBUG(dbgs() << "Can't handle " << MI); @@ -919,7 +927,8 @@ bool LDVImpl::handleDebugLabel(MachineInstr &MI, SlotIndex Idx) { return true; } -bool LDVImpl::collectDebugValues(MachineFunction &mf, bool InstrRef) { +bool LiveDebugVariables::LDVImpl::collectDebugValues(MachineFunction &mf, + bool InstrRef) { bool Changed = false; for (MachineBasicBlock &MBB : mf) { for (MachineBasicBlock::iterator MBBI = MBB.begin(), MBBE = MBB.end(); @@ -1252,7 +1261,7 @@ void UserValue::computeIntervals(MachineRegisterInfo &MRI, I.setStopUnchecked(PrevEnd); } -void LDVImpl::computeIntervals() { +void LiveDebugVariables::LDVImpl::computeIntervals() { LexicalScopes LS; LS.initialize(*MF); @@ -1262,7 +1271,8 @@ void LDVImpl::computeIntervals() { } } -bool LDVImpl::runOnMachineFunction(MachineFunction &mf, bool InstrRef) { +bool LiveDebugVariables::LDVImpl::runOnMachineFunction(MachineFunction &mf, + bool InstrRef) { clear(); MF = &mf; TRI = mf.getSubtarget().getRegisterInfo(); @@ -1323,7 +1333,7 @@ PreservedAnalyses LiveDebugVariablesPrinterPass::run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM) { auto &LDV = MFAM.getResult(MF); - LDV.print(dbgs()); + LDV.print(OS); return PreservedAnalyses::all(); } @@ -1478,7 +1488,8 @@ UserValue::splitRegister(Register OldReg, ArrayRef NewRegs, return DidChange; } -void LDVImpl::splitPHIRegister(Register OldReg, ArrayRef NewRegs) { +void LiveDebugVariables::LDVImpl::splitPHIRegister(Register OldReg, + ArrayRef NewRegs) { auto RegIt = RegToPHIIdx.find(OldReg); if (RegIt == RegToPHIIdx.end()) return; @@ -1516,7 +1527,8 @@ void LDVImpl::splitPHIRegister(Register OldReg, ArrayRef NewRegs) { RegToPHIIdx[RegAndInstr.first].push_back(RegAndInstr.second); } -void LDVImpl::splitRegister(Register OldReg, ArrayRef NewRegs) { +void LiveDebugVariables::LDVImpl::splitRegister(Register OldReg, + ArrayRef NewRegs) { // Consider whether this split range affects any PHI locations. splitPHIRegister(OldReg, NewRegs); @@ -1840,7 +1852,7 @@ void UserLabel::emitDebugLabel(LiveIntervals &LIS, const TargetInstrInfo &TII, LLVM_DEBUG(dbgs() << '\n'); } -void LDVImpl::emitDebugValues(VirtRegMap *VRM) { +void LiveDebugVariables::LDVImpl::emitDebugValues(VirtRegMap *VRM) { LLVM_DEBUG(dbgs() << "********** EMITTING LIVE DEBUG VARIABLES **********\n"); if (!MF) return; diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp index ba52a37df9c25..cc9f59727c604 100644 --- a/llvm/lib/Passes/PassBuilder.cpp +++ b/llvm/lib/Passes/PassBuilder.cpp @@ -98,6 +98,7 @@ #include "llvm/CodeGen/InterleavedAccess.h" #include "llvm/CodeGen/InterleavedLoadCombine.h" #include "llvm/CodeGen/JMCInstrumenter.h" +#include "llvm/CodeGen/LiveDebugVariables.h" #include "llvm/CodeGen/LiveIntervals.h" #include "llvm/CodeGen/LiveRegMatrix.h" #include "llvm/CodeGen/LiveVariables.h" From 7f35339024256915d00a86fc8da77eb3bae8f54c Mon Sep 17 00:00:00 2001 From: Akshat Oke Date: Tue, 3 Dec 2024 05:46:47 +0000 Subject: [PATCH 6/7] remove debugging printing --- llvm/include/llvm/IR/PassManagerImpl.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/llvm/include/llvm/IR/PassManagerImpl.h b/llvm/include/llvm/IR/PassManagerImpl.h index 1d7588e1a5bb1..67e3fbe4f3068 100644 --- a/llvm/include/llvm/IR/PassManagerImpl.h +++ b/llvm/include/llvm/IR/PassManagerImpl.h @@ -19,7 +19,6 @@ #include "llvm/IR/PassInstrumentation.h" #include "llvm/IR/PassManager.h" #include "llvm/Support/CommandLine.h" -#include "llvm/Support/Debug.h" #include "llvm/Support/PrettyStackTrace.h" extern llvm::cl::opt UseNewDbgInfoFormat; @@ -80,7 +79,7 @@ PreservedAnalyses PassManager::run( continue; PreservedAnalyses PassPA = Pass->run(IR, AM, ExtraArgs...); - llvm::dbgs() << "Running " << Pass->name() << "\n"; + // Update the analysis manager as each pass runs and potentially // invalidates analyses. AM.invalidate(IR, PassPA); From 0e9899feaadeed2d3503114ca54b95e6a1d705ff Mon Sep 17 00:00:00 2001 From: Akshat Oke Date: Wed, 4 Dec 2024 08:49:14 +0000 Subject: [PATCH 7/7] Fix nullptr in releaseMemory and mfprops --- llvm/include/llvm/CodeGen/LiveDebugVariables.h | 11 ++++++++++- llvm/lib/CodeGen/LiveDebugVariables.cpp | 3 +++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/llvm/include/llvm/CodeGen/LiveDebugVariables.h b/llvm/include/llvm/CodeGen/LiveDebugVariables.h index e0801be2a91d7..2cb95f2c71ccd 100644 --- a/llvm/include/llvm/CodeGen/LiveDebugVariables.h +++ b/llvm/include/llvm/CodeGen/LiveDebugVariables.h @@ -81,7 +81,10 @@ class LiveDebugVariablesWrapperLegacy : public MachineFunctionPass { LiveDebugVariables &getLDV() { return *Impl; } const LiveDebugVariables &getLDV() const { return *Impl; } - void releaseMemory() override { Impl->releaseMemory(); } + void releaseMemory() override { + if (Impl) + Impl->releaseMemory(); + } void getAnalysisUsage(AnalysisUsage &) const override; MachineFunctionProperties getSetProperties() const override { @@ -97,6 +100,12 @@ class LiveDebugVariablesAnalysis public: using Result = LiveDebugVariables; + + MachineFunctionProperties getSetProperties() const { + return MachineFunctionProperties().set( + MachineFunctionProperties::Property::TracksDebugUserValues); + } + Result run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM); }; diff --git a/llvm/lib/CodeGen/LiveDebugVariables.cpp b/llvm/lib/CodeGen/LiveDebugVariables.cpp index f4141cce15508..317d3401f000a 100644 --- a/llvm/lib/CodeGen/LiveDebugVariables.cpp +++ b/llvm/lib/CodeGen/LiveDebugVariables.cpp @@ -38,6 +38,7 @@ #include "llvm/CodeGen/MachineInstr.h" #include "llvm/CodeGen/MachineInstrBuilder.h" #include "llvm/CodeGen/MachineOperand.h" +#include "llvm/CodeGen/MachinePassManager.h" #include "llvm/CodeGen/MachineRegisterInfo.h" #include "llvm/CodeGen/SlotIndexes.h" #include "llvm/CodeGen/TargetInstrInfo.h" @@ -1323,6 +1324,8 @@ AnalysisKey LiveDebugVariablesAnalysis::Key; LiveDebugVariables LiveDebugVariablesAnalysis::run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM) { + MFPropsModifier _(*this, MF); + auto *LIS = &MFAM.getResult(MF); LiveDebugVariables LDV; LDV.analyze(MF, LIS);