diff options
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 14 | ||||
| -rw-r--r-- | llvm/test/CodeGen/X86/tailcall2.ll | 2 | 
2 files changed, 4 insertions, 12 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index e272d9b92af..5b7629852ee 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -2263,17 +2263,6 @@ X86TargetLowering::IsEligibleForTailCallOptimization(SDValue Callee,    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 (!CalleeF && -      !isa<ExternalSymbolSDNode>(Callee) && CallerF->hasAddressTaken()) -    return false; -    // 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    // call. @@ -2296,7 +2285,10 @@ X86TargetLowering::IsEligibleForTailCallOptimization(SDValue Callee,      return true;    // If the return types match, then it's safe. +  // Don't tail call optimize recursive call. +  GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee);    if (!G) return false;  // FIXME: common external symbols? +  const Function *CalleeF = cast<Function>(G->getGlobal());    const Type *CalleeRetTy = CalleeF->getReturnType();    return CallerRetTy == CalleeRetTy;  } diff --git a/llvm/test/CodeGen/X86/tailcall2.ll b/llvm/test/CodeGen/X86/tailcall2.ll index e78e213d646..1e288f57651 100644 --- a/llvm/test/CodeGen/X86/tailcall2.ll +++ b/llvm/test/CodeGen/X86/tailcall2.ll @@ -73,7 +73,7 @@ entry:  ; 32: call {{_?}}bar  ; 64: t6: -; 64: callq {{_?}}t6 +; 64: jmp {{_?}}t6  ; 64: jmp {{_?}}bar    %0 = icmp slt i32 %x, 10    br i1 %0, label %bb, label %bb1  | 

