On Tue, 18 Jan 2022, Jan Hubicka wrote: > > 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?
I thought about that but decided to not do that - the issue here is really that -Og doesn't run post-IPA optimizations so if we inline a -Og early optimized function into a -O2 optimized function at IPA time that issue doesn't apply. So if then we should do that separately and with another motivating testcase. Thanks, Richard. > > 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 > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg, Germany; GF: Ivo Totev; HRB 36809 (AG Nuernberg)