mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 13:11:39 +01:00
Duplicate use of LR, take 2.
llvm-svn: 34666
This commit is contained in:
parent
5d71b78293
commit
f5b5a3cf77
@ -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; }
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -538,8 +538,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::
|
||||||
@ -874,6 +874,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();
|
||||||
@ -899,9 +908,6 @@ void PPCRegisterInfo::emitPrologue(MachineFunction &MF) const {
|
|||||||
determineFrameLayout(MF);
|
determineFrameLayout(MF);
|
||||||
unsigned FrameSize = MFI->getStackSize();
|
unsigned FrameSize = MFI->getStackSize();
|
||||||
|
|
||||||
// Skip if a leaf routine.
|
|
||||||
if (!FrameSize) return;
|
|
||||||
|
|
||||||
int NegFrameSize = -FrameSize;
|
int NegFrameSize = -FrameSize;
|
||||||
|
|
||||||
// Get processor type.
|
// Get processor type.
|
||||||
@ -911,7 +917,7 @@ void PPCRegisterInfo::emitPrologue(MachineFunction &MF) const {
|
|||||||
// Check if the link register (LR) has been used.
|
// Check if the link register (LR) has been used.
|
||||||
bool UsesLR = MFI->hasCalls() || usesLR(MF);
|
bool UsesLR = MFI->hasCalls() || usesLR(MF);
|
||||||
// Do we have a frame pointer for this function?
|
// 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 LROffset = PPCFrameInfo::getReturnSaveOffset(IsPPC64, IsMachoABI);
|
||||||
int FPOffset = PPCFrameInfo::getFramePointerSaveOffset(IsPPC64, IsMachoABI);
|
int FPOffset = PPCFrameInfo::getFramePointerSaveOffset(IsPPC64, IsMachoABI);
|
||||||
@ -940,6 +946,9 @@ void PPCRegisterInfo::emitPrologue(MachineFunction &MF) const {
|
|||||||
.addReg(PPC::R0).addImm(LROffset).addReg(PPC::R1);
|
.addReg(PPC::R0).addImm(LROffset).addReg(PPC::R1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Skip if a leaf routine.
|
||||||
|
if (!FrameSize) return;
|
||||||
|
|
||||||
// Get stack alignments.
|
// Get stack alignments.
|
||||||
unsigned TargetAlign = MF.getTarget().getFrameInfo()->getStackAlignment();
|
unsigned TargetAlign = MF.getTarget().getFrameInfo()->getStackAlignment();
|
||||||
unsigned MaxAlign = MFI->getMaxAlignment();
|
unsigned MaxAlign = MFI->getMaxAlignment();
|
||||||
@ -1065,8 +1074,6 @@ void PPCRegisterInfo::emitEpilogue(MachineFunction &MF,
|
|||||||
// Get the number of bytes allocated from the FrameInfo.
|
// Get the number of bytes allocated from the FrameInfo.
|
||||||
unsigned FrameSize = MFI->getStackSize();
|
unsigned FrameSize = MFI->getStackSize();
|
||||||
|
|
||||||
if (!FrameSize) return;
|
|
||||||
|
|
||||||
// Get processor type.
|
// Get processor type.
|
||||||
bool IsPPC64 = Subtarget.isPPC64();
|
bool IsPPC64 = Subtarget.isPPC64();
|
||||||
// Get operating system
|
// Get operating system
|
||||||
@ -1074,31 +1081,32 @@ void PPCRegisterInfo::emitEpilogue(MachineFunction &MF,
|
|||||||
// Check if the link register (LR) has been used.
|
// Check if the link register (LR) has been used.
|
||||||
bool UsesLR = MFI->hasCalls() || usesLR(MF);
|
bool UsesLR = MFI->hasCalls() || usesLR(MF);
|
||||||
// Do we have a frame pointer for this function?
|
// 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 LROffset = PPCFrameInfo::getReturnSaveOffset(IsPPC64, IsMachoABI);
|
||||||
int FPOffset = PPCFrameInfo::getFramePointerSaveOffset(IsPPC64, IsMachoABI);
|
int FPOffset = PPCFrameInfo::getFramePointerSaveOffset(IsPPC64, IsMachoABI);
|
||||||
|
|
||||||
// The loaded (or persistent) stack pointer value is offset by the 'stwu'
|
if (FrameSize) {
|
||||||
// on entry to the function. Add this offset back now.
|
// The loaded (or persistent) stack pointer value is offset by the 'stwu'
|
||||||
if (!Subtarget.isPPC64()) {
|
// on entry to the function. Add this offset back now.
|
||||||
if (isInt16(FrameSize) && TargetAlign >= MaxAlign &&
|
if (!Subtarget.isPPC64()) {
|
||||||
!MFI->hasVarSizedObjects()) {
|
if (isInt16(FrameSize) && TargetAlign >= MaxAlign &&
|
||||||
BuildMI(MBB, MBBI, TII.get(PPC::ADDI), PPC::R1)
|
!MFI->hasVarSizedObjects()) {
|
||||||
.addReg(PPC::R1).addImm(FrameSize);
|
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 {
|
} else {
|
||||||
BuildMI(MBB, MBBI, TII.get(PPC::LWZ),PPC::R1).addImm(0).addReg(PPC::R1);
|
if (isInt16(FrameSize) && TargetAlign >= MaxAlign &&
|
||||||
}
|
!MFI->hasVarSizedObjects()) {
|
||||||
} else {
|
BuildMI(MBB, MBBI, TII.get(PPC::ADDI8), PPC::X1)
|
||||||
if (isInt16(FrameSize) && TargetAlign >= MaxAlign &&
|
.addReg(PPC::X1).addImm(FrameSize);
|
||||||
!MFI->hasVarSizedObjects()) {
|
} else {
|
||||||
BuildMI(MBB, MBBI, TII.get(PPC::ADDI8), PPC::X1)
|
BuildMI(MBB, MBBI, TII.get(PPC::LD), PPC::X1).addImm(0).addReg(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 (IsPPC64) {
|
||||||
if (UsesLR)
|
if (UsesLR)
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user