[LLVMdev] calling conventions and inlining

Jeff Cohen jeffc at jolt-lang.org
Sat May 7 13:23:25 PDT 2005


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.

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
>




More information about the llvm-dev mailing list