re PR ipa/92471 ([ICE] lto1 segmentation fault: ipa-profile.c ipa_get_cs_argument_cou...
authorJan Hubicka <hubicka@ucw.cz>
Tue, 12 Nov 2019 19:31:04 +0000 (20:31 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Tue, 12 Nov 2019 19:31:04 +0000 (19:31 +0000)
PR ipa/92471
* ipa-profile.c (check_argument_count): Break out from ...;
watch for missing summaries.
(ipa_profile): Here.

From-SVN: r278100

gcc/ChangeLog
gcc/ipa-profile.c

index a434f25311c5933358de917aa5783a1c4932852a..5cd93c625414afd18c0caa75cae5421043019deb 100644 (file)
@@ -1,3 +1,10 @@
+2019-11-12  Jan Hubicka  <hubicka@ucw.cz>
+
+       PR ipa/92471
+       * ipa-profile.c (check_argument_count): Break out from ...;
+       watch for missing summaries.
+       (ipa_profile): Here.
+
 2019-11-12  Martin Sebor  <msebor@redhat.com>
 
        PR tree-optimization/92412
index 7bf446624b2e99aafce91b6cda4ea67d81ba19cf..cd354d1a73eec307c704211d12d0b9251251d120 100644 (file)
@@ -476,6 +476,27 @@ ipa_propagate_frequency (struct cgraph_node *node)
   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)