diff options
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp | 4 | ||||
| -rw-r--r-- | llvm/test/CodeGen/X86/tailcall1.ll | 9 | 
2 files changed, 12 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp index f2c623cd616..90fd95eb635 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp @@ -4376,6 +4376,10 @@ isInTailCallPosition(const Instruction *I, Attributes CalleeRetAttr,    // what the call's return type is.    if (!Ret || Ret->getNumOperands() == 0) return true; +  // If the return value is undef, it doesn't matter what the call's +  // return type is. +  if (isa<UndefValue>(Ret->getOperand(0))) return true; +    // Conservatively require the attributes of the call to match those of    // the return. Ignore noalias because it doesn't affect the call sequence.    unsigned CallerRetAttr = F->getAttributes().getRetAttributes(); diff --git a/llvm/test/CodeGen/X86/tailcall1.ll b/llvm/test/CodeGen/X86/tailcall1.ll index 215d00946dd..4923df26b45 100644 --- a/llvm/test/CodeGen/X86/tailcall1.ll +++ b/llvm/test/CodeGen/X86/tailcall1.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s -march=x86 -tailcallopt | grep TAILCALL | count 3 +; RUN: llc < %s -march=x86 -tailcallopt | grep TAILCALL | count 4  define fastcc i32 @tailcallee(i32 %a1, i32 %a2, i32 %a3, i32 %a4) {  entry:  	ret i32 %a3 @@ -23,3 +23,10 @@ define fastcc i8* @alias_caller() nounwind {    %p = tail call fastcc noalias i8* @noalias_callee()    ret i8* %p  } + +declare fastcc i32 @i32_callee() + +define fastcc i32 @ret_undef() nounwind { +  %p = tail call fastcc i32 @i32_callee() +  ret i32 undef +}  | 

