mirror of https://github.com/microsoft/clang.git
Make -fno-inline attach NoInline attribute to all functions that are not
marked as AlwaysInline or ForceInline. This moves us to what gcc does with -fno-inline. The attribute approach was discussed to be better than switching to InlineAlways inliner in presence of LTO. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@199324 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
2ff5a1edc0
commit
93de7bb38c
|
@ -509,15 +509,20 @@ void CodeGenFunction::StartFunction(GlobalDecl GD,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pass inline keyword to optimizer if it appears explicitly on any
|
// Pass inline keyword to optimizer if it appears explicitly on any
|
||||||
// declaration.
|
// declaration. Also, in the case of -fno-inline attach NoInline
|
||||||
if (!CGM.getCodeGenOpts().NoInline)
|
// attribute to all function that are not marked AlwaysInline or ForceInline.
|
||||||
if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D))
|
if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D)) {
|
||||||
|
if (!CGM.getCodeGenOpts().NoInline) {
|
||||||
for (FunctionDecl::redecl_iterator RI = FD->redecls_begin(),
|
for (FunctionDecl::redecl_iterator RI = FD->redecls_begin(),
|
||||||
RE = FD->redecls_end(); RI != RE; ++RI)
|
RE = FD->redecls_end(); RI != RE; ++RI)
|
||||||
if (RI->isInlineSpecified()) {
|
if (RI->isInlineSpecified()) {
|
||||||
Fn->addFnAttr(llvm::Attribute::InlineHint);
|
Fn->addFnAttr(llvm::Attribute::InlineHint);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
} else if (!FD->hasAttr<AlwaysInlineAttr>() &&
|
||||||
|
!FD->hasAttr<ForceInlineAttr>())
|
||||||
|
Fn->addFnAttr(llvm::Attribute::NoInline);
|
||||||
|
}
|
||||||
|
|
||||||
if (getLangOpts().OpenCL) {
|
if (getLangOpts().OpenCL) {
|
||||||
// Add metadata for a kernel function.
|
// Add metadata for a kernel function.
|
||||||
|
|
|
@ -5,10 +5,17 @@
|
||||||
|
|
||||||
inline int dont_inline_me(int a, int b) { return(a+b); }
|
inline int dont_inline_me(int a, int b) { return(a+b); }
|
||||||
|
|
||||||
|
inline __attribute__ ((__always_inline__)) int inline_me(int a, int b) { return(a*b); }
|
||||||
|
|
||||||
volatile int *pa = (int*) 0x1000;
|
volatile int *pa = (int*) 0x1000;
|
||||||
void foo() {
|
void foo() {
|
||||||
// NOINLINE: @foo
|
// NOINLINE: @foo
|
||||||
// NOINLINE: dont_inline_me
|
// NOINLINE: dont_inline_me
|
||||||
// NOINLINE-NOT: inlinehint
|
// NOINLINE-NOT: inlinehint
|
||||||
pa[0] = dont_inline_me(pa[1],pa[2]);
|
pa[0] = dont_inline_me(pa[1],pa[2]);
|
||||||
|
// NOINLINE-NOT: inline_me
|
||||||
|
pa[3] = inline_me(pa[4],pa[5]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NOINLINE: Function Attrs: noinline
|
||||||
|
// NOINLINE: @dont_inline_me
|
||||||
|
|
Loading…
Reference in New Issue