[LLVMdev] calling conventions and inlining

Chris Lattner sabre at nondot.org
Sat May 7 13:25:02 PDT 2005


On Sat, 7 May 2005, Jeff Cohen wrote:
> There is one case where inlining/not-inlining affects correctness.  A 
> function which uses alloca() will behave differently in the two cases.  You 
> can argue one shouldn't write code like this, but it is legal.

The inliner doesn't inline functions that call alloca, or other cases that 
break correctness.

-Chris

> Chris Lattner wrote:
>
>> On Sat, 7 May 2005, Markus F.X.J. Oberhumer wrote:
>> 
>>> I see that you are objecting explicit inline control.
>>> 
>>> The main problem is that inlining is absolutely crucial for some "modern" 
>>> programming styles. E.g. we use a huge collection of small C++ template 
>>> classes and template metaclasses, most of which have very trivial and 
>>> limited functionality (think of it as some "bytecode" expressed in 
>>> classes). Of course, these method calls of these classes _must_ be 
>>> inlined, but there are also "traditional" calls to other functions which 
>>> may or may not be meant for inlining.  If the inliner just guesses one of 
>>> these calls wrong (and it usually does) then performance will drop by an 
>>> order of magnitude. That's why all C++ compilers I know support explicit 
>>> inline control.
>> 
>> 
>> I understand where you are coming from.  Here are the reasons that I think 
>> this is a bogus argument:
>> 
>> I.   If the function is an obvious *must inline* choice, the compiler will
>>      trivially see this and inline it.  LLVM in particular is very good at
>>      ripping apart layers of abstraction, and there a couple of known ways
>>      to improve it further.  This leaves the cases where you *dont* want
>>      to inline stuff and cases where *want* to inline something but it is
>>      not obvious.
>> 
>> II.  For cases where you don't want it to get inlined, arrange for it to
>>      get marked coldcc and you're done.
>> 
>> III. The only remaining case is when you have a function call that is
>>      sufficiently "non obvious" to inline but you want to force it to be
>>      inlined.  Usually this is because your are tuning your application
>>      and note that you get better performance by inlining.
>> 
>> I assume the III is what you're really worried about, so I will explain why 
>> I think that a "force_inline" directive on functions is a bad idea.
>> 
>> 1. First, this property is something that varies on a *CALL SITE* basis,
>>    not on a callee basis.  If you really want this, you should be
>>    annotating call sites, not functions.
>> 2. These annotations are non-portable across different compilers and even
>>    across the different versions of the same compiler.  For example, in
>>    the first case, GCC does no IPO other than inlining, so forcing
>>    something to be inlined can make a huge difference.  LLVM, OTOH, does a
>>    large amount of IPO and IPA, such as dead argument elimination, IPSCCP,
>>    and other things.  Something that is good to inline for GCC is not
>>    necessarily good for LLVM.
>> 3. Once these annotations are added to a source base, they are almost
>>    never removed or reevaluated.  This exacerbates #2.
>> 
>> In my mind, the right solution to this problem is to use profile-directed 
>> inlining.  If you actually care this much about the performance of your 
>> code, you should be willing to use profile information.  Profile 
>> information will help inlining, but it can also be used for far more than 
>> just that.
>> 
>> My personal opinion (which you may disagree with strongly!) is that the 
>> importance that many people place on "force this to be inlined" directives 
>> is largely based on experience with compilers that don't do any non-trivial 
>> IPO.  If the compiler is doing link-time IPO, the function call boundary is 
>> much less of a big deal.
>> 
>> Finally, if you have a piece of code that the LLVM optimizer is doing a 
>> poor job on, please please please file a bug so we can fix it!!
>> 
>> -Chris
>> 
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://mail.cs.uiuc.edu/mailman/listinfo/llvmdev
>

-Chris

-- 
http://nondot.org/sabre/
http://llvm.cs.uiuc.edu/




More information about the llvm-dev mailing list