mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-18 09:09:12 +00:00
[Sparc] Rewrite MBB's live-in registers for leaf functions. Also, add
register i7 as a live-in if current function's return address is taken. This revision fixes PR16269. llvm-svn: 187433
This commit is contained in:
parent
4c06308b07
commit
bc8be24d6c
@ -188,6 +188,17 @@ void SparcFrameLowering::remapRegsForLeafProc(MachineFunction &MF) const {
|
||||
MRI.setPhysRegUnused(reg);
|
||||
}
|
||||
|
||||
// Rewrite MBB's Live-ins.
|
||||
for (MachineFunction::iterator MBB = MF.begin(), E = MF.end();
|
||||
MBB != E; ++MBB) {
|
||||
for (unsigned reg = SP::I0; reg <= SP::I7; ++reg) {
|
||||
if (!MBB->isLiveIn(reg))
|
||||
continue;
|
||||
MBB->removeLiveIn(reg);
|
||||
MBB->addLiveIn(reg - SP::I0 + SP::O0);
|
||||
}
|
||||
}
|
||||
|
||||
assert(verifyLeafProcRegUse(&MRI));
|
||||
#ifdef XDEBUG
|
||||
MF.verify(0, "After LeafProc Remapping");
|
||||
|
@ -1722,20 +1722,22 @@ static SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) {
|
||||
return FrameAddr;
|
||||
}
|
||||
|
||||
static SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) {
|
||||
MachineFrameInfo *MFI = DAG.getMachineFunction().getFrameInfo();
|
||||
static SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG,
|
||||
const SparcTargetLowering &TLI) {
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
MFI->setReturnAddressIsTaken(true);
|
||||
|
||||
EVT VT = Op.getValueType();
|
||||
SDLoc dl(Op);
|
||||
unsigned RetReg = SP::I7;
|
||||
|
||||
uint64_t depth = Op.getConstantOperandVal(0);
|
||||
|
||||
SDValue RetAddr;
|
||||
if (depth == 0)
|
||||
if (depth == 0) {
|
||||
unsigned RetReg = MF.addLiveIn(SP::I7,
|
||||
TLI.getRegClassFor(TLI.getPointerTy()));
|
||||
RetAddr = DAG.getCopyFromReg(DAG.getEntryNode(), dl, RetReg, VT);
|
||||
else {
|
||||
} else {
|
||||
// Need frame address to find return address of the caller.
|
||||
MFI->setFrameAddressIsTaken(true);
|
||||
|
||||
@ -1793,7 +1795,7 @@ LowerOperation(SDValue Op, SelectionDAG &DAG) const {
|
||||
case ISD::FNEG:
|
||||
case ISD::FABS: return LowerF64Op(Op, DAG);
|
||||
|
||||
case ISD::RETURNADDR: return LowerRETURNADDR(Op, DAG);
|
||||
case ISD::RETURNADDR: return LowerRETURNADDR(Op, DAG, *this);
|
||||
case ISD::FRAMEADDR: return LowerFRAMEADDR(Op, DAG);
|
||||
case ISD::GlobalTLSAddress:
|
||||
llvm_unreachable("TLS not implemented for Sparc.");
|
||||
|
Loading…
Reference in New Issue
Block a user