<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">|
</span>The problem is that the other way around is not true: a function linkonce_odr linkage may be neither inline declared nor have in-class definition.<o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><a name="_MailEndCompose"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Sorry, why is that a problem?  Did you have some other reason to want to identify functions that either specify 'inline' or have an
 in-class definition?<o:p></o:p></span></a></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">The inliner is not *prevented* from inlining a function that falls outside of those cases, as far as I know.  A static file-level function might be a good candidate,
 even if it is not explicitly marked 'inline'.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">--paulr<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt">
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> Xinliang David Li [mailto:xinliangli@gmail.com]
<br>
<b>Sent:</b> Wednesday, June 24, 2015 12:56 PM<br>
<b>To:</b> Robinson, Paul<br>
<b>Cc:</b> Easwaran Raman; Xinliang David Li; <llvmdev@cs.uiuc.edu> List<br>
<b>Subject:</b> Re: [LLVMdev] Inline hint for methods defined in-class<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">The problem is that the other way around is not true: a function linkonce_odr linkage may be neither inline declared nor have in-class definition.<o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">David<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">On Wed, Jun 24, 2015 at 11:53 AM, Robinson, Paul <<a href="mailto:Paul_Robinson@playstation.sony.com" target="_blank">Paul_Robinson@playstation.sony.com</a>> wrote:<o:p></o:p></p>
<p class="MsoNormal"><br>
<br>
> -----Original Message-----<br>
> From: <a href="mailto:llvmdev-bounces@cs.uiuc.edu">llvmdev-bounces@cs.uiuc.edu</a> [mailto:<a href="mailto:llvmdev-bounces@cs.uiuc.edu">llvmdev-bounces@cs.uiuc.edu</a>] 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">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 <<a href="mailto:davidxl@google.com">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 <<a href="mailto:bmakam@codeaurora.org">bmakam@codeaurora.org</a>><br>
> wrote:<br>
> >> AFAIK, this was fixed in r233817.<br>
<br>
That was later reverted.<o:p></o:p></p>
<div>
<div>
<p class="MsoNormal" style="margin-bottom:12.0pt"><br>
> >><br>
> >> -----Original Message-----<br>
> >> From: <a href="mailto:llvmdev-bounces@cs.uiuc.edu">llvmdev-bounces@cs.uiuc.edu</a> [mailto:<a href="mailto:llvmdev-bounces@cs.uiuc.edu">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">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 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 GD,<br>
> >>    if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D)) {<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 noticeable<br>
> >> performance difference and the maximum text size increase is < 0.25%.<br>
> >> I then built clang with and without this change. This increases 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 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 is a<br>
> >> useful hint to the inliner. FWIW, GCC's inliner doesn't differentiate<br>
> these<br>
> >> from explicit inline functions. If the above results doesn't 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 the<br>
> existing<br>
> >> inlinehint to allow for better tuning in the inliner.<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal">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<o:p></o:p></p>
<div>
<div>
<p class="MsoNormal"><br>
> >><br>
> >> Thanks,<br>
> >> Easwaran<br>
> >> _______________________________________________<br>
> >> LLVM Developers mailing list<br>
> >> <a href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
> >> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" 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">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" 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">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><o:p></o:p></p>
</div>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
</div>
</body>
</html>