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
>

Reply via email to