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
This commit is contained in:
parent
d809887a66
commit
6fa5e0ed90
4 changed files with 23 additions and 15 deletions
|
@ -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>
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue