Hi, the patch below fixes the i686 failures reported in PR 92476. Newly expanded "artificial" thunks need to be analyzed when expanded so that we create necessary function summaries and jump functions for them. They still don't get IPA-CP lattices, so I looked at all accesses to those and verified that only the functions saving IPA-VR and IPA-bits analyses could try to access non-existing lattices.
After that, Martin's testcase in comment 4 of the bug also revealed two places where we try to access summaries of unoptimized functions and segfault, so I fixed those too. Unfortunately it seems our testsuite cannot optimize different LTO compilation units with different options and so I could not add the testcase there. But it no longer ICEs. Bootstrapped and LTO-profile-bootstrapped and tested on x86_64-linux and I also verified the -m32 testsuite failures are all gone. OK for trunk? Thanks, Martin 2019-11-28 Martin Jambor <mjam...@suse.cz> Jan Hubicka <j...@suse.cz> PR ipa/92476 * ipa-cp.c (set_single_call_flag): Set node_calling_single_call in the summary only if the summary exists. (find_more_scalar_values_for_callers_subset): Check node_dead in the summary only if the summary exists. (ipcp_store_bits_results): Ignore nodes without lattices. (ipcp_store_vr_results): Likewise. * cgraphclones.c: Include ipa-fnsummary.h and ipa-prop.h and the header files required by them. (cgraph_node::expand_all_artificial_thunks): Analyze expanded thunks. --- gcc/cgraphclones.c | 7 +++++++ gcc/ipa-cp.c | 10 ++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/gcc/cgraphclones.c b/gcc/cgraphclones.c index ac5c57a47aa..8e86e82a226 100644 --- a/gcc/cgraphclones.c +++ b/gcc/cgraphclones.c @@ -80,6 +80,11 @@ along with GCC; see the file COPYING3. If not see #include "tree-inline.h" #include "dumpfile.h" #include "gimple-pretty-print.h" +#include "alloc-pool.h" +#include "symbol-summary.h" +#include "tree-vrp.h" +#include "ipa-prop.h" +#include "ipa-fnsummary.h" /* Create clone of edge in the node N represented by CALL_EXPR the callgraph. */ @@ -267,6 +272,8 @@ cgraph_node::expand_all_artificial_thunks () { thunk->thunk.thunk_p = false; thunk->analyze (); + ipa_analyze_node (thunk); + inline_analyze_function (thunk); } thunk->expand_all_artificial_thunks (); } diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c index 31a98a3d98a..7fb9f30f709 100644 --- a/gcc/ipa-cp.c +++ b/gcc/ipa-cp.c @@ -1165,7 +1165,7 @@ set_single_call_flag (cgraph_node *node, void *) /* Local thunks can be handled transparently, skip them. */ while (cs && cs->caller->thunk.thunk_p && cs->caller->local) cs = cs->next_caller; - if (cs) + if (cs && IPA_NODE_REF (cs->caller)) { IPA_NODE_REF (cs->caller)->node_calling_single_call = true; return true; @@ -4411,7 +4411,7 @@ find_more_scalar_values_for_callers_subset (struct cgraph_node *node, struct ipa_jump_func *jump_func; tree t; - if (IPA_NODE_REF (cs->caller)->node_dead) + if (IPA_NODE_REF (cs->caller) && IPA_NODE_REF (cs->caller)->node_dead) continue; if (!IPA_EDGE_REF (cs) @@ -5416,6 +5416,9 @@ ipcp_store_bits_results (void) if (info->ipcp_orig_node) info = IPA_NODE_REF (info->ipcp_orig_node); + if (!info->lattices) + /* Newly expanded artificial thunks do not have lattices. */ + continue; unsigned count = ipa_get_param_count (info); for (unsigned i = 0; i < count; i++) @@ -5489,6 +5492,9 @@ ipcp_store_vr_results (void) if (info->ipcp_orig_node) info = IPA_NODE_REF (info->ipcp_orig_node); + if (!info->lattices) + /* Newly expanded artificial thunks do not have lattices. */ + continue; unsigned count = ipa_get_param_count (info); for (unsigned i = 0; i < count; i++) -- 2.24.0