IPA ICF: fix memory leak.
authorMartin Liska <mliska@suse.cz>
Thu, 27 Nov 2014 15:36:10 +0000 (16:36 +0100)
committerMartin Liska <marxin@gcc.gnu.org>
Thu, 27 Nov 2014 15:36:10 +0000 (15:36 +0000)
* ipa-icf.c (sem_function::equals_private): int* is replaced with
auto_vec.
(sem_function::bb_dict_test): Likewise.
* ipa-icf.h: Likewise.

Co-Authored-By: David Malcolm <dmalcolm@redhat.com>
From-SVN: r218129

gcc/ChangeLog
gcc/ipa-icf.c
gcc/ipa-icf.h

index dad0704a4e24f21a869d9eb54da549e5b87a3ccc..262cc7482fdd72c11b5b040c55598395c3ffee24 100644 (file)
@@ -1,3 +1,11 @@
+2014-11-27  Martin Liska  <mliska@suse.cz>
+           David Malcolm  <dmalcolm@redhat.com>
+
+       * ipa-icf.c (sem_function::equals_private): int* is replaced with
+       auto_vec.
+       (sem_function::bb_dict_test): Likewise.
+       * ipa-icf.h: Likewise.
+
 2014-11-27  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/64088
index e0633e762f21a74fdb3597c7889d015c13b44b29..b1932008f655f72aa81b54d0cb82fb86a4e81970 100644 (file)
@@ -410,7 +410,6 @@ sem_function::equals_private (sem_item *item,
   basic_block bb1, bb2;
   edge e1, e2;
   edge_iterator ei1, ei2;
-  int *bb_dict = NULL;
   bool result = true;
   tree arg1, arg2;
 
@@ -486,12 +485,11 @@ sem_function::equals_private (sem_item *item,
 
   dump_message ("All BBs are equal\n");
 
+  auto_vec <int> bb_dict;
+
   /* Basic block edges check.  */
   for (unsigned i = 0; i < bb_sorted.length (); ++i)
     {
-      bb_dict = XNEWVEC (int, bb_sorted.length () + 2);
-      memset (bb_dict, -1, (bb_sorted.length () + 2) * sizeof (int));
-
       bb1 = bb_sorted[i]->bb;
       bb2 = m_compared_func->bb_sorted[i]->bb;
 
@@ -957,9 +955,15 @@ sem_function::icf_handled_component_p (tree t)
    corresponds to TARGET.  */
 
 bool
-sem_function::bb_dict_test (int* bb_dict, int source, int target)
+sem_function::bb_dict_test (auto_vec<int> bb_dict, int source, int target)
 {
-  if (bb_dict[source] == -1)
+  source++;
+  target++;
+
+  if (bb_dict.length () <= (unsigned)source)
+    bb_dict.safe_grow_cleared (source + 1);
+
+  if (bb_dict[source] == 0)
     {
       bb_dict[source] = target;
       return true;
index 046e858c6a8afa89f6dbf47ae0144e2837bbf44a..8be61494bb9927f7e5e79384f822344bea49dcbc 100644 (file)
@@ -275,7 +275,7 @@ private:
 
   /* Basic blocks dictionary BB_DICT returns true if SOURCE index BB
      corresponds to TARGET.  */
-  bool bb_dict_test (int* bb_dict, int source, int target);
+  bool bb_dict_test (auto_vec<int> bb_dict, int source, int target);
 
   /* Iterates all tree types in T1 and T2 and returns true if all types
      are compatible. If COMPARE_POLYMORPHIC is set to true,