On Thu, Oct 14, 2021 at 9:00 AM Richard Sandiford <richard.sandif...@arm.com> wrote: > > rs6000_density_test has an early exit test between a call > to get_loop_body and the corresponding free. This would > lead to a memory leak if the early exit is taken. > > Tested on powerpc64le-linux-gnu. It's obvious that moving the > test avoids the leak, but there are multiple ways to write it, > so: OK to install?
Thanks for noticing this and creating a patch. This is okay. Thanks, David > > Richard > > > gcc/ > * config/rs6000/rs6000.c (rs6000_density_test): Move early > exit test further up the function. > --- > gcc/config/rs6000/rs6000.c | 17 ++++++++--------- > 1 file changed, 8 insertions(+), 9 deletions(-) > > diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c > index acba4d9f26c..01a95591a5d 100644 > --- a/gcc/config/rs6000/rs6000.c > +++ b/gcc/config/rs6000/rs6000.c > @@ -5289,20 +5289,19 @@ struct rs6000_cost_data > static void > rs6000_density_test (rs6000_cost_data *data) > { > - struct loop *loop = data->loop_info; > - basic_block *bbs = get_loop_body (loop); > - int nbbs = loop->num_nodes; > - loop_vec_info loop_vinfo = loop_vec_info_for_loop (data->loop_info); > - int vec_cost = data->cost[vect_body], not_vec_cost = 0; > - int i, density_pct; > - > /* This density test only cares about the cost of vector version of the > loop, so immediately return if we are passed costing for the scalar > version (namely computing single scalar iteration cost). */ > if (data->costing_for_scalar) > return; > > - for (i = 0; i < nbbs; i++) > + struct loop *loop = data->loop_info; > + basic_block *bbs = get_loop_body (loop); > + int nbbs = loop->num_nodes; > + loop_vec_info loop_vinfo = loop_vec_info_for_loop (data->loop_info); > + int vec_cost = data->cost[vect_body], not_vec_cost = 0; > + > + for (int i = 0; i < nbbs; i++) > { > basic_block bb = bbs[i]; > gimple_stmt_iterator gsi; > @@ -5322,7 +5321,7 @@ rs6000_density_test (rs6000_cost_data *data) > } > > free (bbs); > - density_pct = (vec_cost * 100) / (vec_cost + not_vec_cost); > + int density_pct = (vec_cost * 100) / (vec_cost + not_vec_cost); > > if (density_pct > rs6000_density_pct_threshold > && vec_cost + not_vec_cost > rs6000_density_size_threshold)