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

Reply via email to