diff options
author | Jim Laskey <jlaskey@mac.com> | 2007-02-23 20:34:16 +0000 |
---|---|---|
committer | Jim Laskey <jlaskey@mac.com> | 2007-02-23 20:34:16 +0000 |
commit | 2a27a7598b90359696e31cb665914206f369d1f0 (patch) | |
tree | 8d168f806a5d67325afc59a07545838c75140bbe /lib/Target/PowerPC | |
parent | 600c383e5c96d4b107b3e6ed4515eac25246cb02 (diff) | |
download | external_llvm-2a27a7598b90359696e31cb665914206f369d1f0.zip external_llvm-2a27a7598b90359696e31cb665914206f369d1f0.tar.gz external_llvm-2a27a7598b90359696e31cb665914206f369d1f0.tar.bz2 |
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
Diffstat (limited to 'lib/Target/PowerPC')
-rw-r--r-- | lib/Target/PowerPC/PPCMachineFunctionInfo.h | 7 | ||||
-rw-r--r-- | lib/Target/PowerPC/PPCRegisterInfo.cpp | 13 | ||||
-rw-r--r-- | lib/Target/PowerPC/PPCRegisterInfo.h | 1 |
3 files changed, 19 insertions, 2 deletions
diff --git a/lib/Target/PowerPC/PPCMachineFunctionInfo.h b/lib/Target/PowerPC/PPCMachineFunctionInfo.h index b3e1017..e227456 100644 --- a/lib/Target/PowerPC/PPCMachineFunctionInfo.h +++ b/lib/Target/PowerPC/PPCMachineFunctionInfo.h @@ -26,6 +26,10 @@ private: /// stored. Also used as an anchor for instructions that need to be altered /// when using frame pointers (dyna_add, dyna_sub.) int FramePointerSaveIndex; + + /// UsesLR - Indicates whether LR is used in the current function. + /// + bool UsesLR; public: PPCFunctionInfo(MachineFunction& MF) @@ -34,6 +38,9 @@ public: int getFramePointerSaveIndex() const { return FramePointerSaveIndex; } void setFramePointerSaveIndex(int Idx) { FramePointerSaveIndex = Idx; } + + void setUsesLR(bool U) { UsesLR = U; } + bool usesLR() { return UsesLR; } }; diff --git a/lib/Target/PowerPC/PPCRegisterInfo.cpp b/lib/Target/PowerPC/PPCRegisterInfo.cpp index 1dda53a..86d17f6 100644 --- a/lib/Target/PowerPC/PPCRegisterInfo.cpp +++ b/lib/Target/PowerPC/PPCRegisterInfo.cpp @@ -439,8 +439,8 @@ bool PPCRegisterInfo::hasFP(const MachineFunction &MF) const { /// usesLR - Returns if the link registers (LR) has been used in the function. /// bool PPCRegisterInfo::usesLR(MachineFunction &MF) const { - const bool *PhysRegsUsed = MF.getUsedPhysregs(); - return PhysRegsUsed[getRARegister()]; + PPCFunctionInfo *FI = MF.getInfo<PPCFunctionInfo>(); + return FI->usesLR(); } void PPCRegisterInfo:: @@ -774,6 +774,15 @@ void PPCRegisterInfo::determineFrameLayout(MachineFunction &MF) const { 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 { MachineBasicBlock &MBB = MF.front(); // Prolog goes in entry BB MachineBasicBlock::iterator MBBI = MBB.begin(); diff --git a/lib/Target/PowerPC/PPCRegisterInfo.h b/lib/Target/PowerPC/PPCRegisterInfo.h index eedb627..5ca2d7d 100644 --- a/lib/Target/PowerPC/PPCRegisterInfo.h +++ b/lib/Target/PowerPC/PPCRegisterInfo.h @@ -82,6 +82,7 @@ public: /// frame size. void determineFrameLayout(MachineFunction &MF) const; + void processFunctionBeforeCalleeSavedScan(MachineFunction &MF) const; void emitPrologue(MachineFunction &MF) const; void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const; |