forked from OSchip/llvm-project
Move MRI liveouts to AArch64 return instructions.
llvm-svn: 174415
This commit is contained in:
parent
4af19d0014
commit
dbc8c51acb
|
@ -1035,15 +1035,8 @@ AArch64TargetLowering::LowerReturn(SDValue Chain,
|
||||||
// Analyze outgoing return values.
|
// Analyze outgoing return values.
|
||||||
CCInfo.AnalyzeReturn(Outs, CCAssignFnForNode(CallConv));
|
CCInfo.AnalyzeReturn(Outs, CCAssignFnForNode(CallConv));
|
||||||
|
|
||||||
// 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;
|
SDValue Flag;
|
||||||
|
SmallVector<SDValue, 4> RetOps(1, Chain);
|
||||||
|
|
||||||
for (unsigned i = 0, e = RVLocs.size(); i != e; ++i) {
|
for (unsigned i = 0, e = RVLocs.size(); i != e; ++i) {
|
||||||
// PCS: "If the type, T, of the result of a function is such that
|
// PCS: "If the type, T, of the result of a function is such that
|
||||||
|
@ -1087,13 +1080,17 @@ AArch64TargetLowering::LowerReturn(SDValue Chain,
|
||||||
|
|
||||||
Chain = DAG.getCopyToReg(Chain, dl, VA.getLocReg(), Arg, Flag);
|
Chain = DAG.getCopyToReg(Chain, dl, VA.getLocReg(), Arg, Flag);
|
||||||
Flag = Chain.getValue(1);
|
Flag = Chain.getValue(1);
|
||||||
|
RetOps.push_back(DAG.getRegister(VA.getLocReg(), VA.getLocVT()));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Flag.getNode()) {
|
RetOps[0] = Chain; // Update chain.
|
||||||
return DAG.getNode(AArch64ISD::Ret, dl, MVT::Other, Chain, Flag);
|
|
||||||
} else {
|
// Add the flag if we have it.
|
||||||
return DAG.getNode(AArch64ISD::Ret, dl, MVT::Other, Chain);
|
if (Flag.getNode())
|
||||||
}
|
RetOps.push_back(Flag);
|
||||||
|
|
||||||
|
return DAG.getNode(AArch64ISD::Ret, dl, MVT::Other,
|
||||||
|
&RetOps[0], RetOps.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
SDValue
|
SDValue
|
||||||
|
|
|
@ -6,7 +6,8 @@ include "AArch64InstrFormats.td"
|
||||||
|
|
||||||
def SDT_A64ret : SDTypeProfile<0, 0, []>;
|
def SDT_A64ret : SDTypeProfile<0, 0, []>;
|
||||||
def A64ret : SDNode<"AArch64ISD::Ret", SDT_A64ret, [SDNPHasChain,
|
def A64ret : SDNode<"AArch64ISD::Ret", SDT_A64ret, [SDNPHasChain,
|
||||||
SDNPOptInGlue]>;
|
SDNPOptInGlue,
|
||||||
|
SDNPVariadic]>;
|
||||||
|
|
||||||
// (ins NZCV, Condition, Dest)
|
// (ins NZCV, Condition, Dest)
|
||||||
def SDT_A64br_cc : SDTypeProfile<0, 3, [SDTCisVT<0, i32>]>;
|
def SDT_A64br_cc : SDTypeProfile<0, 3, [SDTCisVT<0, i32>]>;
|
||||||
|
|
Loading…
Reference in New Issue