Clang adds the InlineHint attribute to functions that are explicitly
marked inline, but not if they are defined in the class body. I tried
the following patch, which I believe handles the in-class definition
case:
--- a/lib/CodeGen/CodeGenFunction.cpp
+++ b/lib/CodeGen/CodeGenFunction.cpp
@@ -630,7 +630,7 @@ void CodeGenFunction::StartFunction(GlobalDecl GD,
if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D)) {
if (!CGM.getCodeGenOpts().NoInline) {
for (auto RI : FD->redecls())
- if (RI->isInlineSpecified()) {
+ if (RI->isInlined()) {
Fn->addFnAttr(llvm::Attribute::InlineHint);
break;
}
I tried this on C++ benchmarks in SPEC 2006. There is no noticeable
performance difference and the maximum text size increase is < 0.25%.
I then built clang with and without this change. This increases the
text size by 4.1%. For measuring performance, I compiled a large (4.8
million lines) preprocessed file. This change improves runtime
performance by 0.9% (average of 10 runs) in O0 and O2.
I think knowing whether a function is defined inside a class body is a
useful hint to the inliner. FWIW, GCC's inliner doesn't differentiate
these from explicit inline functions. If the above results doesn't
justify this change, are there other benchmarks that I should
evaluate? Another possibility is to add a separate hint for this
instead of using the existing inlinehint to allow for better tuning in
the inliner.
Thanks,
Easwaran
AFAIK, this was fixed in r233817.
-----Original Message-----
From: llvmdev-bounces at cs.uiuc.edu [mailto:llvmdev-bounces at cs.uiuc.edu] On
Behalf Of Easwaran Raman
Sent: Wednesday, June 17, 2015 6:59 PM
To: llvmdev at cs.uiuc.edu
Cc: David Li
Subject: [LLVMdev] Inline hint for methods defined in-class
Clang adds the InlineHint attribute to functions that are explicitly marked
inline, but not if they are defined in the class body. I tried the following
patch, which I believe handles the in-class definition
case:
--- a/lib/CodeGen/CodeGenFunction.cpp
+++ b/lib/CodeGen/CodeGenFunction.cpp
@@ -630,7 +630,7 @@ void CodeGenFunction::StartFunction(GlobalDecl GD,
if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D)) {
if (!CGM.getCodeGenOpts().NoInline) {
for (auto RI : FD->redecls())
- if (RI->isInlineSpecified()) {
+ if (RI->isInlined()) {
Fn->addFnAttr(llvm::Attribute::InlineHint);
break;
}
I tried this on C++ benchmarks in SPEC 2006. There is no noticeable
performance difference and the maximum text size increase is < 0.25%.
I then built clang with and without this change. This increases the text
size by 4.1%. For measuring performance, I compiled a large (4.8 million
lines) preprocessed file. This change improves runtime performance by 0.9%
(average of 10 runs) in O0 and O2.
I think knowing whether a function is defined inside a class body is a
useful hint to the inliner. FWIW, GCC's inliner doesn't differentiate
these
from explicit inline functions. If the above results doesn't justify this
change, are there other benchmarks that I should evaluate? Another
possibility is to add a separate hint for this instead of using the existing
inlinehint to allow for better tuning in the inliner.
Thanks,
Easwaran
_______________________________________________
LLVM Developers mailing list
LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
Xinliang David Li
2015-Jun-17 23:13 UTC
[LLVMdev] Inline hint for methods defined in-class
that looks like a different fix. The case mentioned by Easwaran is
class A{
int foo () { return 1; }
...
};
where 'foo' is not explicitly declared with 'inline' keyword.
David
On Wed, Jun 17, 2015 at 4:07 PM, Balaram Makam <bmakam at codeaurora.org>
wrote:> AFAIK, this was fixed in r233817.
>
> -----Original Message-----
> From: llvmdev-bounces at cs.uiuc.edu [mailto:llvmdev-bounces at
cs.uiuc.edu] On
> Behalf Of Easwaran Raman
> Sent: Wednesday, June 17, 2015 6:59 PM
> To: llvmdev at cs.uiuc.edu
> Cc: David Li
> Subject: [LLVMdev] Inline hint for methods defined in-class
>
> Clang adds the InlineHint attribute to functions that are explicitly marked
> inline, but not if they are defined in the class body. I tried the
following
> patch, which I believe handles the in-class definition
> case:
>
> --- a/lib/CodeGen/CodeGenFunction.cpp
> +++ b/lib/CodeGen/CodeGenFunction.cpp
> @@ -630,7 +630,7 @@ void CodeGenFunction::StartFunction(GlobalDecl GD,
> if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D)) {
> if (!CGM.getCodeGenOpts().NoInline) {
> for (auto RI : FD->redecls())
> - if (RI->isInlineSpecified()) {
> + if (RI->isInlined()) {
> Fn->addFnAttr(llvm::Attribute::InlineHint);
> break;
> }
>
> I tried this on C++ benchmarks in SPEC 2006. There is no noticeable
> performance difference and the maximum text size increase is < 0.25%.
> I then built clang with and without this change. This increases the text
> size by 4.1%. For measuring performance, I compiled a large (4.8 million
> lines) preprocessed file. This change improves runtime performance by 0.9%
> (average of 10 runs) in O0 and O2.
>
> I think knowing whether a function is defined inside a class body is a
> useful hint to the inliner. FWIW, GCC's inliner doesn't
differentiate these
> from explicit inline functions. If the above results doesn't justify
this
> change, are there other benchmarks that I should evaluate? Another
> possibility is to add a separate hint for this instead of using the
existing
> inlinehint to allow for better tuning in the inliner.
>
> Thanks,
> Easwaran
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>