MRegisterInfo disowns RegScavenger. It's immutable.
authorEvan Cheng <evan.cheng@apple.com>
Wed, 28 Feb 2007 00:17:36 +0000 (00:17 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Wed, 28 Feb 2007 00:17:36 +0000 (00:17 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34706 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Target/MRegisterInfo.h
lib/CodeGen/PrologEpilogInserter.cpp

index dd666a31a00a6e709efcdc17b50f7e87ab9f368b..7d412292b38fe352bf06f3c97344d18c1db51296 100644 (file)
@@ -214,12 +214,6 @@ protected:
   virtual ~MRegisterInfo();
 public:
 
-  /// getRegScavenger - Returns pointer to an instance of register scavenger it
-  /// the specific target is making use of one.
-  virtual RegScavenger *getRegScavenger() const {
-    return NULL;
-  }
-  
   enum {                        // Define some target independent constants
     /// NoRegister - This physical register is not a real target register.  It
     /// is useful as a sentinal.
@@ -398,6 +392,12 @@ public:
     return false;
   }
 
+  /// requiresRegisterScavenging - returns true if the target requires (and
+  /// can make use of) the register scavenger.
+  virtual bool requiresRegisterScavenging() const {
+    return false;
+  }
+  
   /// hasFP - Return true if the specified function should have a dedicated frame
   /// pointer register. For most targets this is true only if the function has
   /// variable sized allocas or if frame pointer elimination is disabled.
@@ -452,7 +452,8 @@ public:
   /// finished product. The return value is the number of instructions
   /// added to (negative if removed from) the basic block.
   ///
-  virtual void eliminateFrameIndex(MachineBasicBlock::iterator MI) const = 0;
+  virtual void eliminateFrameIndex(MachineBasicBlock::iterator MI,
+                                   RegScavenger *RS = NULL) const = 0;
 
   /// emitProlog/emitEpilog - These methods insert prolog and epilog code into
   /// the function. The return value is the number of instructions
index 82b431e13904644d8e9ac7b81d0d2ced48edbeaf..9a25859a500d7fc53e46c44d9673ea05732ccfb9 100644 (file)
@@ -442,7 +442,7 @@ void PEI::replaceFrameIndices(MachineFunction &Fn) {
   const TargetMachine &TM = Fn.getTarget();
   assert(TM.getRegisterInfo() && "TM::getRegisterInfo() must be implemented!");
   const MRegisterInfo &MRI = *TM.getRegisterInfo();
-  RegScavenger *RS = MRI.getRegScavenger();
+  RegScavenger *RS = MRI.requiresRegisterScavenging() ? new RegScavenger():NULL;
 
   for (MachineFunction::iterator BB = Fn.begin(), E = Fn.end(); BB != E; ++BB) {
     if (RS) RS->reset(BB);
@@ -451,7 +451,7 @@ void PEI::replaceFrameIndices(MachineFunction &Fn) {
         if (I->getOperand(i).isFrameIndex()) {
           // If this instruction has a FrameIndex operand, we need to use that
           // target machine register info object to eliminate it.
-          MRI.eliminateFrameIndex(I);
+          MRI.eliminateFrameIndex(I, RS);
           break;
         }
       // Update register states.