Only safe to use a call-clobbered or spilled callee-saved register as scratch register.
authorEvan Cheng <evan.cheng@apple.com>
Wed, 7 Mar 2007 20:30:36 +0000 (20:30 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Wed, 7 Mar 2007 20:30:36 +0000 (20:30 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@35010 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/ARMLoadStoreOptimizer.cpp

index 59421b9ca8ba9a69c46dd6e1c127fded0eaea609..ab86bbf9b799a3e3319741f85ccf25ce0340c68b 100644 (file)
@@ -15,6 +15,7 @@
 #define DEBUG_TYPE "arm-ldst-opt"
 #include "ARM.h"
 #include "ARMAddressingModes.h"
+#include "ARMMachineFunctionInfo.h"
 #include "ARMRegisterInfo.h"
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/ADT/SmallVector.h"
@@ -39,6 +40,7 @@ namespace {
   struct VISIBILITY_HIDDEN ARMLoadStoreOpt : public MachineFunctionPass {
     const TargetInstrInfo *TII;
     const MRegisterInfo *MRI;
+    ARMFunctionInfo *AFI;
     RegScavenger *RS;
     MachineBasicBlock::iterator RSI;
 
@@ -587,8 +589,11 @@ bool ARMLoadStoreOpt::LoadStoreMultipleOpti(MachineBasicBlock &MBB) {
         // First advance to the instruction just before the start of the chain.
         if (RSI != MBB.begin())
           RS->forward(prior(RSI));
-        // Find a scratch register.
-        Scratch = RS->FindUnusedReg(&ARM::GPRRegClass);
+        // Find a scratch register. Make sure it's a call clobbered register or
+        // a spilled callee-saved register.
+        Scratch = RS->FindUnusedReg(&ARM::GPRRegClass, true);
+        if (!Scratch)
+          RS->FindUnusedReg(&ARM::GPRRegClass, AFI->getSpilledCSRegisters());
         // Process the load / store instructions.
         RS->forward(prior(MBBI));
 
@@ -661,6 +666,7 @@ bool ARMLoadStoreOpt::MergeReturnIntoLDM(MachineBasicBlock &MBB) {
 
 bool ARMLoadStoreOpt::runOnMachineFunction(MachineFunction &Fn) {
   const TargetMachine &TM = Fn.getTarget();
+  AFI = Fn.getInfo<ARMFunctionInfo>();
   TII = TM.getInstrInfo();
   MRI = TM.getRegisterInfo();
   RS = new RegScavenger();