Watch for missing summaires in ipa-profile
diff mbox series

Message ID 20191112193309.x4hlhe2rhz5724d7@kam.mff.cuni.cz
State New
Headers show
Series
  • Watch for missing summaires in ipa-profile
Related show

Commit Message

Jan Hubicka Nov. 12, 2019, 7:33 p.m. UTC
Hi,
this patch fixes ICE when callee summary is missing in ipa-profile
(and fixes previously latent bug on handling thunks)

Bootstrapped/regtested x86_64-linux, comitted.

Honza

	PR ipa/92471
	* ipa-profile.c (check_argument_count): Break out from ...;
	watch for missing summaries.
	(ipa_profile): Here.

Patch
diff mbox series

Index: ipa-profile.c
===================================================================
--- ipa-profile.c	(revision 278094)
+++ ipa-profile.c	(working copy)
@@ -476,6 +476,27 @@  ipa_propagate_frequency (struct cgraph_n
   return changed;
 }
 
+/* Check that number of arguments of N agrees with E.
+   Be conservative when summaries are not present.  */
+
+static bool
+check_argument_count (struct cgraph_node *n, struct cgraph_edge *e)
+{
+  if (!ipa_node_params_sum || !ipa_edge_args_sum)
+    return true;
+  class ipa_node_params *info = IPA_NODE_REF (n->function_symbol ());
+  if (!info)
+    return true;
+  ipa_edge_args *e_info = IPA_EDGE_REF (e);
+  if (!e)
+    return true;
+  if (ipa_get_param_count (info) != ipa_get_cs_argument_count (e_info)
+      && (ipa_get_param_count (info) >= ipa_get_cs_argument_count (e_info)
+	  || !stdarg_p (TREE_TYPE (n->decl))))
+    return false;
+  return true;
+}
+
 /* Simple ipa profile pass propagating frequencies across the callgraph.  */
 
 static unsigned int
@@ -599,14 +620,7 @@  ipa_profile (void)
 				 "Not speculating: target is overwritable "
 				 "and can be discarded.\n");
 		    }
-		  else if (ipa_node_params_sum && ipa_edge_args_sum
-			   && (!vec_safe_is_empty
-			       (IPA_NODE_REF (n2)->descriptors))
-			   && ipa_get_param_count (IPA_NODE_REF (n2))
-			      != ipa_get_cs_argument_count (IPA_EDGE_REF (e))
-			    && (ipa_get_param_count (IPA_NODE_REF (n2))
-				>= ipa_get_cs_argument_count (IPA_EDGE_REF (e))
-				|| !stdarg_p (TREE_TYPE (n2->decl))))
+		  else if (check_argument_count (n2, e))
 		    {
 		      nmismatch++;
 		      if (dump_file)