@@ -197,7 +197,7 @@ VirtRegMap VirtRegMapAnalysis::run(MachineFunction &MF,
197197//
198198namespace {
199199
200- class VirtRegRewriter : public MachineFunctionPass {
200+ class VirtRegRewriter {
201201 MachineFunction *MF = nullptr ;
202202 const TargetRegisterInfo *TRI = nullptr ;
203203 const TargetInstrInfo *TII = nullptr ;
@@ -223,9 +223,21 @@ class VirtRegRewriter : public MachineFunctionPass {
223223
224224public:
225225 static char ID;
226- VirtRegRewriter (bool ClearVirtRegs_ = true ) :
227- MachineFunctionPass (ID),
228- ClearVirtRegs (ClearVirtRegs_) {}
226+ VirtRegRewriter (bool ClearVirtRegs, SlotIndexes *Indexes, LiveIntervals *LIS,
227+ LiveRegMatrix *LRM, VirtRegMap *VRM,
228+ LiveDebugVariables *DebugVars)
229+ : Indexes(Indexes), LIS(LIS), LRM(LRM), VRM(VRM), DebugVars(DebugVars),
230+ ClearVirtRegs (ClearVirtRegs) {}
231+
232+ bool run (MachineFunction &);
233+ };
234+
235+ class VirtRegRewriterLegacy : public MachineFunctionPass {
236+ public:
237+ static char ID;
238+ bool ClearVirtRegs;
239+ VirtRegRewriterLegacy (bool ClearVirtRegs = true )
240+ : MachineFunctionPass(ID), ClearVirtRegs(ClearVirtRegs) {}
229241
230242 void getAnalysisUsage (AnalysisUsage &AU) const override ;
231243
@@ -243,22 +255,22 @@ class VirtRegRewriter : public MachineFunctionPass {
243255
244256} // end anonymous namespace
245257
246- char VirtRegRewriter ::ID = 0 ;
258+ char VirtRegRewriterLegacy ::ID = 0 ;
247259
248- char &llvm::VirtRegRewriterID = VirtRegRewriter ::ID;
260+ char &llvm::VirtRegRewriterID = VirtRegRewriterLegacy ::ID;
249261
250- INITIALIZE_PASS_BEGIN (VirtRegRewriter , " virtregrewriter" ,
262+ INITIALIZE_PASS_BEGIN (VirtRegRewriterLegacy , " virtregrewriter" ,
251263 " Virtual Register Rewriter" , false , false )
252264INITIALIZE_PASS_DEPENDENCY(SlotIndexesWrapperPass)
253265INITIALIZE_PASS_DEPENDENCY(LiveIntervalsWrapperPass)
254266INITIALIZE_PASS_DEPENDENCY(LiveDebugVariablesWrapperLegacy)
255267INITIALIZE_PASS_DEPENDENCY(LiveRegMatrixWrapperLegacy)
256268INITIALIZE_PASS_DEPENDENCY(LiveStacksWrapperLegacy)
257269INITIALIZE_PASS_DEPENDENCY(VirtRegMapWrapperLegacy)
258- INITIALIZE_PASS_END(VirtRegRewriter , " virtregrewriter" ,
270+ INITIALIZE_PASS_END(VirtRegRewriterLegacy , " virtregrewriter" ,
259271 " Virtual Register Rewriter" , false , false )
260272
261- void VirtRegRewriter ::getAnalysisUsage(AnalysisUsage &AU) const {
273+ void VirtRegRewriterLegacy ::getAnalysisUsage(AnalysisUsage &AU) const {
262274 AU.setPreservesCFG ();
263275 AU.addRequired <LiveIntervalsWrapperPass>();
264276 AU.addPreserved <LiveIntervalsWrapperPass>();
@@ -276,16 +288,50 @@ void VirtRegRewriter::getAnalysisUsage(AnalysisUsage &AU) const {
276288 MachineFunctionPass::getAnalysisUsage (AU);
277289}
278290
279- bool VirtRegRewriter::runOnMachineFunction (MachineFunction &fn) {
291+ bool VirtRegRewriterLegacy::runOnMachineFunction (MachineFunction &MF) {
292+ VirtRegMap &VRM = getAnalysis<VirtRegMapWrapperLegacy>().getVRM ();
293+ LiveIntervals &LIS = getAnalysis<LiveIntervalsWrapperPass>().getLIS ();
294+ LiveRegMatrix &LRM = getAnalysis<LiveRegMatrixWrapperLegacy>().getLRM ();
295+ SlotIndexes &Indexes = getAnalysis<SlotIndexesWrapperPass>().getSI ();
296+ LiveDebugVariables &DebugVars =
297+ getAnalysis<LiveDebugVariablesWrapperLegacy>().getLDV ();
298+
299+ VirtRegRewriter R (ClearVirtRegs, &Indexes, &LIS, &LRM, &VRM, &DebugVars);
300+ return R.run (MF);
301+ }
302+
303+ PreservedAnalyses
304+ VirtRegRewriterPass::run (MachineFunction &MF,
305+ MachineFunctionAnalysisManager &MFAM) {
306+ VirtRegMap &VRM = MFAM.getResult <VirtRegMapAnalysis>(MF);
307+ LiveIntervals &LIS = MFAM.getResult <LiveIntervalsAnalysis>(MF);
308+ LiveRegMatrix &LRM = MFAM.getResult <LiveRegMatrixAnalysis>(MF);
309+ SlotIndexes &Indexes = MFAM.getResult <SlotIndexesAnalysis>(MF);
310+ LiveDebugVariables &DebugVars =
311+ MFAM.getResult <LiveDebugVariablesAnalysis>(MF);
312+
313+ VirtRegRewriter R (ClearVirtRegs, &Indexes, &LIS, &LRM, &VRM, &DebugVars);
314+ if (!R.run (MF))
315+ return PreservedAnalyses::all ();
316+
317+ auto PA = getMachineFunctionPassPreservedAnalyses ();
318+ PA.preserveSet <CFGAnalyses>();
319+ PA.preserve <LiveIntervalsAnalysis>();
320+ PA.preserve <SlotIndexesAnalysis>();
321+ PA.preserve <LiveStacksAnalysis>();
322+ // LiveDebugVariables is preserved by default, so clear it
323+ // if this VRegRewriter is the last one in the pipeline.
324+ if (ClearVirtRegs)
325+ PA.abandon <LiveDebugVariablesAnalysis>();
326+ return PA;
327+ }
328+
329+ bool VirtRegRewriter::run (MachineFunction &fn) {
280330 MF = &fn;
281331 TRI = MF->getSubtarget ().getRegisterInfo ();
282332 TII = MF->getSubtarget ().getInstrInfo ();
283333 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 ();
334+
289335 LLVM_DEBUG (dbgs () << " ********** REWRITE VIRTUAL REGISTERS **********\n "
290336 << " ********** Function: " << MF->getName () << ' \n ' );
291337 LLVM_DEBUG (VRM->dump ());
@@ -726,6 +772,13 @@ void VirtRegRewriter::rewrite() {
726772 RewriteRegs.clear ();
727773}
728774
775+ void VirtRegRewriterPass::printPipeline (
776+ raw_ostream &OS, function_ref<StringRef(StringRef)>) const {
777+ OS << " virt-reg-rewriter" ;
778+ if (!ClearVirtRegs)
779+ OS << " <no-clear-vregs>" ;
780+ }
781+
729782FunctionPass *llvm::createVirtRegRewriter (bool ClearVirtRegs) {
730- return new VirtRegRewriter (ClearVirtRegs);
783+ return new VirtRegRewriterLegacy (ClearVirtRegs);
731784}
0 commit comments