diff options
author | paperchalice <liujunchang97@outlook.com> | 2024-07-17 11:26:56 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-07-17 11:26:56 +0800 |
commit | 1b873e565eea97d02cdb2375c50ceea89a818e5b (patch) | |
tree | c70bf3aac847f4edf027f0a6b38cc88e7a020f71 /llvm/lib/CodeGen/PHIElimination.cpp | |
parent | befd44bcdc6e9d2f4099bf344826b2cd0fd8cbdc (diff) | |
download | llvm-1b873e565eea97d02cdb2375c50ceea89a818e5b.zip llvm-1b873e565eea97d02cdb2375c50ceea89a818e5b.tar.gz llvm-1b873e565eea97d02cdb2375c50ceea89a818e5b.tar.bz2 |
[CodeGen][NewPM] Port `phi-node-elimination` to new pass manager (#98867)
- Add `PHIEliminationPass `.
- Support new pass manager in `MachineBasicBlock:: SplitCriticalEdge `
Diffstat (limited to 'llvm/lib/CodeGen/PHIElimination.cpp')
-rw-r--r-- | llvm/lib/CodeGen/PHIElimination.cpp | 118 |
1 files changed, 82 insertions, 36 deletions
diff --git a/llvm/lib/CodeGen/PHIElimination.cpp b/llvm/lib/CodeGen/PHIElimination.cpp index e392bb8..e5f4077 100644 --- a/llvm/lib/CodeGen/PHIElimination.cpp +++ b/llvm/lib/CodeGen/PHIElimination.cpp @@ -12,6 +12,7 @@ // //===----------------------------------------------------------------------===// +#include "llvm/CodeGen/PHIElimination.h" #include "PHIEliminationUtils.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/SmallPtrSet.h" @@ -64,22 +65,13 @@ static cl::opt<bool> NoPhiElimLiveOutEarlyExit( namespace { -class PHIElimination : public MachineFunctionPass { +class PHIEliminationImpl { MachineRegisterInfo *MRI = nullptr; // Machine register information LiveVariables *LV = nullptr; LiveIntervals *LIS = nullptr; + MachineLoopInfo *MLI = nullptr; + MachineDominatorTree *MDT = nullptr; -public: - static char ID; // Pass identification, replacement for typeid - - PHIElimination() : MachineFunctionPass(ID) { - initializePHIEliminationPass(*PassRegistry::getPassRegistry()); - } - - bool runOnMachineFunction(MachineFunction &MF) override; - void getAnalysisUsage(AnalysisUsage &AU) const override; - -private: /// EliminatePHINodes - Eliminate phi nodes by inserting copy instructions /// in predecessor basic blocks. bool EliminatePHINodes(MachineFunction &MF, MachineBasicBlock &MBB); @@ -118,10 +110,71 @@ private: using LoweredPHIMap = DenseMap<MachineInstr *, unsigned, MachineInstrExpressionTrait>; LoweredPHIMap LoweredPHIs; + + MachineFunctionPass *P = nullptr; + MachineFunctionAnalysisManager *MFAM = nullptr; + +public: + PHIEliminationImpl(MachineFunctionPass *P) : P(P) { + auto *LVWrapper = P->getAnalysisIfAvailable<LiveVariablesWrapperPass>(); + auto *LISWrapper = P->getAnalysisIfAvailable<LiveIntervalsWrapperPass>(); + auto *MLIWrapper = P->getAnalysisIfAvailable<MachineLoopInfoWrapperPass>(); + auto *MDTWrapper = + P->getAnalysisIfAvailable<MachineDominatorTreeWrapperPass>(); + LV = LVWrapper ? &LVWrapper->getLV() : nullptr; + LIS = LISWrapper ? &LISWrapper->getLIS() : nullptr; + MLI = MLIWrapper ? &MLIWrapper->getLI() : nullptr; + MDT = MDTWrapper ? &MDTWrapper->getDomTree() : nullptr; + } + + PHIEliminationImpl(MachineFunction &MF, MachineFunctionAnalysisManager &AM) + : LV(AM.getCachedResult<LiveVariablesAnalysis>(MF)), + LIS(AM.getCachedResult<LiveIntervalsAnalysis>(MF)), + MLI(AM.getCachedResult<MachineLoopAnalysis>(MF)), + MDT(AM.getCachedResult<MachineDominatorTreeAnalysis>(MF)), MFAM(&AM) {} + + bool run(MachineFunction &MF); +}; + +class PHIElimination : public MachineFunctionPass { +public: + static char ID; // Pass identification, replacement for typeid + + PHIElimination() : MachineFunctionPass(ID) { + initializePHIEliminationPass(*PassRegistry::getPassRegistry()); + } + + bool runOnMachineFunction(MachineFunction &MF) override { + PHIEliminationImpl Impl(this); + return Impl.run(MF); + } + + MachineFunctionProperties getSetProperties() const override { + return MachineFunctionProperties().set( + MachineFunctionProperties::Property::NoPHIs); + } + + void getAnalysisUsage(AnalysisUsage &AU) const override; }; } // end anonymous namespace +PreservedAnalyses +PHIEliminationPass::run(MachineFunction &MF, + MachineFunctionAnalysisManager &MFAM) { + PHIEliminationImpl Impl(MF, MFAM); + bool Changed = Impl.run(MF); + if (!Changed) + return PreservedAnalyses::all(); + auto PA = getMachineFunctionPassPreservedAnalyses(); + PA.preserve<LiveIntervalsAnalysis>(); + PA.preserve<LiveVariablesAnalysis>(); + PA.preserve<SlotIndexesAnalysis>(); + PA.preserve<MachineDominatorTreeAnalysis>(); + PA.preserve<MachineLoopAnalysis>(); + return PA; +} + STATISTIC(NumLowered, "Number of phis lowered"); STATISTIC(NumCriticalEdgesSplit, "Number of critical edges split"); STATISTIC(NumReused, "Number of reused lowered phis"); @@ -147,12 +200,8 @@ void PHIElimination::getAnalysisUsage(AnalysisUsage &AU) const { MachineFunctionPass::getAnalysisUsage(AU); } -bool PHIElimination::runOnMachineFunction(MachineFunction &MF) { +bool PHIEliminationImpl::run(MachineFunction &MF) { MRI = &MF.getRegInfo(); - auto *LVWrapper = getAnalysisIfAvailable<LiveVariablesWrapperPass>(); - LV = LVWrapper ? &LVWrapper->getLV() : nullptr; - auto *LISWrapper = getAnalysisIfAvailable<LiveIntervalsWrapperPass>(); - LIS = LISWrapper ? &LISWrapper->getLIS() : nullptr; bool Changed = false; @@ -187,9 +236,6 @@ bool PHIElimination::runOnMachineFunction(MachineFunction &MF) { } } - MachineLoopInfoWrapperPass *MLIWrapper = - getAnalysisIfAvailable<MachineLoopInfoWrapperPass>(); - MachineLoopInfo *MLI = MLIWrapper ? &MLIWrapper->getLI() : nullptr; for (auto &MBB : MF) Changed |= SplitPHIEdges(MF, MBB, MLI, (LV ? &LiveInSets : nullptr)); } @@ -223,9 +269,8 @@ bool PHIElimination::runOnMachineFunction(MachineFunction &MF) { } // TODO: we should use the incremental DomTree updater here. - if (Changed) - if (auto *MDT = getAnalysisIfAvailable<MachineDominatorTreeWrapperPass>()) - MDT->getDomTree().getBase().recalculate(MF); + if (Changed && MDT) + MDT->getBase().recalculate(MF); LoweredPHIs.clear(); ImpDefs.clear(); @@ -238,8 +283,8 @@ bool PHIElimination::runOnMachineFunction(MachineFunction &MF) { /// EliminatePHINodes - Eliminate phi nodes by inserting copy instructions in /// predecessor basic blocks. -bool PHIElimination::EliminatePHINodes(MachineFunction &MF, - MachineBasicBlock &MBB) { +bool PHIEliminationImpl::EliminatePHINodes(MachineFunction &MF, + MachineBasicBlock &MBB) { if (MBB.empty() || !MBB.front().isPHI()) return false; // Quick exit for basic blocks without PHIs. @@ -286,9 +331,9 @@ static bool allPhiOperandsUndefined(const MachineInstr &MPhi, return true; } /// LowerPHINode - Lower the PHI node at the top of the specified block. -void PHIElimination::LowerPHINode(MachineBasicBlock &MBB, - MachineBasicBlock::iterator LastPHIIt, - bool AllEdgesCritical) { +void PHIEliminationImpl::LowerPHINode(MachineBasicBlock &MBB, + MachineBasicBlock::iterator LastPHIIt, + bool AllEdgesCritical) { ++NumLowered; MachineBasicBlock::iterator AfterPHIsIt = std::next(LastPHIIt); @@ -689,7 +734,7 @@ void PHIElimination::LowerPHINode(MachineBasicBlock &MBB, /// particular, we want to map the number of uses of a virtual register which is /// used in a PHI node. We map that to the BB the vreg is coming from. This is /// used later to determine when the vreg is killed in the BB. -void PHIElimination::analyzePHINodes(const MachineFunction &MF) { +void PHIEliminationImpl::analyzePHINodes(const MachineFunction &MF) { for (const auto &MBB : MF) { for (const auto &BBI : MBB) { if (!BBI.isPHI()) @@ -705,9 +750,9 @@ void PHIElimination::analyzePHINodes(const MachineFunction &MF) { } } -bool PHIElimination::SplitPHIEdges(MachineFunction &MF, MachineBasicBlock &MBB, - MachineLoopInfo *MLI, - std::vector<SparseBitVector<>> *LiveInSets) { +bool PHIEliminationImpl::SplitPHIEdges( + MachineFunction &MF, MachineBasicBlock &MBB, MachineLoopInfo *MLI, + std::vector<SparseBitVector<>> *LiveInSets) { if (MBB.empty() || !MBB.front().isPHI() || MBB.isEHPad()) return false; // Quick exit for basic blocks without PHIs. @@ -774,7 +819,8 @@ bool PHIElimination::SplitPHIEdges(MachineFunction &MF, MachineBasicBlock &MBB, } if (!ShouldSplit && !SplitAllCriticalEdges) continue; - if (!PreMBB->SplitCriticalEdge(&MBB, *this, LiveInSets)) { + if (!(P ? PreMBB->SplitCriticalEdge(&MBB, *P, LiveInSets) + : PreMBB->SplitCriticalEdge(&MBB, *MFAM, LiveInSets))) { LLVM_DEBUG(dbgs() << "Failed to split critical edge.\n"); continue; } @@ -785,7 +831,7 @@ bool PHIElimination::SplitPHIEdges(MachineFunction &MF, MachineBasicBlock &MBB, return Changed; } -bool PHIElimination::isLiveIn(Register Reg, const MachineBasicBlock *MBB) { +bool PHIEliminationImpl::isLiveIn(Register Reg, const MachineBasicBlock *MBB) { assert((LV || LIS) && "isLiveIn() requires either LiveVariables or LiveIntervals"); if (LIS) @@ -794,8 +840,8 @@ bool PHIElimination::isLiveIn(Register Reg, const MachineBasicBlock *MBB) { return LV->isLiveIn(Reg, *MBB); } -bool PHIElimination::isLiveOutPastPHIs(Register Reg, - const MachineBasicBlock *MBB) { +bool PHIEliminationImpl::isLiveOutPastPHIs(Register Reg, + const MachineBasicBlock *MBB) { assert((LV || LIS) && "isLiveOutPastPHIs() requires either LiveVariables or LiveIntervals"); // LiveVariables considers uses in PHIs to be in the predecessor basic block, |