Changes in directory llvm/lib/Target/ARM:
ARMRegisterInfo.cpp updated: 1.77 -> 1.78 --- Log message: Use a spilled free callee-saved register as scratch register. --- Diffs of the changes: (+17 -3) ARMRegisterInfo.cpp | 20 +++++++++++++++++--- 1 files changed, 17 insertions(+), 3 deletions(-) Index: llvm/lib/Target/ARM/ARMRegisterInfo.cpp diff -u llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.77 llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.78 --- llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.77 Thu Mar 1 02:26:31 2007 +++ llvm/lib/Target/ARM/ARMRegisterInfo.cpp Thu Mar 1 02:57:52 2007 @@ -313,6 +313,7 @@ } BitVector ARMRegisterInfo::getReservedRegs(const MachineFunction &MF) const { + // FIXME: avoid re-calculating this everytime. BitVector Reserved(getNumRegs()); Reserved.set(ARM::SP); Reserved.set(ARM::PC); @@ -619,6 +620,20 @@ .addReg(DestReg, false, false, true); } +/// findScratchRegister - Find a 'free' ARM register. If register scavenger +/// is not being used, R12 is available. Otherwise, try for a call-clobbered +/// register first and then a spilled callee-saved register if that fails. +static +unsigned findScratchRegister(RegScavenger *RS, const TargetRegisterClass *RC, + ARMFunctionInfo *AFI) { + unsigned Reg = RS ? RS->FindUnusedReg(RC, true) : (unsigned) ARM::R12; + if (Reg == 0) + // Try a already spilled CS register. + Reg = RS->FindUnusedReg(RC, AFI->getSpilledCSRegisters()); + + return Reg; +} + void ARMRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II, RegScavenger *RS) const{ unsigned i = 0; @@ -902,9 +917,8 @@ // 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'. - unsigned ScratchReg = RS - ? RS->FindUnusedReg(&ARM::GPRRegClass, true) : (unsigned)ARM::R12; - assert(ScratchReg != 0 && "Unable to find a free call-clobbered register!"); + unsigned ScratchReg = findScratchRegister(RS, &ARM::GPRRegClass, AFI); + assert(ScratchReg && "Unable to find a free register!"); emitARMRegPlusImmediate(MBB, II, ScratchReg, FrameReg, isSub ? -Offset : Offset, TII); MI.getOperand(i).ChangeToRegister(ScratchReg, false, false, true); _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits