Allow trivial sibcall of vararg callee when no arguments are being passed.
authorEvan Cheng <evan.cheng@apple.com>
Fri, 26 Mar 2010 02:13:13 +0000 (02:13 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Fri, 26 Mar 2010 02:13:13 +0000 (02:13 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@99598 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86ISelLowering.cpp
test/CodeGen/X86/pic.ll
test/CodeGen/X86/sibcall.ll
test/CodeGen/X86/xor-icmp.ll

index 75e6f505484767495c41dfc6f72201c094211988..d08dfc4eab58f845e517285f6ebc0fceef4d2147 100644 (file)
@@ -2301,8 +2301,9 @@ X86TargetLowering::IsEligibleForTailCallOptimization(SDValue Callee,
   // Look for obvious safe cases to perform tail call optimization that does not
   // requite ABI changes. This is what gcc calls sibcall.
 
-  // Do not sibcall optimize vararg calls for now.
-  if (isVarArg)
+  // Do not sibcall optimize vararg calls unless the call site is not passing any
+  // arguments.
+  if (isVarArg && !Outs.empty())
     return false;
 
   // Also avoid sibcall optimization if either caller or callee uses struct
index e997233a51942a8f024b70abba2047cc6b768008..35b172509c955777a1cff8a6aba336bd6a3f05b6 100644 (file)
@@ -194,10 +194,10 @@ bb12:
 
 ; LINUX: .LJTI8_0:
 ; LINUX:   .long        .LBB8_2@GOTOFF
-; LINUX:   .long        .LBB8_2@GOTOFF
-; LINUX:   .long        .LBB8_7@GOTOFF
-; LINUX:   .long        .LBB8_3@GOTOFF
-; LINUX:   .long        .LBB8_7@GOTOFF
+; LINUX:   .long        .LBB8_8@GOTOFF
+; LINUX:   .long        .LBB8_14@GOTOFF
+; LINUX:   .long        .LBB8_9@GOTOFF
+; LINUX:   .long        .LBB8_10@GOTOFF
 }
 
 declare void @foo1(...)
index ce35b45451840fac28fe4a364cc603d2328014be..541e7506b8bc1c28dc151679f8aff72dddff66f5 100644 (file)
@@ -271,3 +271,34 @@ entry:
 }
 
 declare double @bar4()
+
+; rdar://6283267
+define void @t17() nounwind ssp {
+entry:
+; 32: t17:
+; 32: jmp {{_?}}bar5
+
+; 64: t17:
+; 64: xorb %al, %al
+; 64: jmp {{_?}}bar5
+  tail call void (...)* @bar5() nounwind
+  ret void
+}
+
+declare void @bar5(...)
+
+; rdar://7774847
+define void @t18() nounwind ssp {
+entry:
+; 32: t18:
+; 32: call {{_?}}bar6
+; 32: fstp %st(0)
+
+; 64: t18:
+; 64: xorb %al, %al
+; 64: jmp {{_?}}bar6
+  %0 = tail call double (...)* @bar6() nounwind
+  ret void
+}
+
+declare double @bar6(...)
index 2d75c5d762010d77f64b82717688f6559067b334..34875ed89957d688022e6a0c212c98bc3aa3db5c 100644 (file)
@@ -43,7 +43,7 @@ define i32 @t2(i32 %x, i32 %y) nounwind ssp {
 ; X32: cmpl
 ; X32: sete
 ; X32-NOT: xor
-; X32: je
+; X32: jne
 
 ; X64: t2:
 ; X64: testl
@@ -51,7 +51,7 @@ define i32 @t2(i32 %x, i32 %y) nounwind ssp {
 ; X64: testl
 ; X64: sete
 ; X64-NOT: xor
-; X64: je
+; X64: jne
 entry:
   %0 = icmp eq i32 %x, 0                          ; <i1> [#uses=1]
   %1 = icmp eq i32 %y, 0                          ; <i1> [#uses=1]