summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2007-12-08 06:39:11 +0000
committerChris Lattner <sabre@nondot.org>2007-12-08 06:39:11 +0000
commita6c8297e8489438a46fc1e2864b2f1d0956bd12b (patch)
treef5bfa300555e5315ff21fe113d6b336dffd2dec3 /llvm/lib
parent1ebfecc8d03fb610aaea141079b06abaa27a2935 (diff)
downloadbcm5719-llvm-a6c8297e8489438a46fc1e2864b2f1d0956bd12b.tar.gz
bcm5719-llvm-a6c8297e8489438a46fc1e2864b2f1d0956bd12b.zip
refactor some code to avoid overloading the name 'usesLR' in
different places to mean different things. Document what the one in PPCFunctionInfo means and when it is valid. llvm-svn: 44699
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Target/PowerPC/PPCMachineFunctionInfo.h6
-rw-r--r--llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp16
-rw-r--r--llvm/lib/Target/PowerPC/PPCRegisterInfo.h4
3 files changed, 14 insertions, 12 deletions
diff --git a/llvm/lib/Target/PowerPC/PPCMachineFunctionInfo.h b/llvm/lib/Target/PowerPC/PPCMachineFunctionInfo.h
index e227456e635..bf1fea211b4 100644
--- a/llvm/lib/Target/PowerPC/PPCMachineFunctionInfo.h
+++ b/llvm/lib/Target/PowerPC/PPCMachineFunctionInfo.h
@@ -39,8 +39,12 @@ public:
int getFramePointerSaveIndex() const { return FramePointerSaveIndex; }
void setFramePointerSaveIndex(int Idx) { FramePointerSaveIndex = Idx; }
+ /// UsesLR - This is set when the prolog/epilog inserter does its initial scan
+ /// of the function, it is true if the LR/LR8 register is ever explicitly
+ /// accessed/clobbered in the machine function (e.g. by calls and movpctolr,
+ /// which is used in PIC generation).
void setUsesLR(bool U) { UsesLR = U; }
- bool usesLR() { return UsesLR; }
+ bool usesLR() const { return UsesLR; }
};
diff --git a/llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp b/llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp
index f93c2ce9e0b..679ca2e58f5 100644
--- a/llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp
+++ b/llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp
@@ -645,11 +645,13 @@ bool PPCRegisterInfo::hasFP(const MachineFunction &MF) const {
return MFI->getStackSize() && needsFP(MF);
}
-/// usesLR - Returns if the link registers (LR) has been used in the function.
-///
-bool PPCRegisterInfo::usesLR(MachineFunction &MF) const {
- PPCFunctionInfo *FI = MF.getInfo<PPCFunctionInfo>();
- return FI->usesLR();
+/// MustSaveLR - Return true if this function requires that we save the LR
+/// register onto the stack in the prolog and restore it in the epilog of the function.
+static bool MustSaveLR(const MachineFunction &MF) {
+ return MF.getInfo<PPCFunctionInfo>()->usesLR() ||
+ // FIXME: Anything that has a call should clobber the LR register,
+ // isn't this redundant??
+ MF.getFrameInfo()->hasCalls();
}
void PPCRegisterInfo::
@@ -1062,7 +1064,7 @@ void PPCRegisterInfo::emitPrologue(MachineFunction &MF) const {
// Get operating system
bool IsMachoABI = Subtarget.isMachoABI();
// Check if the link register (LR) has been used.
- bool UsesLR = MFI->hasCalls() || usesLR(MF);
+ bool UsesLR = MustSaveLR(MF);
// Do we have a frame pointer for this function?
bool HasFP = hasFP(MF) && FrameSize;
@@ -1226,7 +1228,7 @@ void PPCRegisterInfo::emitEpilogue(MachineFunction &MF,
// Get operating system
bool IsMachoABI = Subtarget.isMachoABI();
// Check if the link register (LR) has been used.
- bool UsesLR = MFI->hasCalls() || usesLR(MF);
+ bool UsesLR = MustSaveLR(MF);
// Do we have a frame pointer for this function?
bool HasFP = hasFP(MF) && FrameSize;
diff --git a/llvm/lib/Target/PowerPC/PPCRegisterInfo.h b/llvm/lib/Target/PowerPC/PPCRegisterInfo.h
index 2106c6e667b..b4a0415621e 100644
--- a/llvm/lib/Target/PowerPC/PPCRegisterInfo.h
+++ b/llvm/lib/Target/PowerPC/PPCRegisterInfo.h
@@ -96,10 +96,6 @@ public:
MachineBasicBlock &MBB,
MachineBasicBlock::iterator I) const;
- /// usesLR - Returns if the link registers (LR) has been used in the function.
- ///
- bool usesLR(MachineFunction &MF) const;
-
void lowerDynamicAlloc(MachineBasicBlock::iterator II) const;
void eliminateFrameIndex(MachineBasicBlock::iterator II,
int SPAdj, RegScavenger *RS = NULL) const;
OpenPOWER on IntegriCloud