diff options
Diffstat (limited to 'gcc/tree-ssa-dom.c')
-rw-r--r-- | gcc/tree-ssa-dom.c | 77 |
1 files changed, 33 insertions, 44 deletions
diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c index 7d015b7837c..0c2158c6e5e 100644 --- a/gcc/tree-ssa-dom.c +++ b/gcc/tree-ssa-dom.c @@ -75,8 +75,6 @@ typedef struct cond_equivalence_s tree value; } cond_equivalence; -DEF_VEC_O(cond_equivalence); -DEF_VEC_ALLOC_O(cond_equivalence,heap); /* Structure for recording edge equivalences as well as any pending edge redirections during the dominator optimizer. @@ -101,7 +99,7 @@ struct edge_info /* Traversing an edge may also indicate one or more particular conditions are true or false. */ - VEC(cond_equivalence, heap) *cond_equivalences; + vec<cond_equivalence> cond_equivalences; }; /* Hash table with expressions made available during the renaming process. @@ -119,10 +117,8 @@ static htab_t avail_exprs; remove the expressions from the global hash table until we hit the marker. */ typedef struct expr_hash_elt * expr_hash_elt_t; -DEF_VEC_P(expr_hash_elt_t); -DEF_VEC_ALLOC_P(expr_hash_elt_t,heap); -static VEC(expr_hash_elt_t,heap) *avail_exprs_stack; +static vec<expr_hash_elt_t> avail_exprs_stack; /* Structure for entries in the expression hash table. */ @@ -149,7 +145,7 @@ struct expr_hash_elt A NULL entry is used to mark the end of pairs which need to be restored during finalization of this block. */ -static VEC(tree,heap) *const_and_copies_stack; +static vec<tree> const_and_copies_stack; /* Track whether or not we have changed the control flow graph. */ static bool cfg_altered; @@ -705,8 +701,7 @@ free_all_edge_infos (void) if (edge_info) { - if (edge_info->cond_equivalences) - VEC_free (cond_equivalence, heap, edge_info->cond_equivalences); + edge_info->cond_equivalences.release (); free (edge_info); e->aux = NULL; } @@ -729,8 +724,8 @@ tree_ssa_dominator_optimize (void) /* Create our hash tables. */ avail_exprs = htab_create (1024, real_avail_expr_hash, avail_expr_eq, free_expr_hash_elt); - avail_exprs_stack = VEC_alloc (expr_hash_elt_t, heap, 20); - const_and_copies_stack = VEC_alloc (tree, heap, 20); + avail_exprs_stack.create (20); + const_and_copies_stack.create (20); need_eh_cleanup = BITMAP_ALLOC (NULL); /* Setup callbacks for the generic dominator tree walker. */ @@ -844,12 +839,12 @@ tree_ssa_dominator_optimize (void) /* Free asserted bitmaps and stacks. */ BITMAP_FREE (need_eh_cleanup); - VEC_free (expr_hash_elt_t, heap, avail_exprs_stack); - VEC_free (tree, heap, const_and_copies_stack); + avail_exprs_stack.release (); + const_and_copies_stack.release (); /* Free the value-handle array. */ threadedge_finalize_values (); - ssa_name_values = NULL; + ssa_name_values.release (); return 0; } @@ -938,9 +933,9 @@ static void remove_local_expressions_from_table (void) { /* Remove all the expressions made available in this block. */ - while (VEC_length (expr_hash_elt_t, avail_exprs_stack) > 0) + while (avail_exprs_stack.length () > 0) { - expr_hash_elt_t victim = VEC_pop (expr_hash_elt_t, avail_exprs_stack); + expr_hash_elt_t victim = avail_exprs_stack.pop (); void **slot; if (victim == NULL) @@ -969,11 +964,11 @@ remove_local_expressions_from_table (void) static void restore_vars_to_original_value (void) { - while (VEC_length (tree, const_and_copies_stack) > 0) + while (const_and_copies_stack.length () > 0) { tree prev_value, dest; - dest = VEC_pop (tree, const_and_copies_stack); + dest = const_and_copies_stack.pop (); if (dest == NULL) break; @@ -987,7 +982,7 @@ restore_vars_to_original_value (void) fprintf (dump_file, "\n"); } - prev_value = VEC_pop (tree, const_and_copies_stack); + prev_value = const_and_copies_stack.pop (); set_ssa_name_value (dest, prev_value); } } @@ -1141,8 +1136,7 @@ record_equivalences_from_incoming_edge (basic_block bb) if (lhs) record_equality (lhs, rhs); - for (i = 0; VEC_iterate (cond_equivalence, - edge_info->cond_equivalences, i, eq); ++i) + for (i = 0; edge_info->cond_equivalences.iterate (i, &eq); ++i) record_cond (eq); } } @@ -1210,7 +1204,7 @@ record_cond (cond_equivalence *p) print_expr_hash_elt (dump_file, element); } - VEC_safe_push (expr_hash_elt_t, heap, avail_exprs_stack, element); + avail_exprs_stack.safe_push (element); } else free_expr_hash_elt (element); @@ -1222,7 +1216,7 @@ record_cond (cond_equivalence *p) static void build_and_record_new_cond (enum tree_code code, tree op0, tree op1, - VEC(cond_equivalence, heap) **p) + vec<cond_equivalence> *p) { cond_equivalence c; struct hashable_expr *cond = &c.cond; @@ -1236,7 +1230,7 @@ build_and_record_new_cond (enum tree_code code, cond->ops.binary.opnd1 = op1; c.value = boolean_true_node; - VEC_safe_push (cond_equivalence, heap, *p, c); + p->safe_push (c); } /* Record that COND is true and INVERTED is false into the edge information @@ -1343,7 +1337,7 @@ record_conditions (struct edge_info *edge_info, tree cond, tree inverted) two slots. */ initialize_expr_from_cond (cond, &c.cond); c.value = boolean_true_node; - VEC_safe_push (cond_equivalence, heap, edge_info->cond_equivalences, c); + edge_info->cond_equivalences.safe_push (c); /* It is possible for INVERTED to be the negation of a comparison, and not a valid RHS or GIMPLE_COND condition. This happens because @@ -1352,7 +1346,7 @@ record_conditions (struct edge_info *edge_info, tree cond, tree inverted) obey the trichotomy law. */ initialize_expr_from_cond (inverted, &c.cond); c.value = boolean_false_node; - VEC_safe_push (cond_equivalence, heap, edge_info->cond_equivalences, c); + edge_info->cond_equivalences.safe_push (c); } /* A helper function for record_const_or_copy and record_equality. @@ -1372,9 +1366,9 @@ record_const_or_copy_1 (tree x, tree y, tree prev_x) fprintf (dump_file, "\n"); } - VEC_reserve (tree, heap, const_and_copies_stack, 2); - VEC_quick_push (tree, const_and_copies_stack, prev_x); - VEC_quick_push (tree, const_and_copies_stack, x); + const_and_copies_stack.reserve (2); + const_and_copies_stack.quick_push (prev_x); + const_and_copies_stack.quick_push (x); } /* Return the loop depth of the basic block of the defining statement of X. @@ -1744,9 +1738,8 @@ dom_opt_enter_block (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED, /* Push a marker on the stacks of local information so that we know how far to unwind when we finalize this block. */ - VEC_safe_push (expr_hash_elt_t, heap, avail_exprs_stack, - (expr_hash_elt_t)NULL); - VEC_safe_push (tree, heap, const_and_copies_stack, NULL_TREE); + avail_exprs_stack.safe_push (NULL); + const_and_copies_stack.safe_push (NULL_TREE); record_equivalences_from_incoming_edge (bb); @@ -1756,8 +1749,7 @@ dom_opt_enter_block (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED, /* Create equivalences from redundant PHIs. PHIs are only truly redundant when they exist in the same block, so push another marker and unwind right afterwards. */ - VEC_safe_push (expr_hash_elt_t, heap, avail_exprs_stack, - (expr_hash_elt_t)NULL); + avail_exprs_stack.safe_push (NULL); for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi)) eliminate_redundant_computations (&gsi); remove_local_expressions_from_table (); @@ -1789,7 +1781,7 @@ dom_opt_leave_block (struct dom_walk_data *walk_data, basic_block bb) { /* Push a marker on the stack, which thread_across_edge expects and will remove. */ - VEC_safe_push (tree, heap, const_and_copies_stack, NULL_TREE); + const_and_copies_stack.safe_push (NULL_TREE); dom_thread_across_edge (walk_data, single_succ_edge (bb)); } else if ((last = last_stmt (bb)) @@ -1812,9 +1804,8 @@ dom_opt_leave_block (struct dom_walk_data *walk_data, basic_block bb) /* Push a marker onto the available expression stack so that we unwind any expressions related to the TRUE arm before processing the false arm below. */ - VEC_safe_push (expr_hash_elt_t, heap, avail_exprs_stack, - (expr_hash_elt_t)NULL); - VEC_safe_push (tree, heap, const_and_copies_stack, NULL_TREE); + avail_exprs_stack.safe_push (NULL); + const_and_copies_stack.safe_push (NULL_TREE); edge_info = (struct edge_info *) true_edge->aux; @@ -1832,8 +1823,7 @@ dom_opt_leave_block (struct dom_walk_data *walk_data, basic_block bb) /* If we have 0 = COND or 1 = COND equivalences, record them into our expression hash tables. */ - for (i = 0; VEC_iterate (cond_equivalence, - edge_info->cond_equivalences, i, eq); ++i) + for (i = 0; edge_info->cond_equivalences.iterate (i, &eq); ++i) record_cond (eq); } @@ -1850,7 +1840,7 @@ dom_opt_leave_block (struct dom_walk_data *walk_data, basic_block bb) struct edge_info *edge_info; unsigned int i; - VEC_safe_push (tree, heap, const_and_copies_stack, NULL_TREE); + const_and_copies_stack.safe_push (NULL_TREE); edge_info = (struct edge_info *) false_edge->aux; /* If we have info associated with this edge, record it into @@ -1867,8 +1857,7 @@ dom_opt_leave_block (struct dom_walk_data *walk_data, basic_block bb) /* If we have 0 = COND or 1 = COND equivalences, record them into our expression hash tables. */ - for (i = 0; VEC_iterate (cond_equivalence, - edge_info->cond_equivalences, i, eq); ++i) + for (i = 0; edge_info->cond_equivalences.iterate (i, &eq); ++i) record_cond (eq); } @@ -2431,7 +2420,7 @@ lookup_avail_expr (gimple stmt, bool insert) print_expr_hash_elt (dump_file, element2); } - VEC_safe_push (expr_hash_elt_t, heap, avail_exprs_stack, element2); + avail_exprs_stack.safe_push (element2); return NULL_TREE; } else |