> 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 <rguent...@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