diff options
author | Evan Cheng <evan.cheng@apple.com> | 2007-03-01 08:57:52 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2007-03-01 08:57:52 +0000 |
commit | c1c2de0ae7abecb4120dd28f722a2b73319b0cd8 (patch) | |
tree | 8f80cbb8acbd09635260083ab56c7e469b7d4fb4 | |
parent | 5196b3680cf8df32b6c763e3d97e963e45150e5a (diff) |
Use a spilled free callee-saved register as scratch register.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34785 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Target/ARM/ARMRegisterInfo.cpp | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/lib/Target/ARM/ARMRegisterInfo.cpp b/lib/Target/ARM/ARMRegisterInfo.cpp index 206ac2f0ec..503d560403 100644 --- a/lib/Target/ARM/ARMRegisterInfo.cpp +++ b/lib/Target/ARM/ARMRegisterInfo.cpp @@ -313,6 +313,7 @@ ARMRegisterInfo::getCalleeSavedRegClasses() const { } 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 @@ static void emitThumbConstant(MachineBasicBlock &MBB, .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 @@ void ARMRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II, // 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); |