mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 20:32:21 +00:00
Move MRI liveouts to ARM return instructions.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@174406 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
7088fb60ed
commit
fc74327444
@ -2099,6 +2099,9 @@ bool ARMFastISel::SelectRet(const Instruction *I) {
|
||||
if (!FuncInfo.CanLowerReturn)
|
||||
return false;
|
||||
|
||||
// Build a list of return value registers.
|
||||
SmallVector<unsigned, 4> RetRegs;
|
||||
|
||||
CallingConv::ID CC = F.getCallingConv();
|
||||
if (Ret->getNumOperands() > 0) {
|
||||
SmallVector<ISD::OutputArg, 4> Outs;
|
||||
@ -2157,13 +2160,16 @@ bool ARMFastISel::SelectRet(const Instruction *I) {
|
||||
BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(TargetOpcode::COPY),
|
||||
DstReg).addReg(SrcReg);
|
||||
|
||||
// Mark the register as live out of the function.
|
||||
MRI.addLiveOut(VA.getLocReg());
|
||||
// Add register to return instruction.
|
||||
RetRegs.push_back(VA.getLocReg());
|
||||
}
|
||||
|
||||
unsigned RetOpc = isThumb2 ? ARM::tBX_RET : ARM::BX_RET;
|
||||
AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
|
||||
TII.get(RetOpc)));
|
||||
MachineInstrBuilder MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
|
||||
TII.get(RetOpc));
|
||||
AddOptionalDefs(MIB);
|
||||
for (unsigned i = 0, e = RetRegs.size(); i != e; ++i)
|
||||
MIB.addReg(RetRegs[i], RegState::Implicit);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1928,15 +1928,9 @@ ARMTargetLowering::LowerReturn(SDValue Chain,
|
||||
CCInfo.AnalyzeReturn(Outs, CCAssignFnForNode(CallConv, /* Return */ true,
|
||||
isVarArg));
|
||||
|
||||
// If this is the first return lowered for this function, add
|
||||
// the regs to the liveout set for the function.
|
||||
if (DAG.getMachineFunction().getRegInfo().liveout_empty()) {
|
||||
for (unsigned i = 0; i != RVLocs.size(); ++i)
|
||||
if (RVLocs[i].isRegLoc())
|
||||
DAG.getMachineFunction().getRegInfo().addLiveOut(RVLocs[i].getLocReg());
|
||||
}
|
||||
|
||||
SDValue Flag;
|
||||
SmallVector<SDValue, 4> RetOps;
|
||||
RetOps.push_back(Chain); // Operand #0 = Chain (updated below)
|
||||
|
||||
// Copy the result values into the output registers.
|
||||
for (unsigned i = 0, realRVLocIdx = 0;
|
||||
@ -1965,10 +1959,12 @@ ARMTargetLowering::LowerReturn(SDValue Chain,
|
||||
|
||||
Chain = DAG.getCopyToReg(Chain, dl, VA.getLocReg(), HalfGPRs, Flag);
|
||||
Flag = Chain.getValue(1);
|
||||
RetOps.push_back(DAG.getRegister(VA.getLocReg(), VA.getLocVT()));
|
||||
VA = RVLocs[++i]; // skip ahead to next loc
|
||||
Chain = DAG.getCopyToReg(Chain, dl, VA.getLocReg(),
|
||||
HalfGPRs.getValue(1), Flag);
|
||||
Flag = Chain.getValue(1);
|
||||
RetOps.push_back(DAG.getRegister(VA.getLocReg(), VA.getLocVT()));
|
||||
VA = RVLocs[++i]; // skip ahead to next loc
|
||||
|
||||
// Extract the 2nd half and fall through to handle it as an f64 value.
|
||||
@ -1981,6 +1977,7 @@ ARMTargetLowering::LowerReturn(SDValue Chain,
|
||||
DAG.getVTList(MVT::i32, MVT::i32), &Arg, 1);
|
||||
Chain = DAG.getCopyToReg(Chain, dl, VA.getLocReg(), fmrrd, Flag);
|
||||
Flag = Chain.getValue(1);
|
||||
RetOps.push_back(DAG.getRegister(VA.getLocReg(), VA.getLocVT()));
|
||||
VA = RVLocs[++i]; // skip ahead to next loc
|
||||
Chain = DAG.getCopyToReg(Chain, dl, VA.getLocReg(), fmrrd.getValue(1),
|
||||
Flag);
|
||||
@ -1990,15 +1987,16 @@ ARMTargetLowering::LowerReturn(SDValue Chain,
|
||||
// Guarantee that all emitted copies are
|
||||
// stuck together, avoiding something bad.
|
||||
Flag = Chain.getValue(1);
|
||||
RetOps.push_back(DAG.getRegister(VA.getLocReg(), VA.getLocVT()));
|
||||
}
|
||||
|
||||
SDValue result;
|
||||
// Update chain and glue.
|
||||
RetOps[0] = Chain;
|
||||
if (Flag.getNode())
|
||||
result = DAG.getNode(ARMISD::RET_FLAG, dl, MVT::Other, Chain, Flag);
|
||||
else // Return Void
|
||||
result = DAG.getNode(ARMISD::RET_FLAG, dl, MVT::Other, Chain);
|
||||
RetOps.push_back(Flag);
|
||||
|
||||
return result;
|
||||
return DAG.getNode(ARMISD::RET_FLAG, dl, MVT::Other,
|
||||
RetOps.data(), RetOps.size());
|
||||
}
|
||||
|
||||
bool ARMTargetLowering::isUsedByReturnOnly(SDNode *N, SDValue &Chain) const {
|
||||
|
@ -117,7 +117,7 @@ def ARMcall_nolink : SDNode<"ARMISD::CALL_NOLINK", SDT_ARMcall,
|
||||
SDNPVariadic]>;
|
||||
|
||||
def ARMretflag : SDNode<"ARMISD::RET_FLAG", SDTNone,
|
||||
[SDNPHasChain, SDNPOptInGlue]>;
|
||||
[SDNPHasChain, SDNPOptInGlue, SDNPVariadic]>;
|
||||
|
||||
def ARMcmov : SDNode<"ARMISD::CMOV", SDT_ARMCMov,
|
||||
[SDNPInGlue]>;
|
||||
|
Loading…
Reference in New Issue
Block a user