Enable the tail call optimization when the caller returns undef.
authorDan Gohman <gohman@apple.com>
Sat, 14 Nov 2009 02:06:30 +0000 (02:06 +0000)
committerDan Gohman <gohman@apple.com>
Sat, 14 Nov 2009 02:06:30 +0000 (02:06 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@88737 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp
test/CodeGen/X86/tailcall1.ll

index f2c623cd6161c94e20680f14195bd5f0512a5916..90fd95eb6352e49f3889ff3ca8ccfd1e5315210e 100644 (file)
@@ -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();
index 215d00946dd1430d0356e0b36219e616e999a76b..4923df26b45b95304e2c994523d980afbacfe587 100644 (file)
@@ -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
+}