On Wed, Feb 10, 2021 at 12:44 PM Martin Liška <mli...@suse.cz> wrote: > > This one fixes 2 more memory leaks. > > Patch can bootstrap on x86_64-linux-gnu and survives regression tests. > I also tested that building postgresql with valgrind does not display > anything related to the affected files. > > Ready to be installed?
OK. Thanks. Richard. > Thanks, > Martin > > gcc/ChangeLog: > > PR tree-optimization/99002 > PR tree-optimization/99026 > * gimple-if-to-switch.cc (if_chain::is_beneficial): Fix memory > leak when adjacent cases are merged. > * tree-switch-conversion.c > (switch_decision_tree::analyze_switch_statement): Use > release_clusters. > (make_pass_lower_switch): Remove trailing whitespace. > * tree-switch-conversion.h (release_clusters): New. > --- > gcc/gimple-if-to-switch.cc | 17 +++++++++-------- > gcc/tree-switch-conversion.c | 9 +-------- > gcc/tree-switch-conversion.h | 10 ++++++++++ > 3 files changed, 20 insertions(+), 16 deletions(-) > > diff --git a/gcc/gimple-if-to-switch.cc b/gcc/gimple-if-to-switch.cc > index f39662be3e6..16fabef7ca0 100644 > --- a/gcc/gimple-if-to-switch.cc > +++ b/gcc/gimple-if-to-switch.cc > @@ -227,6 +227,7 @@ if_chain::is_beneficial () > (left->get_high ()), wi::one (TYPE_PRECISION (type)))) > { > left->set_high (right->get_high ()); > + delete right; > continue; > } > } > @@ -241,20 +242,20 @@ if_chain::is_beneficial () > = jump_table_cluster::find_jump_tables (filtered_clusters); > bool r = output.length () < filtered_clusters.length (); > if (r) > - dump_clusters (&output, "JT can be built"); > - output.release (); > - if (r) > - return true; > + { > + dump_clusters (&output, "JT can be built"); > + release_clusters (output); > + return true; > + } > + else > + output.release (); > > output = bit_test_cluster::find_bit_tests (filtered_clusters); > r = output.length () < filtered_clusters.length (); > if (r) > dump_clusters (&output, "BT can be built"); > > - for (unsigned i = 0; i < output.length (); i++) > - delete output[i]; > - > - output.release (); > + release_clusters (output); > return r; > } > > diff --git a/gcc/tree-switch-conversion.c b/gcc/tree-switch-conversion.c > index a4798812dbf..7f65c4ce839 100644 > --- a/gcc/tree-switch-conversion.c > +++ b/gcc/tree-switch-conversion.c > @@ -1824,12 +1824,7 @@ switch_decision_tree::analyze_switch_statement () > output.release (); > > bool expanded = try_switch_expansion (output2); > - > - for (unsigned i = 0; i < output2.length (); i++) > - delete output2[i]; > - > - output2.release (); > - > + release_clusters (output2); > return expanded; > } > > @@ -2597,5 +2592,3 @@ make_pass_lower_switch (gcc::context *ctxt) > { > return new pass_lower_switch<false> (ctxt); > } > - > - > diff --git a/gcc/tree-switch-conversion.h b/gcc/tree-switch-conversion.h > index d3d568e84cc..d76f19b57f6 100644 > --- a/gcc/tree-switch-conversion.h > +++ b/gcc/tree-switch-conversion.h > @@ -893,6 +893,16 @@ switch_decision_tree::reset_out_edges_aux (gswitch > *swtch) > e->aux = (void *) 0; > } > > +/* Release CLUSTERS vector and destruct all dynamically allocated items. */ > + > +static inline void > +release_clusters (vec<cluster *> &clusters) > +{ > + for (unsigned i = 0; i < clusters.length (); i++) > + delete clusters[i]; > + clusters.release (); > +} > + > } // tree_switch_conversion namespace > > #endif // TREE_SWITCH_CONVERSION_H > -- > 2.30.0 >