|
@@ -2100,7 +2100,8 @@ ARMTargetLowering::IsEligibleForTailCallOptimization(SDValue Callee,
|
|
const SmallVectorImpl<SDValue> &OutVals,
|
|
const SmallVectorImpl<SDValue> &OutVals,
|
|
const SmallVectorImpl<ISD::InputArg> &Ins,
|
|
const SmallVectorImpl<ISD::InputArg> &Ins,
|
|
SelectionDAG& DAG) const {
|
|
SelectionDAG& DAG) const {
|
|
- const Function *CallerF = DAG.getMachineFunction().getFunction();
|
|
|
|
|
|
+ MachineFunction &MF = DAG.getMachineFunction();
|
|
|
|
+ const Function *CallerF = MF.getFunction();
|
|
CallingConv::ID CallerCC = CallerF->getCallingConv();
|
|
CallingConv::ID CallerCC = CallerF->getCallingConv();
|
|
bool CCMatch = CallerCC == CalleeCC;
|
|
bool CCMatch = CallerCC == CalleeCC;
|
|
|
|
|
|
@@ -2147,41 +2148,17 @@ ARMTargetLowering::IsEligibleForTailCallOptimization(SDValue Callee,
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
- // If the calling conventions do not match, then we'd better make sure the
|
|
|
|
- // results are returned in the same way as what the caller expects.
|
|
|
|
- if (!CCMatch) {
|
|
|
|
- SmallVector<CCValAssign, 16> RVLocs1;
|
|
|
|
- ARMCCState CCInfo1(CalleeCC, false, DAG.getMachineFunction(), RVLocs1,
|
|
|
|
- *DAG.getContext(), Call);
|
|
|
|
- CCInfo1.AnalyzeCallResult(Ins, CCAssignFnForNode(CalleeCC, true, isVarArg));
|
|
|
|
-
|
|
|
|
- SmallVector<CCValAssign, 16> RVLocs2;
|
|
|
|
- ARMCCState CCInfo2(CallerCC, false, DAG.getMachineFunction(), RVLocs2,
|
|
|
|
- *DAG.getContext(), Call);
|
|
|
|
- CCInfo2.AnalyzeCallResult(Ins, CCAssignFnForNode(CallerCC, true, isVarArg));
|
|
|
|
-
|
|
|
|
- if (RVLocs1.size() != RVLocs2.size())
|
|
|
|
- return false;
|
|
|
|
- for (unsigned i = 0, e = RVLocs1.size(); i != e; ++i) {
|
|
|
|
- if (RVLocs1[i].isRegLoc() != RVLocs2[i].isRegLoc())
|
|
|
|
- return false;
|
|
|
|
- if (RVLocs1[i].getLocInfo() != RVLocs2[i].getLocInfo())
|
|
|
|
- return false;
|
|
|
|
- if (RVLocs1[i].isRegLoc()) {
|
|
|
|
- if (RVLocs1[i].getLocReg() != RVLocs2[i].getLocReg())
|
|
|
|
- return false;
|
|
|
|
- } else {
|
|
|
|
- if (RVLocs1[i].getLocMemOffset() != RVLocs2[i].getLocMemOffset())
|
|
|
|
- return false;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ // Check that the call results are passed in the same way.
|
|
|
|
+ LLVMContext &C = *DAG.getContext();
|
|
|
|
+ if (!CCState::resultsCompatible(CalleeCC, CallerCC, MF, C, Ins,
|
|
|
|
+ CCAssignFnForNode(CalleeCC, true, isVarArg),
|
|
|
|
+ CCAssignFnForNode(CallerCC, true, isVarArg)))
|
|
|
|
+ return false;
|
|
|
|
|
|
// If Caller's vararg or byval argument has been split between registers and
|
|
// If Caller's vararg or byval argument has been split between registers and
|
|
// stack, do not perform tail call, since part of the argument is in caller's
|
|
// stack, do not perform tail call, since part of the argument is in caller's
|
|
// local frame.
|
|
// local frame.
|
|
- const ARMFunctionInfo *AFI_Caller = DAG.getMachineFunction().
|
|
|
|
- getInfo<ARMFunctionInfo>();
|
|
|
|
|
|
+ const ARMFunctionInfo *AFI_Caller = MF.getInfo<ARMFunctionInfo>();
|
|
if (AFI_Caller->getArgRegsSaveSize())
|
|
if (AFI_Caller->getArgRegsSaveSize())
|
|
return false;
|
|
return false;
|
|
|
|
|
|
@@ -2191,13 +2168,10 @@ ARMTargetLowering::IsEligibleForTailCallOptimization(SDValue Callee,
|
|
// Check if stack adjustment is needed. For now, do not do this if any
|
|
// Check if stack adjustment is needed. For now, do not do this if any
|
|
// argument is passed on the stack.
|
|
// argument is passed on the stack.
|
|
SmallVector<CCValAssign, 16> ArgLocs;
|
|
SmallVector<CCValAssign, 16> ArgLocs;
|
|
- ARMCCState CCInfo(CalleeCC, isVarArg, DAG.getMachineFunction(), ArgLocs,
|
|
|
|
- *DAG.getContext(), Call);
|
|
|
|
|
|
+ ARMCCState CCInfo(CalleeCC, isVarArg, MF, ArgLocs, C, Call);
|
|
CCInfo.AnalyzeCallOperands(Outs,
|
|
CCInfo.AnalyzeCallOperands(Outs,
|
|
CCAssignFnForNode(CalleeCC, false, isVarArg));
|
|
CCAssignFnForNode(CalleeCC, false, isVarArg));
|
|
if (CCInfo.getNextStackOffset()) {
|
|
if (CCInfo.getNextStackOffset()) {
|
|
- MachineFunction &MF = DAG.getMachineFunction();
|
|
|
|
-
|
|
|
|
// Check if the arguments are already laid out in the right way as
|
|
// Check if the arguments are already laid out in the right way as
|
|
// the caller's fixed stack objects.
|
|
// the caller's fixed stack objects.
|
|
MachineFrameInfo *MFI = MF.getFrameInfo();
|
|
MachineFrameInfo *MFI = MF.getFrameInfo();
|