]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fix some memory leaks
authorRichard Biener <rguenther@suse.de>
Fri, 10 Jan 2025 14:17:58 +0000 (15:17 +0100)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 10 Jan 2025 15:46:42 +0000 (16:46 +0100)
The following fixes memory leaks found compiling SPEC CPU 2017 with
valgrind.

* 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
gcc/gimple-crc-optimization.cc
gcc/tree-vect-generic.cc
gcc/tree-vect-stmts.cc
gcc/tree-vectorizer.h

index a7011decf0bb2cd95928ea6a092f162acf7f8427..abfc0e63d352cecf6d290c9ce038490a3ec2d08c 100644 (file)
@@ -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);
index 0e1f2a99d72b252360e6d21bed03212d2c8fd606..a98cbe6752b56f104bd8717e2498a0dc4c1eb5f3 100644 (file)
@@ -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;
+               }
            }
        }
     }
index fa5e9a54dbf9a948a258f6ae04700798c6bf50a2..c2f7a29d539bdf67eac6e12757e55b7bcf4c35ae 100644 (file)
@@ -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;
index c0e38d00246d34b69263e6662617968775701a5c..f5b3608f6b13f1951703f6015b8b01ef966e6693 100644 (file)
@@ -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;
        }
     }
index d3e0ada4282e298920d94c33a563ca5df3a60177..135eb119ca2eaebbaf5d7fe54ea4bcb98a8552ef 100644 (file)
@@ -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);