[llvm-commits] [llvm] r88737 - in /llvm/trunk: lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp test/CodeGen/X86/tailcall1.ll
Dan Gohman
gohman at apple.com
Fri Nov 13 18:06:30 PST 2009
Author: djg
Date: Fri Nov 13 20:06:30 2009
New Revision: 88737
URL: http://llvm.org/viewvc/llvm-project?rev=88737&view=rev
Log:
Enable the tail call optimization when the caller returns undef.
Modified:
llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp
llvm/trunk/test/CodeGen/X86/tailcall1.ll
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp?rev=88737&r1=88736&r2=88737&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp Fri Nov 13 20:06:30 2009
@@ -4376,6 +4376,10 @@
// 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();
Modified: llvm/trunk/test/CodeGen/X86/tailcall1.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/tailcall1.ll?rev=88737&r1=88736&r2=88737&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/tailcall1.ll (original)
+++ llvm/trunk/test/CodeGen/X86/tailcall1.ll Fri Nov 13 20:06:30 2009
@@ -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 @@
%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
+}
More information about the llvm-commits
mailing list