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.
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)

Reply via email to