Don't spill LR as a callee saved register.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34533 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Jim Laskey
2007-02-23 20:34:16 +00:00
parent 600c383e5c
commit 2a27a7598b
3 changed files with 19 additions and 2 deletions

View File

@@ -26,6 +26,10 @@ private:
/// stored. Also used as an anchor for instructions that need to be altered /// stored. Also used as an anchor for instructions that need to be altered
/// when using frame pointers (dyna_add, dyna_sub.) /// when using frame pointers (dyna_add, dyna_sub.)
int FramePointerSaveIndex; int FramePointerSaveIndex;
/// UsesLR - Indicates whether LR is used in the current function.
///
bool UsesLR;
public: public:
PPCFunctionInfo(MachineFunction& MF) PPCFunctionInfo(MachineFunction& MF)
@@ -34,6 +38,9 @@ public:
int getFramePointerSaveIndex() const { return FramePointerSaveIndex; } int getFramePointerSaveIndex() const { return FramePointerSaveIndex; }
void setFramePointerSaveIndex(int Idx) { FramePointerSaveIndex = Idx; } void setFramePointerSaveIndex(int Idx) { FramePointerSaveIndex = Idx; }
void setUsesLR(bool U) { UsesLR = U; }
bool usesLR() { return UsesLR; }
}; };

View File

@@ -439,8 +439,8 @@ bool PPCRegisterInfo::hasFP(const MachineFunction &MF) const {
/// usesLR - Returns if the link registers (LR) has been used in the function. /// usesLR - Returns if the link registers (LR) has been used in the function.
/// ///
bool PPCRegisterInfo::usesLR(MachineFunction &MF) const { bool PPCRegisterInfo::usesLR(MachineFunction &MF) const {
const bool *PhysRegsUsed = MF.getUsedPhysregs(); PPCFunctionInfo *FI = MF.getInfo<PPCFunctionInfo>();
return PhysRegsUsed[getRARegister()]; return FI->usesLR();
} }
void PPCRegisterInfo:: void PPCRegisterInfo::
@@ -774,6 +774,15 @@ void PPCRegisterInfo::determineFrameLayout(MachineFunction &MF) const {
MFI->setStackSize(FrameSize); MFI->setStackSize(FrameSize);
} }
void PPCRegisterInfo::processFunctionBeforeCalleeSavedScan(MachineFunction &MF)
const {
// Save and clear the LR state.
PPCFunctionInfo *FI = MF.getInfo<PPCFunctionInfo>();
unsigned LR = getRARegister();
FI->setUsesLR(MF.isPhysRegUsed(LR));
MF.changePhyRegUsed(LR, false);
}
void PPCRegisterInfo::emitPrologue(MachineFunction &MF) const { void PPCRegisterInfo::emitPrologue(MachineFunction &MF) const {
MachineBasicBlock &MBB = MF.front(); // Prolog goes in entry BB MachineBasicBlock &MBB = MF.front(); // Prolog goes in entry BB
MachineBasicBlock::iterator MBBI = MBB.begin(); MachineBasicBlock::iterator MBBI = MBB.begin();

View File

@@ -82,6 +82,7 @@ public:
/// frame size. /// frame size.
void determineFrameLayout(MachineFunction &MF) const; void determineFrameLayout(MachineFunction &MF) const;
void processFunctionBeforeCalleeSavedScan(MachineFunction &MF) const;
void emitPrologue(MachineFunction &MF) const; void emitPrologue(MachineFunction &MF) const;
void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const; void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const;