From 603b83ebcdfb9c27e44c1da16f2799755e3e3022 Mon Sep 17 00:00:00 2001 From: Evan Cheng Date: Wed, 7 Mar 2007 20:30:36 +0000 Subject: [PATCH] Only safe to use a call-clobbered or spilled callee-saved register as scratch register. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@35010 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/ARM/ARMLoadStoreOptimizer.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/Target/ARM/ARMLoadStoreOptimizer.cpp b/lib/Target/ARM/ARMLoadStoreOptimizer.cpp index 59421b9ca8b..ab86bbf9b79 100644 --- a/lib/Target/ARM/ARMLoadStoreOptimizer.cpp +++ b/lib/Target/ARM/ARMLoadStoreOptimizer.cpp @@ -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(); TII = TM.getInstrInfo(); MRI = TM.getRegisterInfo(); RS = new RegScavenger();