Fix some memory leaks

Message ID 20250110152012.DB07213763@imap1.dmz-prg2.suse.org
State New
Headers
Series Fix some memory leaks |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_gcc_build--master-arm fail Patch failed to apply
linaro-tcwg-bot/tcwg_gcc_build--master-aarch64 fail Patch failed to apply

Commit Message

Richard Biener Jan. 10, 2025, 3:20 p.m. UTC
  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(-)
  

Patch

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);