diff mbox series

Fix inliner ICE with flattening

Message ID 20190418170414.l3cjiyaw3ft6jdnc@kam.mff.cuni.cz
State New
Headers show
Series Fix inliner ICE with flattening | expand

Commit Message

Jan Hubicka April 18, 2019, 5:04 p.m. UTC
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.
diff mbox series

Patch

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 270444)
+++ ChangeLog	(working copy)
@@ -1,3 +1,9 @@ 
+2019-04-18  Jan Hubicka  <hubicka@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.sandiford@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