re PR middle-end/56461 (GCC is leaking lots of memory)
authorJakub Jelinek <jakub@redhat.com>
Wed, 27 Feb 2013 14:01:08 +0000 (15:01 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 27 Feb 2013 14:01:08 +0000 (15:01 +0100)
PR middle-end/56461
* tree-flow.h (edge_var_map_vector): Change into va_heap, vl_embed
vector.
* tree-ssa.c (redirect_edge_var_map_add): Use vec_safe_reserve and
vec_safe_push, always update *slot.
(redirect_edge_var_map_clear): Use vec_free.
(redirect_edge_var_map_dup): Use vec_safe_copy and vec_safe_reserve.
(free_var_map_entry): Use vec_free.
* tree-cfgcleanup.c (remove_forwarder_block_with_phi): Use
FOR_EACH_VEC_SAFE_ELT instead of FOR_EACH_VEC_ELT.

From-SVN: r196313

gcc/ChangeLog
gcc/tree-cfgcleanup.c
gcc/tree-flow.h
gcc/tree-ssa.c

index 61ea5212119f5692da4eded339414e6951ee2f61..51a19f56aaa81c03ad2003af350975105c88fb5c 100644 (file)
@@ -1,10 +1,21 @@
+2013-02-27  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/56461
+       * tree-flow.h (edge_var_map_vector): Change into va_heap, vl_embed
+       vector.
+       * tree-ssa.c (redirect_edge_var_map_add): Use vec_safe_reserve and
+       vec_safe_push, always update *slot.
+       (redirect_edge_var_map_clear): Use vec_free.
+       (redirect_edge_var_map_dup): Use vec_safe_copy and vec_safe_reserve.
+       (free_var_map_entry): Use vec_free.
+       * tree-cfgcleanup.c (remove_forwarder_block_with_phi): Use
+       FOR_EACH_VEC_SAFE_ELT instead of FOR_EACH_VEC_ELT.
+
 2013-02-27  Andrey Belevantsev  <abel@ispras.ru>
 
        PR middle-end/45472
-       
        * sel-sched-ir.c (merge_expr): Also change vinsn of merged expr
        when the may_trap_p bit of the exprs being merged differs.
-
        Reorder tests for speculativeness in the logical and operator.
 
 2013-02-27  Jakub Jelinek  <jakub@redhat.com>
index 94e616b7cf68a112149b94515110a3ede0a0d507..064d994ad3da27ee72b03e39363d98b68c7b7495 100644 (file)
@@ -822,7 +822,7 @@ remove_forwarder_block_with_phi (basic_block bb)
                 redirection, replace it with the PHI argument that used
                 to be on E.  */
              head = redirect_edge_var_map_vector (e);
-             FOR_EACH_VEC_ELT (*head, i, vm)
+             FOR_EACH_VEC_SAFE_ELT (head, i, vm)
                {
                  tree old_arg = redirect_edge_var_map_result (vm);
                  tree new_arg = redirect_edge_var_map_def (vm);
index 80cb2945dcedf1eb057e5c9f6cb3a3525fe07e8a..20584b8c60faf75bc970776c3c91de90e99f485f 100644 (file)
@@ -481,7 +481,7 @@ typedef struct _edge_var_map edge_var_map;
 
 
 /* A vector of var maps.  */
-typedef vec<edge_var_map> edge_var_map_vector;
+typedef vec<edge_var_map, va_heap, vl_embed> edge_var_map_vector;
 
 extern void init_tree_ssa (struct function *);
 extern void redirect_edge_var_map_add (edge, tree, tree, source_location);
index e08bcf89970be10b9b8be5ca821f5885dbe40064..b0619faefd5bfb910d8257d7ca71f481c1f5372d 100644 (file)
@@ -59,16 +59,13 @@ redirect_edge_var_map_add (edge e, tree result, tree def, source_location locus)
   slot = pointer_map_insert (edge_var_maps, e);
   head = (edge_var_map_vector *) *slot;
   if (!head)
-    {
-      head = new edge_var_map_vector;
-      head->create (5);
-      *slot = head;
-    }
+    vec_safe_reserve (head, 5);
   new_node.def = def;
   new_node.result = result;
   new_node.locus = locus;
 
-  head->safe_push (new_node);
+  vec_safe_push (head, new_node);
+  *slot = head;
 }
 
 
@@ -88,7 +85,7 @@ redirect_edge_var_map_clear (edge e)
   if (slot)
     {
       head = (edge_var_map_vector *) *slot;
-      delete head;
+      vec_free (head);
       *slot = NULL;
     }
 }
@@ -115,11 +112,11 @@ redirect_edge_var_map_dup (edge newe, edge olde)
     return;
   head = (edge_var_map_vector *) *old_slot;
 
-  edge_var_map_vector *new_head = new edge_var_map_vector;
+  edge_var_map_vector *new_head = NULL;
   if (head)
-    *new_head = head->copy ();
+    new_head = vec_safe_copy (head);
   else
-    new_head->create (5);
+    vec_safe_reserve (new_head, 5);
   *new_slot = new_head;
 }
 
@@ -151,7 +148,7 @@ free_var_map_entry (const void *key ATTRIBUTE_UNUSED,
                    void *data ATTRIBUTE_UNUSED)
 {
   edge_var_map_vector *head = (edge_var_map_vector *) *value;
-  delete head;
+  vec_free (head);
   return true;
 }