diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 61ea5212119..51a19f56aaa 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,10 +1,21 @@ +2013-02-27 Jakub Jelinek + + 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 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 diff --git a/gcc/tree-cfgcleanup.c b/gcc/tree-cfgcleanup.c index 94e616b7cf6..064d994ad3d 100644 --- a/gcc/tree-cfgcleanup.c +++ b/gcc/tree-cfgcleanup.c @@ -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); diff --git a/gcc/tree-flow.h b/gcc/tree-flow.h index 80cb2945dce..20584b8c60f 100644 --- a/gcc/tree-flow.h +++ b/gcc/tree-flow.h @@ -481,7 +481,7 @@ typedef struct _edge_var_map edge_var_map; /* A vector of var maps. */ -typedef vec edge_var_map_vector; +typedef vec edge_var_map_vector; extern void init_tree_ssa (struct function *); extern void redirect_edge_var_map_add (edge, tree, tree, source_location); diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c index e08bcf89970..b0619faefd5 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; }