mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-29 10:25:12 +00:00
Avoid recursive sibcall's.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@94946 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -2252,10 +2252,26 @@ X86TargetLowering::IsEligibleForTailCallOptimization(SDValue Callee,
|
|||||||
|
|
||||||
// If -tailcallopt is specified, make fastcc functions tail-callable.
|
// If -tailcallopt is specified, make fastcc functions tail-callable.
|
||||||
const Function *CallerF = DAG.getMachineFunction().getFunction();
|
const Function *CallerF = DAG.getMachineFunction().getFunction();
|
||||||
if (PerformTailCallOpt &&
|
if (PerformTailCallOpt) {
|
||||||
CalleeCC == CallingConv::Fast &&
|
if (CalleeCC == CallingConv::Fast &&
|
||||||
CallerF->getCallingConv() == CalleeCC)
|
CallerF->getCallingConv() == CalleeCC)
|
||||||
return true;
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Do not tail call optimize vararg calls for now.
|
||||||
|
if (isVarArg)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Don't tail call optimize recursive call.
|
||||||
|
GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee);
|
||||||
|
const Function *CalleeF = G ? cast<Function>(G->getGlobal()) : 0;
|
||||||
|
if (CallerF == CalleeF)
|
||||||
|
return false;
|
||||||
|
// If it's an indirect call, conversatively return false if the caller's
|
||||||
|
// address is taken.
|
||||||
|
if (!isa<ExternalSymbolSDNode>(Callee) && CallerF->hasAddressTaken())
|
||||||
|
return false;
|
||||||
|
|
||||||
// Look for obvious safe cases to perform tail call optimization.
|
// Look for obvious safe cases to perform tail call optimization.
|
||||||
// If the callee takes no arguments then go on to check the results of the
|
// If the callee takes no arguments then go on to check the results of the
|
||||||
@@ -2279,9 +2295,7 @@ X86TargetLowering::IsEligibleForTailCallOptimization(SDValue Callee,
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
// If the return types match, then it's safe.
|
// If the return types match, then it's safe.
|
||||||
GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee);
|
|
||||||
if (!G) return false; // FIXME: common external symbols?
|
if (!G) return false; // FIXME: common external symbols?
|
||||||
Function *CalleeF = cast<Function>(G->getGlobal());
|
|
||||||
const Type *CalleeRetTy = CalleeF->getReturnType();
|
const Type *CalleeRetTy = CalleeF->getReturnType();
|
||||||
return CallerRetTy == CalleeRetTy;
|
return CallerRetTy == CalleeRetTy;
|
||||||
}
|
}
|
||||||
|
@@ -65,3 +65,27 @@ entry:
|
|||||||
tail call void %x() nounwind
|
tail call void %x() nounwind
|
||||||
ret void
|
ret void
|
||||||
}
|
}
|
||||||
|
|
||||||
|
define i32 @t6(i32 %x) nounwind ssp {
|
||||||
|
entry:
|
||||||
|
; 32: t6:
|
||||||
|
; 32: call {{_?}}t6
|
||||||
|
; 32: call {{_?}}bar
|
||||||
|
|
||||||
|
; 64: t6:
|
||||||
|
; 64: callq {{_?}}t6
|
||||||
|
; 64: jmp {{_?}}bar
|
||||||
|
%0 = icmp slt i32 %x, 10
|
||||||
|
br i1 %0, label %bb, label %bb1
|
||||||
|
|
||||||
|
bb:
|
||||||
|
%1 = add nsw i32 %x, -1
|
||||||
|
%2 = tail call i32 @t6(i32 %1) nounwind ssp
|
||||||
|
ret i32 %2
|
||||||
|
|
||||||
|
bb1:
|
||||||
|
%3 = tail call i32 @bar(i32 %x) nounwind
|
||||||
|
ret i32 %3
|
||||||
|
}
|
||||||
|
|
||||||
|
declare i32 @bar(i32)
|
||||||
|
Reference in New Issue
Block a user