[PATCH] ipa-cp: Avoid ICEs when looking at expanded thunks and unoptimized functions (PR 92476)

Jan Hubicka hubicka@ucw.cz
Fri Nov 29 10:33:00 GMT 2019


> 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.
I think you can simply add different flag into different testcases:
20090210_1.c:/* { dg-options "-fPIC" { target { ! sparc*-*-* } } } */
20090218-1_1.c:/* { dg-options "-fgnu89-inline" } */
20090218-2_1.c:/* { dg-options { -fgnu89-inline } } */
20111207-1_1.c:/* { dg-options "-fno-lto" } */

> 
> 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  <mjambor@suse.cz>
>             Jan Hubicka  <jh@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.

OK, thanks
Honza
> ---
>  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
> 



More information about the Gcc-patches mailing list