The following fixes memory leaks found compiling SPEC CPU 2017 with
valgrind.
Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.
* df-core.cc (rest_of_handle_df_finish): Release dflow for
problems without free function (like LR).
* gimple-crc-optimization.cc (crc_optimization::loop_may_calculate_crc):
Release loop_bbs on all exits.
* tree-vectorizer.h (supportable_indirect_convert_operation): Change.
* tree-vect-generic.cc (expand_vector_conversion): Adjust.
* tree-vect-stmts.cc (vectorizable_conversion): Use auto_vec for
converts.
(supportable_indirect_convert_operation): Get a reference to
the output vector of converts.
---
gcc/df-core.cc | 2 ++
gcc/gimple-crc-optimization.cc | 6 +++++-
gcc/tree-vect-generic.cc | 2 +-
gcc/tree-vect-stmts.cc | 12 ++++++------
gcc/tree-vectorizer.h | 2 +-
5 files changed, 15 insertions(+), 9 deletions(-)
diff --git a/gcc/df-core.cc b/gcc/df-core.cc
index a7011decf0b..abfc0e63d35 100644
--- a/gcc/df-core.cc
+++ b/gcc/df-core.cc
@@ -808,6 +808,8 @@ rest_of_handle_df_finish (void)
struct dataflow *dflow = df->problems_in_order[i];
if (dflow->problem->free_fun)
dflow->problem->free_fun ();
+ else
+ free (dflow);
}
free (df->postorder);
diff --git a/gcc/gimple-crc-optimization.cc b/gcc/gimple-crc-optimization.cc
index 0e1f2a99d72..a98cbe6752b 100644
--- a/gcc/gimple-crc-optimization.cc
+++ b/gcc/gimple-crc-optimization.cc
@@ -947,6 +947,7 @@ crc_optimization::loop_may_calculate_crc (class loop *loop)
fprintf (dump_file,
"The number of conditional "
"branches in the loop isn't 2.\n");
+ free (loop_bbs);
return false;
}
@@ -977,8 +978,11 @@ crc_optimization::loop_may_calculate_crc (class loop *loop)
return true;
}
- if (++checked_xor_count == 2)
+ if (++checked_xor_count == 2)
+ {
+ free (loop_bbs);
return false;
+ }
}
}
}
diff --git a/gcc/tree-vect-generic.cc b/gcc/tree-vect-generic.cc
index fa5e9a54dbf..c2f7a29d539 100644
--- a/gcc/tree-vect-generic.cc
+++ b/gcc/tree-vect-generic.cc
@@ -1757,7 +1757,7 @@ expand_vector_conversion (gimple_stmt_iterator *gsi)
auto_vec<std::pair<tree, tree_code> > converts;
if (supportable_indirect_convert_operation (code,
ret_type, arg_type,
- &converts,
+ converts,
arg))
{
new_rhs = arg;
diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
index c0e38d00246..f5b3608f6b1 100644
--- a/gcc/tree-vect-stmts.cc
+++ b/gcc/tree-vect-stmts.cc
@@ -5583,7 +5583,7 @@ vectorizable_conversion (vec_info *vinfo,
scalar_mode lhs_mode = SCALAR_TYPE_MODE (lhs_type);
scalar_mode rhs_mode = SCALAR_TYPE_MODE (rhs_type);
opt_scalar_mode rhs_mode_iter;
- vec<std::pair<tree, tree_code> > converts = vNULL;
+ auto_vec<std::pair<tree, tree_code> > converts;
/* Supportable by target? */
switch (modifier)
@@ -5597,7 +5597,7 @@ vectorizable_conversion (vec_info *vinfo,
if (supportable_indirect_convert_operation (code,
vectype_out,
vectype_in,
- &converts,
+ converts,
op0))
{
gcc_assert (converts.length () <= 2);
@@ -15170,7 +15170,7 @@ bool
supportable_indirect_convert_operation (code_helper code,
tree vectype_out,
tree vectype_in,
- vec<std::pair<tree, tree_code> >
*converts,
+ vec<std::pair<tree, tree_code> >
&converts,
tree op0)
{
bool found_mode = false;
@@ -15187,7 +15187,7 @@ supportable_indirect_convert_operation (code_helper
code,
vectype_in,
&tc1))
{
- converts->safe_push (std::make_pair (vectype_out, tc1));
+ converts.safe_push (std::make_pair (vectype_out, tc1));
return true;
}
@@ -15278,9 +15278,9 @@ supportable_indirect_convert_operation (code_helper
code,
if (found_mode)
{
- converts->safe_push (std::make_pair (cvt_type, tc2));
+ converts.safe_push (std::make_pair (cvt_type, tc2));
if (TYPE_MODE (cvt_type) != TYPE_MODE (vectype_out))
- converts->safe_push (std::make_pair (vectype_out, tc1));
+ converts.safe_push (std::make_pair (vectype_out, tc1));
return true;
}
}
diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h
index d3e0ada4282..135eb119ca2 100644
--- a/gcc/tree-vectorizer.h
+++ b/gcc/tree-vectorizer.h
@@ -2338,7 +2338,7 @@ extern bool supportable_narrowing_operation (code_helper,
tree, tree,
vec<tree> *);
extern bool supportable_indirect_convert_operation (code_helper,
tree, tree,
- vec<std::pair<tree,
tree_code> > *,
+ vec<std::pair<tree,
tree_code> > &,
tree = NULL_TREE);
extern int compare_step_with_zero (vec_info *, stmt_vec_info);
--
2.43.0