Start making use of RegScavenger.
authorEvan Cheng <evan.cheng@apple.com>
Wed, 28 Feb 2007 00:21:58 +0000 (00:21 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Wed, 28 Feb 2007 00:21:58 +0000 (00:21 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34708 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/ARMRegisterInfo.cpp

index 49e8cc20a5cc2da7b015792377e4dfe068b0ec2f..c888034b4101a93b738bd5ebfffe86e24b194ffd 100644 (file)
@@ -85,17 +85,13 @@ ARMRegisterInfo::ARMRegisterInfo(const TargetInstrInfo &tii,
   : ARMGenRegisterInfo(ARM::ADJCALLSTACKDOWN, ARM::ADJCALLSTACKUP),
     TII(tii), STI(sti),
     FramePtr(STI.useThumbBacktraces() ? ARM::R7 : ARM::R11) {
-  RS = new RegScavenger();
+  RS = (EnableScavenging) ? new RegScavenger() : NULL;
 }
 
 ARMRegisterInfo::~ARMRegisterInfo() {
   delete RS;
 }
 
-RegScavenger *ARMRegisterInfo::getRegScavenger() const {
-  return EnableScavenging ? RS : NULL;
-}
-
 bool ARMRegisterInfo::spillCalleeSavedRegisters(MachineBasicBlock &MBB,
                                                 MachineBasicBlock::iterator MI,
                                 const std::vector<CalleeSavedInfo> &CSI) const {
@@ -330,6 +326,10 @@ BitVector ARMRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
   return Reserved;
 }
 
+bool ARMRegisterInfo::requiresRegisterScavenging() const {
+  return EnableScavenging;
+}
+
 /// hasFP - Return true if the specified function should have a dedicated frame
 /// pointer register.  This is true if the function has variable sized allocas
 /// or if frame pointer elimination is disabled.
@@ -616,7 +616,8 @@ static void emitThumbConstant(MachineBasicBlock &MBB,
       .addReg(DestReg, false, false, true);
 }
 
-void ARMRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II) const{
+void ARMRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
+                                          RegScavenger *RS) const{
   unsigned i = 0;
   MachineInstr &MI = *II;
   MachineBasicBlock &MBB = *MI.getParent();
@@ -898,9 +899,12 @@ void ARMRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II) const{
     // If the offset we have is too large to fit into the instruction, we need
     // to form it with a series of ADDri's.  Do this by taking 8-bit chunks
     // out of 'Offset'.
-    emitARMRegPlusImmediate(MBB, II, ARM::R12, FrameReg,
+    unsigned ScratchReg = RS
+      ? RS->FindUnusedReg(&ARM::GPRRegClass, true) : (unsigned)ARM::R12;
+    assert(ScratchReg != 0 && "Unable to find a free call-clobbered register!");
+    emitARMRegPlusImmediate(MBB, II, ScratchReg, FrameReg,
                             isSub ? -Offset : Offset, TII);
-    MI.getOperand(i).ChangeToRegister(ARM::R12, false, false, true);
+    MI.getOperand(i).ChangeToRegister(ScratchReg, false, false, true);
   }
 }