Changeset View
Changeset View
Standalone View
Standalone View
lib/Target/ARM/ARMFrameLowering.cpp
Show First 20 Lines • Show All 1,654 Lines • ▼ Show 20 Lines | void ARMFrameLowering::determineCalleeSaves(MachineFunction &MF, | ||||
if (RegInfo->hasBasePointer(MF)) | if (RegInfo->hasBasePointer(MF)) | ||||
SavedRegs.set(RegInfo->getBaseRegister()); | SavedRegs.set(RegInfo->getBaseRegister()); | ||||
// Don't spill FP if the frame can be eliminated. This is determined | // Don't spill FP if the frame can be eliminated. This is determined | ||||
// by scanning the callee-save registers to see if any is modified. | // by scanning the callee-save registers to see if any is modified. | ||||
const MCPhysReg *CSRegs = RegInfo->getCalleeSavedRegs(&MF); | const MCPhysReg *CSRegs = RegInfo->getCalleeSavedRegs(&MF); | ||||
for (unsigned i = 0; CSRegs[i]; ++i) { | for (unsigned i = 0; CSRegs[i]; ++i) { | ||||
unsigned Reg = CSRegs[i]; | unsigned Reg = CSRegs[i]; | ||||
if (STI.isRWPI() && Reg == ARM::R9) { | |||||
// Paranoid check for use of R9 with RWPI. Clobbering R9 with -frwpi will | |||||
// emit warnings about undefined behaviour but maybe theres's a valid use | |||||
// case so on that basis allow it to be pushed/popped in the | |||||
// prologue/epilogue. | |||||
} else if (Reg > ARM::R0 && ARM::GPRRegClass.contains(Reg) && | |||||
STI.isRRegisterReserved(Reg - ARM::R0)) { | |||||
LLVM_DEBUG(dbgs() | |||||
<< printReg(Reg, TRI) | |||||
<< " has been reserved and" | |||||
<< " should not be allocatable" | |||||
<< " or spillable.\n"); | |||||
SavedRegs.reset(Reg); | |||||
continue; | |||||
} | |||||
bool Spilled = false; | bool Spilled = false; | ||||
if (SavedRegs.test(Reg)) { | if (SavedRegs.test(Reg)) { | ||||
Spilled = true; | Spilled = true; | ||||
CanEliminateFrame = false; | CanEliminateFrame = false; | ||||
} | } | ||||
if (!ARM::GPRRegClass.contains(Reg)) { | if (!ARM::GPRRegClass.contains(Reg)) { | ||||
if (Spilled) { | if (Spilled) { | ||||
▲ Show 20 Lines • Show All 172 Lines • ▼ Show 20 Lines | if (AFI->isThumb1OnlyFunction()) { | ||||
// r4-r6 can be used in the prologue if they are pushed by the first push | // r4-r6 can be used in the prologue if they are pushed by the first push | ||||
// instruction. | // instruction. | ||||
for (unsigned Reg : {ARM::R4, ARM::R5, ARM::R6}) { | for (unsigned Reg : {ARM::R4, ARM::R5, ARM::R6}) { | ||||
if (SavedRegs.test(Reg)) { | if (SavedRegs.test(Reg)) { | ||||
--RegDeficit; | --RegDeficit; | ||||
LLVM_DEBUG(dbgs() << printReg(Reg, TRI) | LLVM_DEBUG(dbgs() << printReg(Reg, TRI) | ||||
<< " is saved low register, RegDeficit = " | << " is saved low register, RegDeficit = " | ||||
<< RegDeficit << "\n"); | << RegDeficit << "\n"); | ||||
} else { | } else if (!STI.isRRegisterReserved(Reg - ARM::R0)) { | ||||
AvailableRegs.push_back(Reg); | AvailableRegs.push_back(Reg); | ||||
LLVM_DEBUG( | LLVM_DEBUG( | ||||
dbgs() | dbgs() | ||||
<< printReg(Reg, TRI) | << printReg(Reg, TRI) | ||||
<< " is non-saved low register, adding to AvailableRegs\n"); | << " is non-saved low register, adding to AvailableRegs\n"); | ||||
} | } | ||||
} | } | ||||
// r7 can be used if it is not being used as the frame pointer. | // r7 can be used if it is not being used as the frame pointer. | ||||
if (!HasFP) { | if (!HasFP) { | ||||
if (SavedRegs.test(ARM::R7)) { | if (SavedRegs.test(ARM::R7)) { | ||||
--RegDeficit; | --RegDeficit; | ||||
LLVM_DEBUG(dbgs() << "%r7 is saved low register, RegDeficit = " | LLVM_DEBUG(dbgs() << "%r7 is saved low register, RegDeficit = " | ||||
<< RegDeficit << "\n"); | << RegDeficit << "\n"); | ||||
} else { | } else if (!STI.isRRegisterReserved(7)) { | ||||
AvailableRegs.push_back(ARM::R7); | AvailableRegs.push_back(ARM::R7); | ||||
LLVM_DEBUG( | LLVM_DEBUG( | ||||
dbgs() | dbgs() | ||||
<< "%r7 is non-saved low register, adding to AvailableRegs\n"); | << "%r7 is non-saved low register, adding to AvailableRegs\n"); | ||||
} | } | ||||
} | } | ||||
// Each of r8-r11 needs to be copied to a low register, then pushed. | // Each of r8-r11 needs to be copied to a low register, then pushed. | ||||
▲ Show 20 Lines • Show All 638 Lines • Show Last 20 Lines |