From ff116f99c64e1ca085c9d1387f7bd6eb8e4dbd67 Mon Sep 17 00:00:00 2001 From: Evan Cheng Date: Tue, 2 Feb 2010 23:55:14 +0000 Subject: Revert 95130. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@95160 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/X86ISelLowering.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) (limited to 'lib/Target/X86/X86ISelLowering.cpp') diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index 228244f..d05de21 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -1778,7 +1778,7 @@ EmitTailCallStoreRetAddr(SelectionDAG & DAG, MachineFunction &MF, } SDValue -X86TargetLowering::LowerCall(SDValue Chain, SDValue Callee, const Type *RetTy, +X86TargetLowering::LowerCall(SDValue Chain, SDValue Callee, CallingConv::ID CallConv, bool isVarArg, bool &isTailCall, const SmallVectorImpl &Outs, @@ -1791,8 +1791,8 @@ X86TargetLowering::LowerCall(SDValue Chain, SDValue Callee, const Type *RetTy, if (isTailCall) // Check if it's really possible to do a tail call. - isTailCall = IsEligibleForTailCallOptimization(Callee, RetTy, CallConv, - isVarArg, Outs, Ins, DAG); + isTailCall = IsEligibleForTailCallOptimization(Callee, CallConv, isVarArg, + Outs, Ins, DAG); assert(!(isVarArg && CallConv == CallingConv::Fast) && "Var args not supported with calling convention fastcc"); @@ -2247,7 +2247,6 @@ unsigned X86TargetLowering::GetAlignedArgumentStackSize(unsigned StackSize, /// optimization should implement this function. bool X86TargetLowering::IsEligibleForTailCallOptimization(SDValue Callee, - const Type *RetTy, CallingConv::ID CalleeCC, bool isVarArg, const SmallVectorImpl &Outs, @@ -2329,7 +2328,14 @@ X86TargetLowering::IsEligibleForTailCallOptimization(SDValue Callee, return true; // If the return types match, then it's safe. - return CallerRetTy == RetTy; + // Don't tail call optimize recursive call. + GlobalAddressSDNode *G = dyn_cast(Callee); + if (!G) return false; // FIXME: common external symbols? + if (const Function *CalleeF = dyn_cast(G->getGlobal())) { + const Type *CalleeRetTy = CalleeF->getReturnType(); + return CallerRetTy == CalleeRetTy; + } + return false; } FastISel * -- cgit v1.1