From: Jan Hubicka Date: Mon, 23 Nov 2020 15:52:36 +0000 (+0100) Subject: Do not leak SSANAMES in lto streamer X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=54af3008b6f05985d378a48d337d9c70c708ecff;p=gcc.git Do not leak SSANAMES in lto streamer * lto-streamer-in.c (input_cfg): Do not init ssa operands. (input_function): Do not init tree_ssa and set in_ssa_p. (input_ssa_names): Do it here. * tree-ssa.c (init_tree_ssa): Add additional SIZE parameter, default to 0 * tree-ssanames.c (init_ssanames): Do not round size up to 50, allocate precisely. * tree-ssa.h (init_tree_ssa): Update prototype. --- diff --git a/gcc/lto-streamer-in.c b/gcc/lto-streamer-in.c index 64037f74ad3..a20d64b0089 100644 --- a/gcc/lto-streamer-in.c +++ b/gcc/lto-streamer-in.c @@ -1017,7 +1017,6 @@ input_cfg (class lto_input_block *ib, class data_in *data_in, int index; init_empty_tree_cfg_for_function (fn); - init_ssa_operands (fn); profile_status_for_fn (fn) = streamer_read_enum (ib, profile_status_d, PROFILE_LAST); @@ -1144,7 +1143,9 @@ input_ssa_names (class lto_input_block *ib, class data_in *data_in, unsigned int i, size; size = streamer_read_uhwi (ib); - init_ssanames (fn, size); + init_tree_ssa (fn, size); + cfun->gimple_df->in_ssa_p = true; + init_ssa_operands (fn); i = streamer_read_uhwi (ib); while (i) @@ -1384,9 +1385,6 @@ 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); - /* We input IL in SSA form. */ - cfun->gimple_df->in_ssa_p = true; gimple_register_cfg_hooks (); diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c index b44361f8244..a575979aa13 100644 --- a/gcc/tree-ssa.c +++ b/gcc/tree-ssa.c @@ -1218,15 +1218,16 @@ err: # pragma GCC diagnostic pop #endif -/* Initialize global DFA and SSA structures. */ +/* Initialize global DFA and SSA structures. + If SIZE is non-zero allocated ssa names array of a given size. */ void -init_tree_ssa (struct function *fn) +init_tree_ssa (struct function *fn, int size) { fn->gimple_df = ggc_cleared_alloc (); fn->gimple_df->default_defs = hash_table::create_ggc (20); pt_solution_reset (&fn->gimple_df->escaped); - init_ssanames (fn, 0); + init_ssanames (fn, size); } /* Deallocate memory associated with SSA data structures for FNDECL. */ diff --git a/gcc/tree-ssa.h b/gcc/tree-ssa.h index 79f2b13fd6a..7e7fa4a6e69 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 *, int size = 0); 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