Changes in directory llvm/lib/Target/PowerPC:
PPCMachineFunctionInfo.h updated: 1.4 -> 1.5 PPCRegisterInfo.cpp updated: 1.113 -> 1.114 PPCRegisterInfo.h updated: 1.30 -> 1.31 --- Log message: Duplicate use of LR, take 2. --- Diffs of the changes: (+42 -26) PPCMachineFunctionInfo.h | 7 +++++ PPCRegisterInfo.cpp | 60 ++++++++++++++++++++++++++--------------------- PPCRegisterInfo.h | 1 3 files changed, 42 insertions(+), 26 deletions(-) Index: llvm/lib/Target/PowerPC/PPCMachineFunctionInfo.h diff -u llvm/lib/Target/PowerPC/PPCMachineFunctionInfo.h:1.4 llvm/lib/Target/PowerPC/PPCMachineFunctionInfo.h:1.5 --- llvm/lib/Target/PowerPC/PPCMachineFunctionInfo.h:1.4 Mon Feb 26 20:55:29 2007 +++ llvm/lib/Target/PowerPC/PPCMachineFunctionInfo.h Tue Feb 27 05:55:44 2007 @@ -26,6 +26,10 @@ /// 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 @@ int getFramePointerSaveIndex() const { return FramePointerSaveIndex; } void setFramePointerSaveIndex(int Idx) { FramePointerSaveIndex = Idx; } + + void setUsesLR(bool U) { UsesLR = U; } + bool usesLR() { return UsesLR; } }; Index: llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp diff -u llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp:1.113 llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp:1.114 --- llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp:1.113 Mon Feb 26 20:55:29 2007 +++ llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp Tue Feb 27 05:55:45 2007 @@ -538,8 +538,8 @@ /// 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:: @@ -874,6 +874,15 @@ 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(); @@ -899,9 +908,6 @@ determineFrameLayout(MF); unsigned FrameSize = MFI->getStackSize(); - // Skip if a leaf routine. - if (!FrameSize) return; - int NegFrameSize = -FrameSize; // Get processor type. @@ -911,7 +917,7 @@ // Check if the link register (LR) has been used. bool UsesLR = MFI->hasCalls() || usesLR(MF); // Do we have a frame pointer for this function? - bool HasFP = hasFP(MF); + bool HasFP = hasFP(MF) && FrameSize; int LROffset = PPCFrameInfo::getReturnSaveOffset(IsPPC64, IsMachoABI); int FPOffset = PPCFrameInfo::getFramePointerSaveOffset(IsPPC64, IsMachoABI); @@ -940,6 +946,9 @@ .addReg(PPC::R0).addImm(LROffset).addReg(PPC::R1); } + // Skip if a leaf routine. + if (!FrameSize) return; + // Get stack alignments. unsigned TargetAlign = MF.getTarget().getFrameInfo()->getStackAlignment(); unsigned MaxAlign = MFI->getMaxAlignment(); @@ -1065,8 +1074,6 @@ // Get the number of bytes allocated from the FrameInfo. unsigned FrameSize = MFI->getStackSize(); - if (!FrameSize) return; - // Get processor type. bool IsPPC64 = Subtarget.isPPC64(); // Get operating system @@ -1074,31 +1081,32 @@ // Check if the link register (LR) has been used. bool UsesLR = MFI->hasCalls() || usesLR(MF); // Do we have a frame pointer for this function? - bool HasFP = hasFP(MF); + bool HasFP = hasFP(MF) && FrameSize; int LROffset = PPCFrameInfo::getReturnSaveOffset(IsPPC64, IsMachoABI); int FPOffset = PPCFrameInfo::getFramePointerSaveOffset(IsPPC64, IsMachoABI); - // The loaded (or persistent) stack pointer value is offset by the 'stwu' - // on entry to the function. Add this offset back now. - if (!Subtarget.isPPC64()) { - if (isInt16(FrameSize) && TargetAlign >= MaxAlign && - !MFI->hasVarSizedObjects()) { - BuildMI(MBB, MBBI, TII.get(PPC::ADDI), PPC::R1) - .addReg(PPC::R1).addImm(FrameSize); - } else { - BuildMI(MBB, MBBI, TII.get(PPC::LWZ),PPC::R1).addImm(0).addReg(PPC::R1); - } - } else { - if (isInt16(FrameSize) && TargetAlign >= MaxAlign && - !MFI->hasVarSizedObjects()) { - BuildMI(MBB, MBBI, TII.get(PPC::ADDI8), PPC::X1) - .addReg(PPC::X1).addImm(FrameSize); + if (FrameSize) { + // The loaded (or persistent) stack pointer value is offset by the 'stwu' + // on entry to the function. Add this offset back now. + if (!Subtarget.isPPC64()) { + if (isInt16(FrameSize) && TargetAlign >= MaxAlign && + !MFI->hasVarSizedObjects()) { + BuildMI(MBB, MBBI, TII.get(PPC::ADDI), PPC::R1) + .addReg(PPC::R1).addImm(FrameSize); + } else { + BuildMI(MBB, MBBI, TII.get(PPC::LWZ),PPC::R1).addImm(0).addReg(PPC::R1); + } } else { - BuildMI(MBB, MBBI, TII.get(PPC::LD), PPC::X1).addImm(0).addReg(PPC::X1); + if (isInt16(FrameSize) && TargetAlign >= MaxAlign && + !MFI->hasVarSizedObjects()) { + BuildMI(MBB, MBBI, TII.get(PPC::ADDI8), PPC::X1) + .addReg(PPC::X1).addImm(FrameSize); + } else { + BuildMI(MBB, MBBI, TII.get(PPC::LD), PPC::X1).addImm(0).addReg(PPC::X1); + } } } - if (IsPPC64) { if (UsesLR) Index: llvm/lib/Target/PowerPC/PPCRegisterInfo.h diff -u llvm/lib/Target/PowerPC/PPCRegisterInfo.h:1.30 llvm/lib/Target/PowerPC/PPCRegisterInfo.h:1.31 --- llvm/lib/Target/PowerPC/PPCRegisterInfo.h:1.30 Mon Feb 26 20:55:29 2007 +++ llvm/lib/Target/PowerPC/PPCRegisterInfo.h Tue Feb 27 05:55:45 2007 @@ -82,6 +82,7 @@ /// frame size. void determineFrameLayout(MachineFunction &MF) const; + void processFunctionBeforeCalleeSavedScan(MachineFunction &MF) const; void emitPrologue(MachineFunction &MF) const; void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const; _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits