https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85051

--- Comment #6 from Jan Hubicka <hubicka at gcc dot gnu.org> ---
The problem is that flattening forgets to update global info.
I am testing the following fix
Index: ipa-inline.c
===================================================================
--- ipa-inline.c        (revision 270280)
+++ ipa-inline.c        (working copy)
@@ -2134,7 +2134,7 @@ inline_small_functions (void)
    at IPA inlining time.  */

 static void
-flatten_function (struct cgraph_node *node, bool early)
+flatten_function (struct cgraph_node *node, bool early, bool update)
 {
   struct cgraph_edge *e;

@@ -2164,7 +2164,7 @@ flatten_function (struct cgraph_node *no
         it in order to fully flatten the leaves.  */
       if (!e->inline_failed)
        {
-         flatten_function (callee, early);
+         flatten_function (callee, early, false);
          continue;
        }

@@ -2204,14 +2204,15 @@ flatten_function (struct cgraph_node *no
       inline_call (e, true, NULL, NULL, false);
       if (e->callee != orig_callee)
        orig_callee->aux = (void *) node;
-      flatten_function (e->callee, early);
+      flatten_function (e->callee, early, false);
       if (e->callee != orig_callee)
        orig_callee->aux = NULL;
     }

   node->aux = NULL;
-  if (!node->global.inlined_to)
-    ipa_update_overall_fn_summary (node);
+  if (update)
+    ipa_update_overall_fn_summary (node->global.inlined_to
+                                  ? node->global.inlined_to : node);
 }

 /* Inline NODE to all callers.  Worker for cgraph_for_node_and_aliases.
@@ -2519,7 +2520,7 @@ ipa_inline (void)
         function.  */
       if (dump_file)
        fprintf (dump_file, "Flattening %s\n", node->name ());
-      flatten_function (node, false);
+      flatten_function (node, false, true);
     }

   if (j < nnodes - 2)
@@ -2782,7 +2783,7 @@ early_inliner (function *fun)
       if (dump_enabled_p ())
        dump_printf (MSG_OPTIMIZED_LOCATIONS,
                     "Flattening %C\n", node);
-      flatten_function (node, true);
+      flatten_function (node, true, true);
       inlined = true;
     }
   else

Reply via email to