<div dir="ltr"><div class="gmail_quote"><div dir="ltr">On Wed, Jul 8, 2015 at 2:48 PM Krzysztof Parzyszek <<a href="mailto:kparzysz@codeaurora.org">kparzysz@codeaurora.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On 7/7/2015 8:06 PM, Chandler Carruth wrote:<br>
><br>
> I think that tying *any* optimizer behavior to the 'inline' keyword is<br>
> fundamentally the wrong direction. We have reasons why we have done this<br>
> historically, and we can't just do an immediate about face, but we<br>
> should be actively looking for ways to *reduce* the optimizer's reliance<br>
> on this keyword to convey any meaning whatsoever.<br>
<br>
When it comes to performance, it is often the case that tuning the<br>
inliner can produce measurable benefits.  The problem is though, that<br>
these tweaks will likely degrade other applications.  I don't believe<br>
that the compiler's analysis of the code will ever be sufficient to<br>
adequately meet everyone's needs.  For now, the "inline" keyword is used<br>
as a hint that the programmer can provide to the compiler.  If we move<br>
away from paying any attention to "inline", we should keep in place<br>
another mechanism to allow the programmer to influence the inliner's<br>
decisions.<br></blockquote><div><br></div><div>Yes, and I suggested just such a strategy.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
<br>
> The reason I think that is the correct direction is because, for better<br>
> or worse, the 'inline' keyword in C++ is not about optimization, but<br>
> about linkage. It has a functional impact and can be both necessary or<br>
> impossible to use to meet those functional requirements. This in turn<br>
> leaves programmers in a lurch if the functional requirements are ever in<br>
> tension with the optimizer requirements.<br>
<br>
Could you give an example of such a situation?  The "inline" keyword in<br>
C has some unintuitive consequences (i.e. not provinding an "external<br>
definition"), but since C++ treats all inline functions as "static",<br>
this problem went away.  This is the only issue related to linkage that<br>
I am aware of.<br></blockquote><div><br></div><div>I did in my email to David Li. To get more concrete, method definitions of class templates must be inline regardless of whether they make any sense at all to inline in the optimizer.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
<br>
> We're also working really hard to get more widely deployed cross-module<br>
> optimization strategies, in part to free programmers from the<br>
> requirement that they put all their performance critical code in header<br>
> files. That makes compilation faster, and has lots of benefits to the<br>
> factoring and design of the code itself. We shouldn't then create an<br>
> incentive to keep things in header files so that they pick up a hint to<br>
> the optimizer.<br>
<br>
The incentive is already there---this is a programming practice that has<br>
existed for a long time.  We can provide alternative means (such as LTO)<br>
that are arguably better, but making existing practice worse for the<br>
programmer will not win too many people over.<br></blockquote><div><br></div><div>I'm not trying to make things worse. I'm not arguing to actively harm anything to incentivize anything. I'm suggesting that we should be decoupling our optimization hints from using a specific linkage or writing code in a header file versus a source file. That way they work both today, and in any future LTO model folks are using. (And some folks are using LTO today.)</div></div></div>