29
29
#include " llvm/CodeGen/MachineFunctionPass.h"
30
30
#include " llvm/CodeGen/MachineInstr.h"
31
31
#include " llvm/CodeGen/MachineOperand.h"
32
+ #include " llvm/CodeGen/MachinePassManager.h"
32
33
#include " llvm/CodeGen/MachineRegisterInfo.h"
33
34
#include " llvm/CodeGen/SlotIndexes.h"
34
35
#include " llvm/CodeGen/TargetFrameLowering.h"
@@ -197,7 +198,7 @@ VirtRegMap VirtRegMapAnalysis::run(MachineFunction &MF,
197
198
//
198
199
namespace {
199
200
200
- class VirtRegRewriter : public MachineFunctionPass {
201
+ class VirtRegRewriter {
201
202
MachineFunction *MF = nullptr ;
202
203
const TargetRegisterInfo *TRI = nullptr ;
203
204
const TargetInstrInfo *TII = nullptr ;
@@ -223,9 +224,22 @@ class VirtRegRewriter : public MachineFunctionPass {
223
224
224
225
public:
225
226
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) {}
229
243
230
244
void getAnalysisUsage (AnalysisUsage &AU) const override ;
231
245
@@ -243,22 +257,22 @@ class VirtRegRewriter : public MachineFunctionPass {
243
257
244
258
} // end anonymous namespace
245
259
246
- char VirtRegRewriter ::ID = 0 ;
260
+ char VirtRegRewriterLegacy ::ID = 0 ;
247
261
248
- char &llvm::VirtRegRewriterID = VirtRegRewriter ::ID;
262
+ char &llvm::VirtRegRewriterID = VirtRegRewriterLegacy ::ID;
249
263
250
- INITIALIZE_PASS_BEGIN (VirtRegRewriter , " virtregrewriter" ,
264
+ INITIALIZE_PASS_BEGIN (VirtRegRewriterLegacy , " virtregrewriter" ,
251
265
" Virtual Register Rewriter" , false , false )
252
266
INITIALIZE_PASS_DEPENDENCY(SlotIndexesWrapperPass)
253
267
INITIALIZE_PASS_DEPENDENCY(LiveIntervalsWrapperPass)
254
268
INITIALIZE_PASS_DEPENDENCY(LiveDebugVariablesWrapperLegacy)
255
269
INITIALIZE_PASS_DEPENDENCY(LiveRegMatrixWrapperLegacy)
256
270
INITIALIZE_PASS_DEPENDENCY(LiveStacksWrapperLegacy)
257
271
INITIALIZE_PASS_DEPENDENCY(VirtRegMapWrapperLegacy)
258
- INITIALIZE_PASS_END(VirtRegRewriter , " virtregrewriter" ,
272
+ INITIALIZE_PASS_END(VirtRegRewriterLegacy , " virtregrewriter" ,
259
273
" Virtual Register Rewriter" , false , false )
260
274
261
- void VirtRegRewriter ::getAnalysisUsage(AnalysisUsage &AU) const {
275
+ void VirtRegRewriterLegacy ::getAnalysisUsage(AnalysisUsage &AU) const {
262
276
AU.setPreservesCFG ();
263
277
AU.addRequired <LiveIntervalsWrapperPass>();
264
278
AU.addPreserved <LiveIntervalsWrapperPass>();
@@ -276,16 +290,47 @@ void VirtRegRewriter::getAnalysisUsage(AnalysisUsage &AU) const {
276
290
MachineFunctionPass::getAnalysisUsage (AU);
277
291
}
278
292
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) {
280
329
MF = &fn;
281
330
TRI = MF->getSubtarget ().getRegisterInfo ();
282
331
TII = MF->getSubtarget ().getInstrInfo ();
283
332
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
+
289
334
LLVM_DEBUG (dbgs () << " ********** REWRITE VIRTUAL REGISTERS **********\n "
290
335
<< " ********** Function: " << MF->getName () << ' \n ' );
291
336
LLVM_DEBUG (VRM->dump ());
@@ -726,6 +771,13 @@ void VirtRegRewriter::rewrite() {
726
771
RewriteRegs.clear ();
727
772
}
728
773
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
+
729
781
FunctionPass *llvm::createVirtRegRewriter (bool ClearVirtRegs) {
730
- return new VirtRegRewriter (ClearVirtRegs);
782
+ return new VirtRegRewriterLegacy (ClearVirtRegs);
731
783
}
0 commit comments