diff options
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r-- | llvm/lib/CodeGen/CodeGen.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/CodeGen/RegUsageInfoCollector.cpp | 65 |
2 files changed, 45 insertions, 22 deletions
diff --git a/llvm/lib/CodeGen/CodeGen.cpp b/llvm/lib/CodeGen/CodeGen.cpp index 39fba1d0..e7e8a12 100644 --- a/llvm/lib/CodeGen/CodeGen.cpp +++ b/llvm/lib/CodeGen/CodeGen.cpp @@ -113,7 +113,7 @@ void llvm::initializeCodeGen(PassRegistry &Registry) { initializeRABasicPass(Registry); initializeRAGreedyPass(Registry); initializeRegAllocFastPass(Registry); - initializeRegUsageInfoCollectorPass(Registry); + initializeRegUsageInfoCollectorLegacyPass(Registry); initializeRegUsageInfoPropagationPass(Registry); initializeRegisterCoalescerPass(Registry); initializeRemoveLoadsIntoFakeUsesPass(Registry); diff --git a/llvm/lib/CodeGen/RegUsageInfoCollector.cpp b/llvm/lib/CodeGen/RegUsageInfoCollector.cpp index 4e88080..f539966 100644 --- a/llvm/lib/CodeGen/RegUsageInfoCollector.cpp +++ b/llvm/lib/CodeGen/RegUsageInfoCollector.cpp @@ -16,9 +16,11 @@ /// //===----------------------------------------------------------------------===// +#include "llvm/CodeGen/RegUsageInfoCollector.h" #include "llvm/ADT/Statistic.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/MachineOperand.h" +#include "llvm/CodeGen/MachinePassManager.h" #include "llvm/CodeGen/MachineRegisterInfo.h" #include "llvm/CodeGen/Passes.h" #include "llvm/CodeGen/RegisterUsageInfo.h" @@ -36,11 +38,23 @@ STATISTIC(NumCSROpt, namespace { -class RegUsageInfoCollector : public MachineFunctionPass { +class RegUsageInfoCollector { + PhysicalRegisterUsageInfo &PRUI; + public: - RegUsageInfoCollector() : MachineFunctionPass(ID) { - PassRegistry &Registry = *PassRegistry::getPassRegistry(); - initializeRegUsageInfoCollectorPass(Registry); + RegUsageInfoCollector(PhysicalRegisterUsageInfo &PRUI) : PRUI(PRUI) {} + bool run(MachineFunction &MF); + + // Call getCalleeSaves and then also set the bits for subregs and + // fully saved superregs. + static void computeCalleeSavedRegs(BitVector &SavedRegs, MachineFunction &MF); +}; + +class RegUsageInfoCollectorLegacy : public MachineFunctionPass { +public: + static char ID; + RegUsageInfoCollectorLegacy() : MachineFunctionPass(ID) { + initializeRegUsageInfoCollectorLegacyPass(*PassRegistry::getPassRegistry()); } StringRef getPassName() const override { @@ -54,26 +68,19 @@ public: } bool runOnMachineFunction(MachineFunction &MF) override; - - // Call getCalleeSaves and then also set the bits for subregs and - // fully saved superregs. - static void computeCalleeSavedRegs(BitVector &SavedRegs, MachineFunction &MF); - - static char ID; }; - } // end of anonymous namespace -char RegUsageInfoCollector::ID = 0; +char RegUsageInfoCollectorLegacy::ID = 0; -INITIALIZE_PASS_BEGIN(RegUsageInfoCollector, "RegUsageInfoCollector", +INITIALIZE_PASS_BEGIN(RegUsageInfoCollectorLegacy, "RegUsageInfoCollector", "Register Usage Information Collector", false, false) INITIALIZE_PASS_DEPENDENCY(PhysicalRegisterUsageInfoWrapperLegacy) -INITIALIZE_PASS_END(RegUsageInfoCollector, "RegUsageInfoCollector", +INITIALIZE_PASS_END(RegUsageInfoCollectorLegacy, "RegUsageInfoCollector", "Register Usage Information Collector", false, false) FunctionPass *llvm::createRegUsageInfoCollector() { - return new RegUsageInfoCollector(); + return new RegUsageInfoCollectorLegacy(); } // TODO: Move to hook somwehere? @@ -97,14 +104,32 @@ static bool isCallableFunction(const MachineFunction &MF) { } } -bool RegUsageInfoCollector::runOnMachineFunction(MachineFunction &MF) { +PreservedAnalyses +RegUsageInfoCollectorPass::run(MachineFunction &MF, + MachineFunctionAnalysisManager &MFAM) { + Module &MFA = *MF.getFunction().getParent(); + auto *PRUI = MFAM.getResult<ModuleAnalysisManagerMachineFunctionProxy>(MF) + .getCachedResult<PhysicalRegisterUsageAnalysis>(MFA); + assert(PRUI && "PhysicalRegisterUsageAnalysis not available"); + RegUsageInfoCollector(*PRUI).run(MF); + return PreservedAnalyses::all(); +} + +bool RegUsageInfoCollectorLegacy::runOnMachineFunction(MachineFunction &MF) { + PhysicalRegisterUsageInfo &PRUI = + getAnalysis<PhysicalRegisterUsageInfoWrapperLegacy>().getPRUI(); + return RegUsageInfoCollector(PRUI).run(MF); +} + +bool RegUsageInfoCollector::run(MachineFunction &MF) { MachineRegisterInfo *MRI = &MF.getRegInfo(); const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo(); const TargetMachine &TM = MF.getTarget(); - LLVM_DEBUG(dbgs() << " -------------------- " << getPassName() - << " -------------------- \nFunction Name : " - << MF.getName() << '\n'); + LLVM_DEBUG( + dbgs() + << " -------------------- Register Usage Information Collector Pass" + << " -------------------- \nFunction Name : " << MF.getName() << '\n'); // Analyzing the register usage may be expensive on some targets. if (!isCallableFunction(MF)) { @@ -129,8 +154,6 @@ bool RegUsageInfoCollector::runOnMachineFunction(MachineFunction &MF) { const Function &F = MF.getFunction(); - PhysicalRegisterUsageInfo &PRUI = - getAnalysis<PhysicalRegisterUsageInfoWrapperLegacy>().getPRUI(); PRUI.setTargetMachine(TM); LLVM_DEBUG(dbgs() << "Clobbered Registers: "); |