[PATCH] ipa/103989 - avoid IPA inlining of small functions with -Og

Jan Hubicka hubicka@kam.mff.cuni.cz
Tue Jan 18 13:53:12 GMT 2022


> The following change avoids doing IPA inlining of small functions
> into functions compiled with -Og - those functions will see almost no
> followup scalar cleanups so that the benefit anticipated by the
> inliner will not be realized and instead the late diagnostic code
> will be confused by dead code that is left around.
> 
> Bootstrap & regtest pending on x86_64-unknown-linux-gnu.
> 
> OK?
OK.  Do we also want to disable inlining when callee is -Og and caller
is not?

Honza
> 
> Thanks,
> Richard.
> 
> 2022-01-18  Richard Biener  <rguenther@suse.de>
> 
> 	PR ipa/103989
> 	* ipa-inline.cc (inline_small_functions): Do not enqueue call
> 	edges originating in functions compiled with -Og.
> 
> 	* g++.dg/opt/pr103989.C: New testcase.
> ---
>  gcc/ipa-inline.cc                   |  7 ++++++-
>  gcc/testsuite/g++.dg/opt/pr103989.C | 30 +++++++++++++++++++++++++++++
>  2 files changed, 36 insertions(+), 1 deletion(-)
>  create mode 100644 gcc/testsuite/g++.dg/opt/pr103989.C
> 
> diff --git a/gcc/ipa-inline.cc b/gcc/ipa-inline.cc
> index 38522771118..f8bb072c422 100644
> --- a/gcc/ipa-inline.cc
> +++ b/gcc/ipa-inline.cc
> @@ -2029,7 +2029,12 @@ inline_small_functions (void)
>        struct cgraph_edge *next = NULL;
>        bool has_speculative = false;
>  
> -      if (!opt_for_fn (node->decl, optimize))
> +      if (!opt_for_fn (node->decl, optimize)
> +	  /* With -Og we do not want to perform IPA inlining of small
> +	     functions since there are no scalar cleanups after it
> +	     that would realize the anticipated win.  All abstraction
> +	     is removed during early inlining.  */
> +	  || opt_for_fn (node->decl, optimize_debug))
>  	continue;
>  
>        if (dump_file)
> diff --git a/gcc/testsuite/g++.dg/opt/pr103989.C b/gcc/testsuite/g++.dg/opt/pr103989.C
> new file mode 100644
> index 00000000000..4604811b42a
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/opt/pr103989.C
> @@ -0,0 +1,30 @@
> +// { dg-require-effective-target c++17 }
> +// { dg-options "-Og -Wall" }
> +
> +#include <optional>
> +#include <memory>
> +
> +struct A {
> +  A (int a) : a {a} 
> +  {}
> +
> +  const std::shared_ptr <int> x;
> +  int a;
> +};
> +
> +class B
> +{
> +public:
> +  B (const std::optional <A>& a)
> +    : a {a}
> +  {
> +  }
> +public:
> +  const std::optional <A> a;
> +};
> +
> +int
> +main ()
> +{
> +  B b {std::nullopt};
> +}
> -- 
> 2.31.1


More information about the Gcc-patches mailing list