[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