From d200a49f5c83fa0f2e7332aecf69b6ab4a51b052 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Tue, 12 Nov 2019 20:31:04 +0100 Subject: [PATCH] re PR ipa/92471 ([ICE] lto1 segmentation fault: ipa-profile.c ipa_get_cs_argument_count (args=0x0)) PR ipa/92471 * ipa-profile.c (check_argument_count): Break out from ...; watch for missing summaries. (ipa_profile): Here. From-SVN: r278100 --- gcc/ChangeLog | 7 +++++++ gcc/ipa-profile.c | 30 ++++++++++++++++++++++-------- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a434f25311c..5cd93c62541 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2019-11-12 Jan Hubicka + + PR ipa/92471 + * ipa-profile.c (check_argument_count): Break out from ...; + watch for missing summaries. + (ipa_profile): Here. + 2019-11-12 Martin Sebor PR tree-optimization/92412 diff --git a/gcc/ipa-profile.c b/gcc/ipa-profile.c index 7bf446624b2..cd354d1a73e 100644 --- a/gcc/ipa-profile.c +++ b/gcc/ipa-profile.c @@ -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) -- 2.30.2