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)