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

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.

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.
This commit is contained in:
Richard Biener 2022-01-18 13:48:34 +01:00
parent e89b2a270d
commit c952126870
2 changed files with 36 additions and 1 deletions

View File

@ -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)

View File

@ -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};
}