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