mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-07-23 16:30:00 +00:00
Avoid sibcall optimization if either caller or callee is using sret semantics.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@98561 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
88698f5dbc
commit
a375d47137
@ -1524,7 +1524,6 @@ X86TargetLowering::LowerFormalArguments(SDValue Chain,
|
||||
DebugLoc dl,
|
||||
SelectionDAG &DAG,
|
||||
SmallVectorImpl<SDValue> &InVals) {
|
||||
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
X86MachineFunctionInfo *FuncInfo = MF.getInfo<X86MachineFunctionInfo>();
|
||||
|
||||
@ -1826,7 +1825,8 @@ X86TargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
||||
|
||||
if (isTailCall) {
|
||||
// Check if it's really possible to do a tail call.
|
||||
isTailCall = IsEligibleForTailCallOptimization(Callee, CallConv, isVarArg,
|
||||
isTailCall = IsEligibleForTailCallOptimization(Callee, CallConv,
|
||||
isVarArg, IsStructRet, MF.getFunction()->hasStructRetAttr(),
|
||||
Outs, Ins, DAG);
|
||||
|
||||
// Sibcalls are automatically detected tailcalls which do not require
|
||||
@ -2324,6 +2324,8 @@ bool
|
||||
X86TargetLowering::IsEligibleForTailCallOptimization(SDValue Callee,
|
||||
CallingConv::ID CalleeCC,
|
||||
bool isVarArg,
|
||||
bool isCalleeStructRet,
|
||||
bool isCallerStructRet,
|
||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||
const SmallVectorImpl<ISD::InputArg> &Ins,
|
||||
SelectionDAG& DAG) const {
|
||||
@ -2343,10 +2345,15 @@ X86TargetLowering::IsEligibleForTailCallOptimization(SDValue Callee,
|
||||
// Look for obvious safe cases to perform tail call optimization that does not
|
||||
// requite ABI changes. This is what gcc calls sibcall.
|
||||
|
||||
// Do not tail call optimize vararg calls for now.
|
||||
// Do not sibcall optimize vararg calls for now.
|
||||
if (isVarArg)
|
||||
return false;
|
||||
|
||||
// Also avoid sibcall optimization if either caller or callee uses struct
|
||||
// return semantics.
|
||||
if (isCalleeStructRet || isCallerStructRet)
|
||||
return false;
|
||||
|
||||
// If the callee takes no arguments then go on to check the results of the
|
||||
// call.
|
||||
if (!Outs.empty()) {
|
||||
|
@ -630,6 +630,8 @@ namespace llvm {
|
||||
bool IsEligibleForTailCallOptimization(SDValue Callee,
|
||||
CallingConv::ID CalleeCC,
|
||||
bool isVarArg,
|
||||
bool isCalleeStructRet,
|
||||
bool isCallerStructRet,
|
||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||
const SmallVectorImpl<ISD::InputArg> &Ins,
|
||||
SelectionDAG& DAG) const;
|
||||
|
Loading…
Reference in New Issue
Block a user