[PATCH]: -fno-inline doesnt prevent inlining

Chandler Carruth chandlerc at google.com
Tue Jan 14 15:31:54 PST 2014


Are there strong reasons to do this by adding attributes rather than
changing the optimizer's behavior? I'm uncertain.

On one hand, it would be more efficient in the optimizer to just switch to
the always-inliner pass.

On the other hand, if we are doing an LTO build, adding attributes ensures
that even the link-top inline step doesn't inline those functions.

On the other other hand, if we are doing an LTO build, we might want to
only prevent inlining during the per-TU optimization run, not during the
LTO optimization run.

Thoughts?


On Tue, Jan 14, 2014 at 11:58 AM, Roman Divacky <rdivacky at freebsd.org>wrote:

> Hi,
>
> Currently -fno-inline doesnt do much, it just prevents adding InlineHint
> attributes. This means that we differ from gcc which prevents all
> functions (except always_inline) from inlining. This simple patch
> implements that behaviour, is that ok?
>
> Index: lib/CodeGen/CodeGenFunction.cpp
> ===================================================================
> --- lib/CodeGen/CodeGenFunction.cpp     (revision 199224)
> +++ lib/CodeGen/CodeGenFunction.cpp     (working copy)
> @@ -510,7 +510,7 @@
>
>    // Pass inline keyword to optimizer if it appears explicitly on any
>    // declaration.
> -  if (!CGM.getCodeGenOpts().NoInline)
> +  if (!CGM.getCodeGenOpts().NoInline) {
>      if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D))
>        for (FunctionDecl::redecl_iterator RI = FD->redecls_begin(),
>               RE = FD->redecls_end(); RI != RE; ++RI)
> @@ -518,6 +518,10 @@
>            Fn->addFnAttr(llvm::Attribute::InlineHint);
>            break;
>          }
> +  } else if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D))
> +    if (!FD->hasAttr<AlwaysInlineAttr>() &&
> +        !FD->hasAttr<ForceInlineAttr>())
> +      Fn->addFnAttr(llvm::Attribute::NoInline);
>
>    if (getLangOpts().OpenCL) {
>      // Add metadata for a kernel function.
> Index: test/CodeGen/noinline.c
> ===================================================================
> --- test/CodeGen/noinline.c     (revision 199224)
> +++ test/CodeGen/noinline.c     (working copy)
> @@ -7,6 +7,7 @@
>
>  volatile int *pa = (int*) 0x1000;
>  void foo() {
> +// NOINLINE: Function Attrs: noinline
>  // NOINLINE: @foo
>  // NOINLINE: dont_inline_me
>  // NOINLINE-NOT: inlinehint
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140114/9d2c1b85/attachment.html>


More information about the cfe-commits mailing list