[gcc r12-6677] ipa/103989 - avoid IPA inlining of small functions with -Og

Richard Biener rguenth@gcc.gnu.org
Tue Jan 18 14:43:24 GMT 2022


https://gcc.gnu.org/g:c952126870c92cf293d59ffb1497e402eb8fc269

commit r12-6677-gc952126870c92cf293d59ffb1497e402eb8fc269
Author: Richard Biener <rguenther@suse.de>
Date:   Tue Jan 18 13:48:34 2022 +0100

    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.

Diff:
---
 gcc/ipa-inline.cc                   |  7 ++++++-
 gcc/testsuite/g++.dg/opt/pr103989.C | 30 ++++++++++++++++++++++++++++++
 2 files changed, 36 insertions(+), 1 deletion(-)

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


More information about the Gcc-cvs mailing list