2929#include " llvm/CodeGen/MachineFunctionPass.h"
3030#include " llvm/CodeGen/MachineInstr.h"
3131#include " llvm/CodeGen/MachineOperand.h"
32+ #include " llvm/CodeGen/MachinePassManager.h"
3233#include " llvm/CodeGen/MachineRegisterInfo.h"
3334#include " llvm/CodeGen/SlotIndexes.h"
3435#include " llvm/CodeGen/TargetFrameLowering.h"
@@ -197,7 +198,7 @@ VirtRegMap VirtRegMapAnalysis::run(MachineFunction &MF,
197198//
198199namespace {
199200
200- class VirtRegRewriter : public MachineFunctionPass {
201+ class VirtRegRewriter {
201202 MachineFunction *MF = nullptr ;
202203 const TargetRegisterInfo *TRI = nullptr ;
203204 const TargetInstrInfo *TII = nullptr ;
@@ -223,9 +224,22 @@ class VirtRegRewriter : public MachineFunctionPass {
223224
224225public:
225226 static char ID;
226- VirtRegRewriter (bool ClearVirtRegs_ = true ) :
227- MachineFunctionPass (ID),
228- ClearVirtRegs (ClearVirtRegs_) {}
227+ VirtRegRewriter (bool ClearVirtRegs, SlotIndexes *Indexes, LiveIntervals *LIS,
228+ LiveRegMatrix *LRM, VirtRegMap *VRM,
229+ LiveDebugVariables *DebugVars)
230+ : Indexes(Indexes), LIS(LIS), LRM(LRM), VRM(VRM), DebugVars(DebugVars),
231+ ClearVirtRegs (ClearVirtRegs) {}
232+
233+ bool run (MachineFunction&);
234+
235+ };
236+
237+ class VirtRegRewriterLegacy : public MachineFunctionPass {
238+ public:
239+ static char ID;
240+ bool ClearVirtRegs;
241+ VirtRegRewriterLegacy (bool ClearVirtRegs = true ) :
242+ MachineFunctionPass (ID), ClearVirtRegs(ClearVirtRegs) {}
229243
230244 void getAnalysisUsage (AnalysisUsage &AU) const override ;
231245
@@ -243,22 +257,22 @@ class VirtRegRewriter : public MachineFunctionPass {
243257
244258} // end anonymous namespace
245259
246- char VirtRegRewriter ::ID = 0 ;
260+ char VirtRegRewriterLegacy ::ID = 0 ;
247261
248- char &llvm::VirtRegRewriterID = VirtRegRewriter ::ID;
262+ char &llvm::VirtRegRewriterID = VirtRegRewriterLegacy ::ID;
249263
250- INITIALIZE_PASS_BEGIN (VirtRegRewriter , " virtregrewriter" ,
264+ INITIALIZE_PASS_BEGIN (VirtRegRewriterLegacy , " virtregrewriter" ,
251265 " Virtual Register Rewriter" , false , false )
252266INITIALIZE_PASS_DEPENDENCY(SlotIndexesWrapperPass)
253267INITIALIZE_PASS_DEPENDENCY(LiveIntervalsWrapperPass)
254268INITIALIZE_PASS_DEPENDENCY(LiveDebugVariablesWrapperLegacy)
255269INITIALIZE_PASS_DEPENDENCY(LiveRegMatrixWrapperLegacy)
256270INITIALIZE_PASS_DEPENDENCY(LiveStacksWrapperLegacy)
257271INITIALIZE_PASS_DEPENDENCY(VirtRegMapWrapperLegacy)
258- INITIALIZE_PASS_END(VirtRegRewriter , " virtregrewriter" ,
272+ INITIALIZE_PASS_END(VirtRegRewriterLegacy , " virtregrewriter" ,
259273 " Virtual Register Rewriter" , false , false )
260274
261- void VirtRegRewriter ::getAnalysisUsage(AnalysisUsage &AU) const {
275+ void VirtRegRewriterLegacy ::getAnalysisUsage(AnalysisUsage &AU) const {
262276 AU.setPreservesCFG ();
263277 AU.addRequired <LiveIntervalsWrapperPass>();
264278 AU.addPreserved <LiveIntervalsWrapperPass>();
@@ -276,16 +290,47 @@ void VirtRegRewriter::getAnalysisUsage(AnalysisUsage &AU) const {
276290 MachineFunctionPass::getAnalysisUsage (AU);
277291}
278292
279- bool VirtRegRewriter::runOnMachineFunction (MachineFunction &fn) {
293+ bool VirtRegRewriterLegacy::runOnMachineFunction (MachineFunction &MF) {
294+ VirtRegMap &VRM = getAnalysis<VirtRegMapWrapperLegacy>().getVRM ();
295+ LiveIntervals &LIS = getAnalysis<LiveIntervalsWrapperPass>().getLIS ();
296+ LiveRegMatrix &LRM = getAnalysis<LiveRegMatrixWrapperLegacy>().getLRM ();
297+ SlotIndexes &Indexes = getAnalysis<SlotIndexesWrapperPass>().getSI ();
298+ LiveDebugVariables &DebugVars =
299+ getAnalysis<LiveDebugVariablesWrapperLegacy>().getLDV ();
300+
301+ VirtRegRewriter R (ClearVirtRegs, &Indexes, &LIS, &LRM, &VRM, &DebugVars);
302+ return R.run (MF);
303+ }
304+
305+ PreservedAnalyses VirtRegRewriterPass::run (MachineFunction &MF,
306+ MachineFunctionAnalysisManager &MFAM) {
307+ VirtRegMap &VRM = MFAM.getResult <VirtRegMapAnalysis>(MF);
308+ LiveIntervals &LIS = MFAM.getResult <LiveIntervalsAnalysis>(MF);
309+ LiveRegMatrix &LRM = MFAM.getResult <LiveRegMatrixAnalysis>(MF);
310+ SlotIndexes &Indexes = MFAM.getResult <SlotIndexesAnalysis>(MF);
311+ LiveDebugVariables &DebugVars = MFAM.getResult <LiveDebugVariablesAnalysis>(MF);
312+
313+ VirtRegRewriter R (ClearVirtRegs, &Indexes, &LIS, &LRM, &VRM, &DebugVars);
314+ if (!R.run (MF))
315+ return PreservedAnalyses::all ();
316+ auto PA = getMachineFunctionPassPreservedAnalyses ();
317+ PA.preserveSet <CFGAnalyses>();
318+ PA.preserve <LiveIntervalsAnalysis>();
319+ PA.preserve <SlotIndexesAnalysis>();
320+ PA.preserve <LiveStacksAnalysis>();
321+ // LiveDebugVariables is preserved by default, so clear it
322+ // if this VRegRewriter is the last one in the pipeline.
323+ if (ClearVirtRegs)
324+ PA.abandon <LiveDebugVariablesAnalysis>();
325+ return PA;
326+ }
327+
328+ bool VirtRegRewriter::run (MachineFunction &fn) {
280329 MF = &fn;
281330 TRI = MF->getSubtarget ().getRegisterInfo ();
282331 TII = MF->getSubtarget ().getInstrInfo ();
283332 MRI = &MF->getRegInfo ();
284- Indexes = &getAnalysis<SlotIndexesWrapperPass>().getSI ();
285- LIS = &getAnalysis<LiveIntervalsWrapperPass>().getLIS ();
286- LRM = &getAnalysis<LiveRegMatrixWrapperLegacy>().getLRM ();
287- VRM = &getAnalysis<VirtRegMapWrapperLegacy>().getVRM ();
288- DebugVars = &getAnalysis<LiveDebugVariablesWrapperLegacy>().getLDV ();
333+
289334 LLVM_DEBUG (dbgs () << " ********** REWRITE VIRTUAL REGISTERS **********\n "
290335 << " ********** Function: " << MF->getName () << ' \n ' );
291336 LLVM_DEBUG (VRM->dump ());
@@ -726,6 +771,13 @@ void VirtRegRewriter::rewrite() {
726771 RewriteRegs.clear ();
727772}
728773
774+ void VirtRegRewriterPass::printPipeline (raw_ostream &OS, function_ref<StringRef(StringRef)>) const {
775+ OS << " virt-reg-rewriter<" ;
776+ if (!ClearVirtRegs)
777+ OS << " no-" ;
778+ OS << " clear-vregs>" ;
779+ }
780+
729781FunctionPass *llvm::createVirtRegRewriter (bool ClearVirtRegs) {
730- return new VirtRegRewriter (ClearVirtRegs);
782+ return new VirtRegRewriterLegacy (ClearVirtRegs);
731783}
0 commit comments