[llvm-commits] [llvm] r99598 - in /llvm/trunk: lib/Target/X86/X86ISelLowering.cpp test/CodeGen/X86/pic.ll test/CodeGen/X86/sibcall.ll test/CodeGen/X86/xor-icmp.ll

Jim Grosbach grosbach at apple.com
Fri Mar 26 07:58:57 PDT 2010


Ah, I see. We consider any C function call w/o a prototype to be a call to a vararg function? That makes sense, and does indeed make this an (unfortunately) common case. Not one of my favorite features of the C language, to be sure.

Thanks,
   Jim

On Mar 25, 2010, at 10:15 PM, Evan Cheng wrote:

> 
> On Mar 25, 2010, at 7:27 PM, Jim Grosbach wrote:
> 
>> Is Outs only the variable portion of the argument list? If it includes the fixed portion, it'll never be empty for a varargs function, right?
> 
> Outs are all the arguments including the fixed portion. It can be empty. In fact it's very common because C is so awesome.
> 
> extern void bar();
> void foo() {
>  bar();
> }
> 
> bar is a vararg function.
> 
> Evan
> 
>> 
>> On Mar 25, 2010, at 7:13 PM, Evan Cheng wrote:
>> 
>>> Author: evancheng
>>> Date: Thu Mar 25 21:13:13 2010
>>> New Revision: 99598
>>> 
>>> URL: http://llvm.org/viewvc/llvm-project?rev=99598&view=rev
>>> Log:
>>> Allow trivial sibcall of vararg callee when no arguments are being passed.
>>> 
>>> Modified:
>>>  llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
>>>  llvm/trunk/test/CodeGen/X86/pic.ll
>>>  llvm/trunk/test/CodeGen/X86/sibcall.ll
>>>  llvm/trunk/test/CodeGen/X86/xor-icmp.ll
>>> 
>>> Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=99598&r1=99597&r2=99598&view=diff
>>> ==============================================================================
>>> --- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)
>>> +++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Thu Mar 25 21:13:13 2010
>>> @@ -2301,8 +2301,9 @@
>>> // 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
>>> 
>>> Modified: llvm/trunk/test/CodeGen/X86/pic.ll
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/pic.ll?rev=99598&r1=99597&r2=99598&view=diff
>>> ==============================================================================
>>> --- llvm/trunk/test/CodeGen/X86/pic.ll (original)
>>> +++ llvm/trunk/test/CodeGen/X86/pic.ll Thu Mar 25 21:13:13 2010
>>> @@ -194,10 +194,10 @@
>>> 
>>> ; LINUX: .LJTI8_0:
>>> ; LINUX:   .long	 .LBB8_2 at GOTOFF
>>> -; LINUX:   .long	 .LBB8_2 at GOTOFF
>>> -; LINUX:   .long	 .LBB8_7 at GOTOFF
>>> -; LINUX:   .long	 .LBB8_3 at GOTOFF
>>> -; LINUX:   .long	 .LBB8_7 at GOTOFF
>>> +; LINUX:   .long	 .LBB8_8 at GOTOFF
>>> +; LINUX:   .long	 .LBB8_14 at GOTOFF
>>> +; LINUX:   .long	 .LBB8_9 at GOTOFF
>>> +; LINUX:   .long	 .LBB8_10 at GOTOFF
>>> }
>>> 
>>> declare void @foo1(...)
>>> 
>>> Modified: llvm/trunk/test/CodeGen/X86/sibcall.ll
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/sibcall.ll?rev=99598&r1=99597&r2=99598&view=diff
>>> ==============================================================================
>>> --- llvm/trunk/test/CodeGen/X86/sibcall.ll (original)
>>> +++ llvm/trunk/test/CodeGen/X86/sibcall.ll Thu Mar 25 21:13:13 2010
>>> @@ -271,3 +271,34 @@
>>> }
>>> 
>>> 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(...)
>>> 
>>> Modified: llvm/trunk/test/CodeGen/X86/xor-icmp.ll
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/xor-icmp.ll?rev=99598&r1=99597&r2=99598&view=diff
>>> ==============================================================================
>>> --- llvm/trunk/test/CodeGen/X86/xor-icmp.ll (original)
>>> +++ llvm/trunk/test/CodeGen/X86/xor-icmp.ll Thu Mar 25 21:13:13 2010
>>> @@ -43,7 +43,7 @@
>>> ; X32: cmpl
>>> ; X32: sete
>>> ; X32-NOT: xor
>>> -; X32: je
>>> +; X32: jne
>>> 
>>> ; X64: t2:
>>> ; X64: testl
>>> @@ -51,7 +51,7 @@
>>> ; 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]
>>> 
>>> 
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>> 
> 





More information about the llvm-commits mailing list