Changes in directory llvm/lib/Target/ARM:
ARMLoadStoreOptimizer.cpp updated: 1.4 -> 1.5 --- Log message: Only safe to use a call-clobbered or spilled callee-saved register as scratch register. --- Diffs of the changes: (+8 -2) ARMLoadStoreOptimizer.cpp | 10 ++++++++-- 1 files changed, 8 insertions(+), 2 deletions(-) Index: llvm/lib/Target/ARM/ARMLoadStoreOptimizer.cpp diff -u llvm/lib/Target/ARM/ARMLoadStoreOptimizer.cpp:1.4 llvm/lib/Target/ARM/ARMLoadStoreOptimizer.cpp:1.5 --- llvm/lib/Target/ARM/ARMLoadStoreOptimizer.cpp:1.4 Tue Mar 6 20:38:05 2007 +++ llvm/lib/Target/ARM/ARMLoadStoreOptimizer.cpp Wed Mar 7 14:30:36 2007 @@ -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 @@ struct VISIBILITY_HIDDEN ARMLoadStoreOpt : public MachineFunctionPass { const TargetInstrInfo *TII; const MRegisterInfo *MRI; + ARMFunctionInfo *AFI; RegScavenger *RS; MachineBasicBlock::iterator RSI; @@ -587,8 +589,11 @@ // 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::runOnMachineFunction(MachineFunction &Fn) { const TargetMachine &TM = Fn.getTarget(); + AFI = Fn.getInfo<ARMFunctionInfo>(); TII = TM.getInstrInfo(); MRI = TM.getRegisterInfo(); RS = new RegScavenger(); _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits