Hi,
the testcase (which I fialed to annotate correctly for testsuite)
triggers situation where we forget to update overall summary after
flattenin and later ICE in verification that estimates match.

Bootstrapped/regtested x86_64-linux, comitted.

Index: ChangeLog
===================================================================
--- ChangeLog   (revision 270444)
+++ ChangeLog   (working copy)
@@ -1,3 +1,9 @@
+2019-04-18  Jan Hubicka  <hubi...@ucw.cz>
+
+       PR ipa/85051
+       * ipa-inline.c (flatten_function): New parameter UPDATE.
+       (ipa_inline, early_inliner): Use it.
+
 2019-04-18  Richard Sandiford  <richard.sandif...@arm.com>
 
        * fold-const.c (int_const_binop): Return early on failure.
Index: ipa-inline.c
===================================================================
--- ipa-inline.c        (revision 270444)
+++ 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