On Mon, 23 Nov 2020, Jan Hubicka wrote:

> Hi,
> tree-streamer-in currently calls init_tree_ssa that calls init_ssanames
> that allocates space in ssa_names array for 50 names.  Later it streams
> in the count and calls init_tree_ssa again, this time with correct
> count, which is rounded up to 50 and allocated again leaking the first
> array.
> 
> This patch fixes it by adding extra argument to init_tree_ssa specifing
> whether ssa names should be initialized.  There are few places where we
> initialize ssa and only lto streaming is special, so i think extra arg
> works well here.
> 
> I am not quite sure about the 50MB default.  I think it was made before
> ggc_free was implemented (so resizing vectors was expensive) and when we
> had only one function in SSA form at a time.  Most of functions in C++
> will probably need fewer than 50 SSA names until inlining.
> 
> This saves 21MB of WPA linking libxul.

Why do we input SSA names at WPA?

> Bootstrapping/regtesting x86_64-linux, OK if it suceeds?

I think calling init_ssanames again is bogus.  Please simply
do that in input_ssa_names after we know how many we need
adding a number of SSA names to reserve argument to init_tree_ssa
and passing that down instead.

Richard.

>       * tree-ssa.c (init_tree_ssa): Add argument INIT_SSANAMES_P.
>       * tree-ssa.h (init_tree_ssa): Update prototype.
>       * tree-ssanames.c (init_ssanames): Fix handling of explicit size.
>       * tree-streamer-in.c (init_function): Pass false to init_tree_ssa.
> diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c
> index b44361f8244..8b009d91830 100644
> --- a/gcc/tree-ssa.c
> +++ b/gcc/tree-ssa.c
> @@ -1218,15 +1218,18 @@ err:
>  #  pragma GCC diagnostic pop
>  #endif
>  
> -/* Initialize global DFA and SSA structures.  */
> +/* Initialize global DFA and SSA structures.
> +   If INIT_SSANAMES_P is false, do not initialize SSA names.  During LTO
> +   streaming we do that later once we know number of names.  */
>  
>  void
> -init_tree_ssa (struct function *fn)
> +init_tree_ssa (struct function *fn, bool init_ssanames_p)
>  {
>    fn->gimple_df = ggc_cleared_alloc<gimple_df> ();
>    fn->gimple_df->default_defs = hash_table<ssa_name_hasher>::create_ggc (20);
>    pt_solution_reset (&fn->gimple_df->escaped);
> -  init_ssanames (fn, 0);
> +  if (init_ssanames_p)
> +    init_ssanames (fn, 0);
>  }
>  
>  /* Deallocate memory associated with SSA data structures for FNDECL.  */
> diff --git a/gcc/tree-ssa.h b/gcc/tree-ssa.h
> index 79f2b13fd6a..9a4ff008300 100644
> --- a/gcc/tree-ssa.h
> +++ b/gcc/tree-ssa.h
> @@ -45,7 +45,7 @@ extern void insert_debug_temps_for_defs 
> (gimple_stmt_iterator *);
>  extern void reset_debug_uses (gimple *);
>  extern void release_defs_bitset (bitmap toremove);
>  extern void verify_ssa (bool, bool);
> -extern void init_tree_ssa (function *);
> +extern void init_tree_ssa (function *, bool init_ssanames = true);
>  extern void delete_tree_ssa (function *);
>  extern bool tree_ssa_useless_type_conversion (tree);
>  extern tree tree_ssa_strip_useless_type_conversions (tree);
> diff --git a/gcc/tree-ssanames.c b/gcc/tree-ssanames.c
> index 6ac97fe39c4..ec4681f85cb 100644
> --- a/gcc/tree-ssanames.c
> +++ b/gcc/tree-ssanames.c
> @@ -77,10 +77,10 @@ unsigned int ssa_name_nodes_created;
>  void
>  init_ssanames (struct function *fn, int size)
>  {
> -  if (size < 50)
> -    size = 50;
> -
> -  vec_alloc (SSANAMES (fn), size);
> +  if (!size)
> +    vec_alloc (SSANAMES (fn), 50);
> +  else
> +    vec_safe_reserve (SSANAMES (fn), size, true);
>  
>    /* Version 0 is special, so reserve the first slot in the table.  Though
>       currently unused, we may use version 0 in alias analysis as part of
> diff --git a/gcc/lto-streamer-in.c b/gcc/lto-streamer-in.c
> index 64037f74ad3..3150c489401 100644
> --- a/gcc/lto-streamer-in.c
> +++ b/gcc/lto-streamer-in.c
> @@ -1384,7 +1384,7 @@ input_function (tree fn_decl, class data_in *data_in,
>  
>    push_struct_function (fn_decl);
>    fn = DECL_STRUCT_FUNCTION (fn_decl);
> -  init_tree_ssa (fn);
> +  init_tree_ssa (fn, false);
>    /* We input IL in SSA form.  */
>    cfun->gimple_df->in_ssa_p = true;
>  
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
Germany; GF: Felix Imend

Reply via email to