<div dir="ltr"><br><br><div class="gmail_quote"><div dir="ltr">On Wed, Jun 24, 2015 at 2:16 PM Robinson, Paul <<a href="mailto:Paul_Robinson@playstation.sony.com">Paul_Robinson@playstation.sony.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">> -----Original Message-----<br>
> From: Easwaran Raman [mailto:<a href="mailto:eraman@google.com" target="_blank">eraman@google.com</a>]<br>
> Sent: Wednesday, June 24, 2015 1:27 PM<br>
> To: Xinliang David Li<br>
> Cc: Robinson, Paul; Xinliang David Li; <<a href="mailto:llvmdev@cs.uiuc.edu" target="_blank">llvmdev@cs.uiuc.edu</a>> List<br>
> Subject: Re: [LLVMdev] Inline hint for methods defined in-class<br>
><br>
> The method to identify functions with in-class definitions is one part<br>
> of my question. Even if there is a way to do that without passing the<br>
> hint, I'm interested in getting feedback on treating it at-par with<br>
> functions having the inline hint in inline cost analysis.<br>
<br>
Well, personally I think having the 'inline' keyword mean "try harder"<br>
is worth something, but that's intuition backed by no data whatsoever.<br>
Your patch would turn 'inline' into noise, when applied to a function<br>
with an in-class definition.  Granted that the way the C++ standard<br>
describes 'inline' it is effectively noise in that situation.<br>
</blockquote><div><br></div><div>FWIW in my experience here the inline keyword is pretty much useless. It may, or may not, have been applied correctly in the first place, but after in a code base of any appreciable size or age it's almost assuredly no different from noise when analyzing actual performance.</div><div><br></div><div>Other people's mileage may vary.</div><div><br></div><div>-eric</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">--paulr<br>
<br>
><br>
> Thanks,<br>
> Easwaran<br>
><br>
><br>
> On Wed, Jun 24, 2015 at 12:56 PM, Xinliang David Li<br>
> <<a href="mailto:xinliangli@gmail.com" target="_blank">xinliangli@gmail.com</a>> wrote:<br>
> > The problem is that the other way around is not true: a function<br>
> > linkonce_odr linkage may be neither inline declared nor have in-class<br>
> > definition.<br>
> ><br>
> > David<br>
> ><br>
> ><br>
> > On Wed, Jun 24, 2015 at 11:53 AM, Robinson, Paul<br>
> > <<a href="mailto:Paul_Robinson@playstation.sony.com" target="_blank">Paul_Robinson@playstation.sony.com</a>> wrote:<br>
> >><br>
> >><br>
> >><br>
> >> > -----Original Message-----<br>
> >> > From: <a href="mailto:llvmdev-bounces@cs.uiuc.edu" target="_blank">llvmdev-bounces@cs.uiuc.edu</a> [mailto:<a href="mailto:llvmdev-" target="_blank">llvmdev-</a><br>
> <a href="mailto:bounces@cs.uiuc.edu" target="_blank">bounces@cs.uiuc.edu</a>]<br>
> >> > On<br>
> >> > Behalf Of Easwaran Raman<br>
> >> > Sent: Wednesday, June 24, 2015 9:54 AM<br>
> >> > To: Xinliang David Li<br>
> >> > Cc: <<a href="mailto:llvmdev@cs.uiuc.edu" target="_blank">llvmdev@cs.uiuc.edu</a>> List<br>
> >> > Subject: Re: [LLVMdev] Inline hint for methods defined in-class<br>
> >> ><br>
> >> > Ping.<br>
> >> ><br>
> >> > On Wed, Jun 17, 2015 at 4:13 PM, Xinliang David Li<br>
> <<a href="mailto:davidxl@google.com" target="_blank">davidxl@google.com</a>><br>
> >> > wrote:<br>
> >> > > that looks like a different fix. The case mentioned by Easwaran is<br>
> >> > ><br>
> >> > > class A{<br>
> >> > >    int foo () { return 1; }<br>
> >> > >   ...<br>
> >> > > };<br>
> >> > ><br>
> >> > > where 'foo' is not explicitly declared with 'inline' keyword.<br>
> >> > ><br>
> >> > > David<br>
> >> > ><br>
> >> > > On Wed, Jun 17, 2015 at 4:07 PM, Balaram Makam<br>
> <<a href="mailto:bmakam@codeaurora.org" target="_blank">bmakam@codeaurora.org</a>><br>
> >> > wrote:<br>
> >> > >> AFAIK, this was fixed in r233817.<br>
> >><br>
> >> That was later reverted.<br>
> >><br>
> >> > >><br>
> >> > >> -----Original Message-----<br>
> >> > >> From: <a href="mailto:llvmdev-bounces@cs.uiuc.edu" target="_blank">llvmdev-bounces@cs.uiuc.edu</a><br>
> >> > >> [mailto:<a href="mailto:llvmdev-bounces@cs.uiuc.edu" target="_blank">llvmdev-bounces@cs.uiuc.edu</a>]<br>
> >> > On<br>
> >> > >> Behalf Of Easwaran Raman<br>
> >> > >> Sent: Wednesday, June 17, 2015 6:59 PM<br>
> >> > >> To: <a href="mailto:llvmdev@cs.uiuc.edu" target="_blank">llvmdev@cs.uiuc.edu</a><br>
> >> > >> Cc: David Li<br>
> >> > >> Subject: [LLVMdev] Inline hint for methods defined in-class<br>
> >> > >><br>
> >> > >> Clang adds the InlineHint attribute to functions that are<br>
> explicitly<br>
> >> > marked<br>
> >> > >> inline, but not if they are defined in the class body. I tried the<br>
> >> > following<br>
> >> > >> patch, which I believe handles the in-class definition<br>
> >> > >> case:<br>
> >> > >><br>
> >> > >> --- a/lib/CodeGen/CodeGenFunction.cpp<br>
> >> > >> +++ b/lib/CodeGen/CodeGenFunction.cpp<br>
> >> > >> @@ -630,7 +630,7 @@ void CodeGenFunction::StartFunction(GlobalDecl<br>
> >> > >> GD,<br>
> >> > >>    if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D))<br>
> {<br>
> >> > >>      if (!CGM.getCodeGenOpts().NoInline) {<br>
> >> > >>        for (auto RI : FD->redecls())<br>
> >> > >> -        if (RI->isInlineSpecified()) {<br>
> >> > >> +        if (RI->isInlined()) {<br>
> >> > >>            Fn->addFnAttr(llvm::Attribute::InlineHint);<br>
> >> > >>            break;<br>
> >> > >>          }<br>
> >> > >><br>
> >> > >> I tried this on C++ benchmarks in SPEC 2006. There is no<br>
> noticeable<br>
> >> > >> performance difference and the maximum text size increase is <<br>
> 0.25%.<br>
> >> > >> I then built clang with and without this change. This increases<br>
> the<br>
> >> > text<br>
> >> > >> size by 4.1%.  For measuring performance, I compiled a large (4.8<br>
> >> > million<br>
> >> > >> lines) preprocessed file. This change improves runtime performance<br>
> by<br>
> >> > 0.9%<br>
> >> > >> (average of 10 runs) in O0 and O2.<br>
> >> > >><br>
> >> > >> I think knowing whether a function is defined inside a class body<br>
> is<br>
> >> > >> a<br>
> >> > >> useful hint to the inliner. FWIW, GCC's inliner doesn't<br>
> differentiate<br>
> >> > these<br>
> >> > >> from explicit inline functions. If the above results doesn't<br>
> justify<br>
> >> > this<br>
> >> > >> change, are there other benchmarks that I should evaluate? Another<br>
> >> > >> possibility is to add a separate hint for this instead of using<br>
> the<br>
> >> > existing<br>
> >> > >> inlinehint to allow for better tuning in the inliner.<br>
> >><br>
> >> A function with an in-class definition will have linkonce_odr linkage,<br>
> >> so it should be possible to identify such functions in the inliner<br>
> >> without introducing the inlinehint attribute.<br>
> >> --paulr<br>
> >><br>
> >> > >><br>
> >> > >> Thanks,<br>
> >> > >> Easwaran<br>
> >> > >> _______________________________________________<br>
> >> > >> LLVM Developers mailing list<br>
> >> > >> <a href="mailto:LLVMdev@cs.uiuc.edu" target="_blank">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" rel="noreferrer" target="_blank">http://llvm.cs.uiuc.edu</a><br>
> >> > >> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" rel="noreferrer" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
> >> > >><br>
> >> > _______________________________________________<br>
> >> > LLVM Developers mailing list<br>
> >> > <a href="mailto:LLVMdev@cs.uiuc.edu" target="_blank">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" rel="noreferrer" target="_blank">http://llvm.cs.uiuc.edu</a><br>
> >> > <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" rel="noreferrer" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
> >><br>
> >> _______________________________________________<br>
> >> LLVM Developers mailing list<br>
> >> <a href="mailto:LLVMdev@cs.uiuc.edu" target="_blank">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" rel="noreferrer" target="_blank">http://llvm.cs.uiuc.edu</a><br>
> >> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" rel="noreferrer" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
> ><br>
> ><br>
<br>
_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:LLVMdev@cs.uiuc.edu" target="_blank">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" rel="noreferrer" target="_blank">http://llvm.cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" rel="noreferrer" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
</blockquote></div></div>