Hi, On Sat, Jul 25 2020, Sergei Trofimovich wrote: > From: Sergei Trofimovich <siarh...@google.com> > > In PR ipa/96291 the test contained an SCC with one > unoptimized function. This tricked ipa-cp into NULL dereference. > > has_undead_caller_from_outside_scc_p() did not take into account > that unoptimized funtions don't have IPA summary analysis. and > dereferenced NULL pointer causing an ICE. > > PR ipa/96291 > * ipa-cp.c (has_undead_caller_from_outside_scc_p): Consider > unoptimized callers as undead. > --- > gcc/ipa-cp.c | 12 +++++++++--- > 1 file changed, 9 insertions(+), 3 deletions(-) > > diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c > index b0c8f405260..d5082576962 100644 > --- a/gcc/ipa-cp.c > +++ b/gcc/ipa-cp.c > @@ -5666,9 +5666,15 @@ has_undead_caller_from_outside_scc_p (struct > cgraph_node *node, > && cs->caller->call_for_symbol_thunks_and_aliases > (has_undead_caller_from_outside_scc_p, NULL, true)) > return true; > - else if (!ipa_edge_within_scc (cs) > - && !IPA_NODE_REF (cs->caller)->node_dead) > - return true; > + else if (!ipa_edge_within_scc (cs)) > + { > + /* Unoptimized callers don't have IPA information. > + Conservatively assume callers are undead. */ > + if (!IPA_NODE_REF (cs->caller)) > + return true; > + if (!IPA_NODE_REF (cs->caller)->node_dead) > + return true;
I'd prefer a single condition, i.e.: else if (!ipa_edge_within_scc (cs) && (!IPA_NODE_REF (cs->caller) || !IPA_NODE_REF (cs->caller)->node_dead)) return true; so OK with that change. Thanks a lot for looking into this. Martin