aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2013-02-27 15:01:08 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2013-02-27 15:01:08 +0100
commit6fa5e0ed90b7c720526aaf00987828b50165d19a (patch)
treef2b0dbceeb47d6576b17174120930c4e096ff48e /gcc/tree-ssa.c
parentd809887a669e7c2c709d1ca37d2f0e44ecfdb341 (diff)
downloadgcc-6fa5e0ed90b7c720526aaf00987828b50165d19a.zip
gcc-6fa5e0ed90b7c720526aaf00987828b50165d19a.tar.gz
gcc-6fa5e0ed90b7c720526aaf00987828b50165d19a.tar.bz2
re PR middle-end/56461 (GCC is leaking lots of memory)
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
Diffstat (limited to 'gcc/tree-ssa.c')
-rw-r--r--gcc/tree-ssa.c19
1 files changed, 8 insertions, 11 deletions
diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c
index e08bcf8..b0619fa 100644
--- a/gcc/tree-ssa.c
+++ b/gcc/tree-ssa.c
@@ -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;
}