diff options
author | Jakub Jelinek <jakub@redhat.com> | 2013-02-27 15:01:08 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2013-02-27 15:01:08 +0100 |
commit | 6fa5e0ed90b7c720526aaf00987828b50165d19a (patch) | |
tree | f2b0dbceeb47d6576b17174120930c4e096ff48e /gcc/tree-ssa.c | |
parent | d809887a669e7c2c709d1ca37d2f0e44ecfdb341 (diff) | |
download | gcc-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.c | 19 |
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; } |