From c1c2de0ae7abecb4120dd28f722a2b73319b0cd8 Mon Sep 17 00:00:00 2001 From: Evan Cheng Date: Thu, 1 Mar 2007 08:57:52 +0000 Subject: [PATCH] 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 --- lib/Target/ARM/ARMRegisterInfo.cpp | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/lib/Target/ARM/ARMRegisterInfo.cpp b/lib/Target/ARM/ARMRegisterInfo.cpp index 206ac2f0ecb..503d560403c 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); -- 2.34.1