diff mbox

merge auto_vec and stack_vec

Message ID 1387495114-6252-1-git-send-email-trev.saunders@gmail.com
State New
Headers show

Commit Message

Trevor Saunders Dec. 19, 2013, 11:18 p.m. UTC
As discussed in http://gcc.gnu.org/ml/gcc-patches/2013-11/msg02808.html

bootstrap + same regression tests as previous rev, ok?

2013-12-19  Trevor saunders  <tsaunders@mozilla.com>

gcc/
	* vec.h (stack_vec): Convert to a templaate specialization of
	auto_vec.
	* config/i386/i386.c, df-scan.c, function.c, genautomata.c,
	gimplify.c, graphite-clast-to-gimple.c, graphite-dependences.c,
	graphite-scop-detection.c, graphite-sese-to-poly.c, hw-doloop.c,
	trans-mem.c, tree-call-cdce.c, tree-data-ref.c, tree-dfa.c,
	tree-if-conv.c, tree-inline.c, tree-loop-distribution.c,
	tree-parloops.c, tree-predcom.c, tree-ssa-alias.c,
	tree-ssa-loop-ivcanon.c, tree-ssa-phiopt.c, tree-ssa-threadedge.c,
	tree-ssa-uncprop.c, tree-vect-loop.c, tree-vect-patterns.c,
	tree-vect-slp.c, tree-vect-stmts.c, var-tracking.c: Adjust.

cp/
	* semantics.c (build_anon_member_initialization): Replace
	stack_vec<T, N> with auto_vec<T, N>.

ada/
	* gcc-interface/decl.c (components_to_record): Replace stack_vec with
	auto_vec.

Trev

Comments

Richard Biener Dec. 20, 2013, 1:18 p.m. UTC | #1
On Fri, Dec 20, 2013 at 12:18 AM, Trevor Saunders
<trev.saunders@gmail.com> wrote:
> As discussed in http://gcc.gnu.org/ml/gcc-patches/2013-11/msg02808.html
>
> bootstrap + same regression tests as previous rev, ok?

Ok.

Thanks,
Richard.

> 2013-12-19  Trevor saunders  <tsaunders@mozilla.com>
>
> gcc/
>         * vec.h (stack_vec): Convert to a templaate specialization of
>         auto_vec.
>         * config/i386/i386.c, df-scan.c, function.c, genautomata.c,
>         gimplify.c, graphite-clast-to-gimple.c, graphite-dependences.c,
>         graphite-scop-detection.c, graphite-sese-to-poly.c, hw-doloop.c,
>         trans-mem.c, tree-call-cdce.c, tree-data-ref.c, tree-dfa.c,
>         tree-if-conv.c, tree-inline.c, tree-loop-distribution.c,
>         tree-parloops.c, tree-predcom.c, tree-ssa-alias.c,
>         tree-ssa-loop-ivcanon.c, tree-ssa-phiopt.c, tree-ssa-threadedge.c,
>         tree-ssa-uncprop.c, tree-vect-loop.c, tree-vect-patterns.c,
>         tree-vect-slp.c, tree-vect-stmts.c, var-tracking.c: Adjust.
>
> cp/
>         * semantics.c (build_anon_member_initialization): Replace
>         stack_vec<T, N> with auto_vec<T, N>.
>
> ada/
>         * gcc-interface/decl.c (components_to_record): Replace stack_vec with
>         auto_vec.
>
> Trev
>
>
> diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c
> index a80d1a9..ad129c6 100644
> --- a/gcc/ada/gcc-interface/decl.c
> +++ b/gcc/ada/gcc-interface/decl.c
> @@ -7010,7 +7010,7 @@ components_to_record (tree gnu_record_type, Node_Id gnat_component_list,
>        tree gnu_union_type, gnu_union_name;
>        tree this_first_free_pos, gnu_variant_list = NULL_TREE;
>        bool union_field_needs_strict_alignment = false;
> -      stack_vec <vinfo_t, 16> variant_types;
> +      auto_vec <vinfo_t, 16> variant_types;
>        vinfo_t *gnu_variant;
>        unsigned int variants_align = 0;
>        unsigned int i;
> diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
> index 5dde632..e3f8b4d 100644
> --- a/gcc/config/i386/i386.c
> +++ b/gcc/config/i386/i386.c
> @@ -30809,7 +30809,7 @@ ix86_generate_version_dispatcher_body (void *node_p)
>
>    push_cfun (DECL_STRUCT_FUNCTION (resolver_decl));
>
> -  stack_vec<tree, 2> fn_ver_vec;
> +  auto_vec<tree, 2> fn_ver_vec;
>
>    for (versn_info = node_version_info->next; versn_info;
>         versn_info = versn_info->next)
> diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
> index 7c1b18e..30426d8 100644
> --- a/gcc/cp/semantics.c
> +++ b/gcc/cp/semantics.c
> @@ -7439,7 +7439,7 @@ build_anon_member_initialization (tree member, tree init,
>       to build up the initializer from the outside in so that we can reuse
>       previously built CONSTRUCTORs if this is, say, the second field in an
>       anonymous struct.  So we use a vec as a stack.  */
> -  stack_vec<tree, 2> fields;
> +  auto_vec<tree, 2> fields;
>    do
>      {
>        fields.safe_push (TREE_OPERAND (member, 1));
> diff --git a/gcc/df-scan.c b/gcc/df-scan.c
> index eb7e4d4..dcb4566 100644
> --- a/gcc/df-scan.c
> +++ b/gcc/df-scan.c
> @@ -86,10 +86,10 @@ static HARD_REG_SET elim_reg_set;
>
>  struct df_collection_rec
>  {
> -  stack_vec<df_ref, 128> def_vec;
> -  stack_vec<df_ref, 32> use_vec;
> -  stack_vec<df_ref, 32> eq_use_vec;
> -  stack_vec<df_mw_hardreg_ptr, 32> mw_vec;
> +  auto_vec<df_ref, 128> def_vec;
> +  auto_vec<df_ref, 32> use_vec;
> +  auto_vec<df_ref, 32> eq_use_vec;
> +  auto_vec<df_mw_hardreg_ptr, 32> mw_vec;
>  };
>
>  static df_ref df_null_ref_rec[1];
> diff --git a/gcc/function.c b/gcc/function.c
> index 2c8d781..95f7ed8 100644
> --- a/gcc/function.c
> +++ b/gcc/function.c
> @@ -4114,7 +4114,7 @@ reorder_blocks (void)
>    if (block == NULL_TREE)
>      return;
>
> -  stack_vec<tree, 10> block_stack;
> +  auto_vec<tree, 10> block_stack;
>
>    /* Reset the TREE_ASM_WRITTEN bit for all blocks.  */
>    clear_block_marks (block);
> diff --git a/gcc/genautomata.c b/gcc/genautomata.c
> index 5580c69..aa05541 100644
> --- a/gcc/genautomata.c
> +++ b/gcc/genautomata.c
> @@ -3349,7 +3349,7 @@ uniq_sort_alt_states (alt_state_t alt_states_list)
>    if (alt_states_list->next_alt_state == 0)
>      return alt_states_list;
>
> -  stack_vec<alt_state_t, 150> alt_states;
> +  auto_vec<alt_state_t, 150> alt_states;
>    for (curr_alt_state = alt_states_list;
>         curr_alt_state != NULL;
>         curr_alt_state = curr_alt_state->next_alt_state)
> @@ -5484,7 +5484,7 @@ form_ainsn_with_same_reservs (automaton_t automaton)
>  {
>    ainsn_t curr_ainsn;
>    size_t i;
> -  stack_vec<ainsn_t, 150> last_insns;
> +  auto_vec<ainsn_t, 150> last_insns;
>
>    for (curr_ainsn = automaton->ainsn_list;
>         curr_ainsn != NULL;
> @@ -5555,7 +5555,7 @@ make_automaton (automaton_t automaton)
>    state_t state;
>    state_t start_state;
>    state_t state2;
> -  stack_vec<state_t, 150> state_stack;
> +  auto_vec<state_t, 150> state_stack;
>    int states_n;
>    reserv_sets_t reservs_matter = form_reservs_matter (automaton);
>
> diff --git a/gcc/gimplify.c b/gcc/gimplify.c
> index 2e8c657..d51d1b8 100644
> --- a/gcc/gimplify.c
> +++ b/gcc/gimplify.c
> @@ -1846,7 +1846,7 @@ gimplify_compound_lval (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
>
>    /* Create a stack of the subexpressions so later we can walk them in
>       order from inner to outer.  */
> -  stack_vec<tree, 10> expr_stack;
> +  auto_vec<tree, 10> expr_stack;
>
>    /* We can handle anything that get_inner_reference can deal with.  */
>    for (p = expr_p; ; p = &TREE_OPERAND (*p, 0))
> diff --git a/gcc/graphite-clast-to-gimple.c b/gcc/graphite-clast-to-gimple.c
> index 038c4f2..2b9e743 100644
> --- a/gcc/graphite-clast-to-gimple.c
> +++ b/gcc/graphite-clast-to-gimple.c
> @@ -1659,7 +1659,7 @@ debug_generated_program (scop_p scop)
>  bool
>  gloog (scop_p scop, bb_pbb_htab_type bb_pbb_mapping)
>  {
> -  stack_vec<tree, 10> newivs;
> +  auto_vec<tree, 10> newivs;
>    loop_p context_loop;
>    sese region = SCOP_REGION (scop);
>    ifsese if_region = NULL;
> diff --git a/gcc/graphite-dependences.c b/gcc/graphite-dependences.c
> index c0d769c..f16cb93 100644
> --- a/gcc/graphite-dependences.c
> +++ b/gcc/graphite-dependences.c
> @@ -593,7 +593,7 @@ loop_is_parallel_p (loop_p loop, bb_pbb_htab_type bb_pbb_mapping, int depth)
>    scop_p scop;
>
>    timevar_push (TV_GRAPHITE_DATA_DEPS);
> -  stack_vec<poly_bb_p, 3> body;
> +  auto_vec<poly_bb_p, 3> body;
>    scop = get_loop_body_pbbs (loop, bb_pbb_mapping, &body);
>    dependences = loop_level_carries_dependences (scop, body, depth);
>    timevar_pop (TV_GRAPHITE_DATA_DEPS);
> diff --git a/gcc/graphite-scop-detection.c b/gcc/graphite-scop-detection.c
> index a8db98d..00268bb 100644
> --- a/gcc/graphite-scop-detection.c
> +++ b/gcc/graphite-scop-detection.c
> @@ -481,7 +481,7 @@ scopdet_basic_block_info (basic_block bb, loop_p outermost_loop,
>
>      case GBB_LOOP_SING_EXIT_HEADER:
>        {
> -       stack_vec<sd_region, 3> regions;
> +       auto_vec<sd_region, 3> regions;
>         struct scopdet_info sinfo;
>         edge exit_e = single_exit (loop);
>
> @@ -546,7 +546,7 @@ scopdet_basic_block_info (basic_block bb, loop_p outermost_loop,
>        {
>          /* XXX: For now we just do not join loops with multiple exits.  If the
>             exits lead to the same bb it may be possible to join the loop.  */
> -        stack_vec<sd_region, 3> regions;
> +        auto_vec<sd_region, 3> regions;
>          vec<edge> exits = get_loop_exit_edges (loop);
>          edge e;
>          int i;
> @@ -589,7 +589,7 @@ scopdet_basic_block_info (basic_block bb, loop_p outermost_loop,
>        }
>      case GBB_COND_HEADER:
>        {
> -       stack_vec<sd_region, 3> regions;
> +       auto_vec<sd_region, 3> regions;
>         struct scopdet_info sinfo;
>         vec<basic_block> dominated;
>         int i;
> @@ -1192,7 +1192,7 @@ print_graphite_statistics (FILE* file, vec<scop_p> scops)
>  static void
>  limit_scops (vec<scop_p> *scops)
>  {
> -  stack_vec<sd_region, 3> regions;
> +  auto_vec<sd_region, 3> regions;
>
>    int i;
>    scop_p scop;
> @@ -1404,7 +1404,7 @@ void
>  build_scops (vec<scop_p> *scops)
>  {
>    struct loop *loop = current_loops->tree_root;
> -  stack_vec<sd_region, 3> regions;
> +  auto_vec<sd_region, 3> regions;
>
>    canonicalize_loop_closed_ssa_form ();
>    build_scops_1 (single_succ (ENTRY_BLOCK_PTR_FOR_FN (cfun)),
> @@ -1595,7 +1595,7 @@ dot_all_scops (vec<scop_p> scops)
>  DEBUG_FUNCTION void
>  dot_scop (scop_p scop)
>  {
> -  stack_vec<scop_p, 1> scops;
> +  auto_vec<scop_p, 1> scops;
>
>    if (scop)
>      scops.safe_push (scop);
> diff --git a/gcc/graphite-sese-to-poly.c b/gcc/graphite-sese-to-poly.c
> index 0eebbab..dcfafbf 100644
> --- a/gcc/graphite-sese-to-poly.c
> +++ b/gcc/graphite-sese-to-poly.c
> @@ -1245,7 +1245,7 @@ public:
>    virtual void after_dom_children (basic_block);
>
>  private:
> -  stack_vec<gimple, 3> m_conditions, m_cases;
> +  auto_vec<gimple, 3> m_conditions, m_cases;
>    sese m_region;
>  };
>
> @@ -1890,7 +1890,7 @@ build_scop_drs (scop_p scop)
>    int i, j;
>    poly_bb_p pbb;
>    data_reference_p dr;
> -  stack_vec<data_reference_p, 3> drs;
> +  auto_vec<data_reference_p, 3> drs;
>
>    /* Remove all the PBBs that do not have data references: these basic
>       blocks are not handled in the polyhedral representation.  */
> @@ -1988,7 +1988,7 @@ insert_stmts (scop_p scop, gimple stmt, gimple_seq stmts,
>               gimple_stmt_iterator insert_gsi)
>  {
>    gimple_stmt_iterator gsi;
> -  stack_vec<gimple, 3> x;
> +  auto_vec<gimple, 3> x;
>
>    gimple_seq_add_stmt (&stmts, stmt);
>    for (gsi = gsi_start (stmts); !gsi_end_p (gsi); gsi_next (&gsi))
> @@ -2007,7 +2007,7 @@ insert_out_of_ssa_copy (scop_p scop, tree res, tree expr, gimple after_stmt)
>    gimple_stmt_iterator gsi;
>    tree var = force_gimple_operand (expr, &stmts, true, NULL_TREE);
>    gimple stmt = gimple_build_assign (unshare_expr (res), var);
> -  stack_vec<gimple, 3> x;
> +  auto_vec<gimple, 3> x;
>
>    gimple_seq_add_stmt (&stmts, stmt);
>    for (gsi = gsi_start (stmts); !gsi_end_p (gsi); gsi_next (&gsi))
> @@ -2062,7 +2062,7 @@ insert_out_of_ssa_copy_on_edge (scop_p scop, edge e, tree res, tree expr)
>    tree var = force_gimple_operand (expr, &stmts, true, NULL_TREE);
>    gimple stmt = gimple_build_assign (unshare_expr (res), var);
>    basic_block bb;
> -  stack_vec<gimple, 3> x;
> +  auto_vec<gimple, 3> x;
>
>    gimple_seq_add_stmt (&stmts, stmt);
>    for (gsi = gsi_start (stmts); !gsi_end_p (gsi); gsi_next (&gsi))
> @@ -2870,7 +2870,7 @@ remove_phi (gimple phi)
>    tree def;
>    use_operand_p use_p;
>    gimple_stmt_iterator gsi;
> -  stack_vec<gimple, 3> update;
> +  auto_vec<gimple, 3> update;
>    unsigned int i;
>    gimple stmt;
>
> @@ -3028,8 +3028,8 @@ rewrite_commutative_reductions_out_of_ssa_close_phi (scop_p scop,
>                                                      gimple close_phi)
>  {
>    bool res;
> -  stack_vec<gimple, 10> in;
> -  stack_vec<gimple, 10> out;
> +  auto_vec<gimple, 10> in;
> +  auto_vec<gimple, 10> out;
>
>    detect_commutative_reduction (scop, close_phi, &in, &out);
>    res = in.length () > 1;
> diff --git a/gcc/hw-doloop.c b/gcc/hw-doloop.c
> index 77c8149..a246668 100644
> --- a/gcc/hw-doloop.c
> +++ b/gcc/hw-doloop.c
> @@ -252,7 +252,7 @@ discover_loop (hwloop_info loop, basic_block tail_bb, rtx tail_insn, rtx reg)
>    loop->head = BRANCH_EDGE (tail_bb)->dest;
>    loop->successor = FALLTHRU_EDGE (tail_bb)->dest;
>
> -  stack_vec<basic_block, 20> works;
> +  auto_vec<basic_block, 20> works;
>    works.safe_push (loop->head);
>
>    found_tail = false;
> diff --git a/gcc/trans-mem.c b/gcc/trans-mem.c
> index b2adc3d..ca8374a 100644
> --- a/gcc/trans-mem.c
> +++ b/gcc/trans-mem.c
> @@ -4531,7 +4531,7 @@ ipa_tm_scan_irr_function (struct cgraph_node *node, bool for_clone)
>    calculate_dominance_info (CDI_DOMINATORS);
>
>    d = get_cg_data (&node, true);
> -  stack_vec<basic_block, 10> queue;
> +  auto_vec<basic_block, 10> queue;
>    new_irr = BITMAP_ALLOC (&tm_obstack);
>
>    /* Scan each tm region, propagating irrevocable status through the tree.  */
> diff --git a/gcc/tree-call-cdce.c b/gcc/tree-call-cdce.c
> index 19402e3..93d45a0 100644
> --- a/gcc/tree-call-cdce.c
> +++ b/gcc/tree-call-cdce.c
> @@ -727,7 +727,7 @@ shrink_wrap_one_built_in_call (gimple bi_call)
>    tree bi_call_label_decl;
>    gimple bi_call_label;
>
> -  stack_vec<gimple, 12> conds;
> +  auto_vec<gimple, 12> conds;
>    gen_shrink_wrap_conditions (bi_call, conds, &nconds);
>
>    /* This can happen if the condition generator decides
> diff --git a/gcc/tree-data-ref.c b/gcc/tree-data-ref.c
> index 09b50d8..6f9b77b 100644
> --- a/gcc/tree-data-ref.c
> +++ b/gcc/tree-data-ref.c
> @@ -4424,7 +4424,7 @@ find_data_references_in_stmt (struct loop *nest, gimple stmt,
>                               vec<data_reference_p> *datarefs)
>  {
>    unsigned i;
> -  stack_vec<data_ref_loc, 2> references;
> +  auto_vec<data_ref_loc, 2> references;
>    data_ref_loc *ref;
>    bool ret = true;
>    data_reference_p dr;
> @@ -4454,7 +4454,7 @@ graphite_find_data_references_in_stmt (loop_p nest, loop_p loop, gimple stmt,
>                                        vec<data_reference_p> *datarefs)
>  {
>    unsigned i;
> -  stack_vec<data_ref_loc, 2> references;
> +  auto_vec<data_ref_loc, 2> references;
>    data_ref_loc *ref;
>    bool ret = true;
>    data_reference_p dr;
> diff --git a/gcc/tree-dfa.c b/gcc/tree-dfa.c
> index 27d6a71..54825d4 100644
> --- a/gcc/tree-dfa.c
> +++ b/gcc/tree-dfa.c
> @@ -737,7 +737,7 @@ dump_enumerated_decls (FILE *file, int flags)
>  {
>    basic_block bb;
>    struct walk_stmt_info wi;
> -  stack_vec<numbered_tree, 40> decl_list;
> +  auto_vec<numbered_tree, 40> decl_list;
>
>    memset (&wi, '\0', sizeof (wi));
>    wi.info = (void *) &decl_list;
> diff --git a/gcc/tree-if-conv.c b/gcc/tree-if-conv.c
> index 7f6a150..cfeb98d 100644
> --- a/gcc/tree-if-conv.c
> +++ b/gcc/tree-if-conv.c
> @@ -1208,7 +1208,7 @@ if_convertible_loop_p (struct loop *loop)
>
>    refs.create (5);
>    ddrs.create (25);
> -  stack_vec<loop_p, 3> loop_nest;
> +  auto_vec<loop_p, 3> loop_nest;
>    res = if_convertible_loop_p_1 (loop, &loop_nest, &refs, &ddrs);
>
>    if (flag_tree_loop_if_convert_stores)
> diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
> index f42ade02..dc97bad 100644
> --- a/gcc/tree-inline.c
> +++ b/gcc/tree-inline.c
> @@ -5234,7 +5234,7 @@ tree_function_versioning (tree old_decl, tree new_decl,
>    unsigned i;
>    struct ipa_replace_map *replace_info;
>    basic_block old_entry_block, bb;
> -  stack_vec<gimple, 10> init_stmts;
> +  auto_vec<gimple, 10> init_stmts;
>    tree vars = NULL_TREE;
>
>    gcc_assert (TREE_CODE (old_decl) == FUNCTION_DECL
> diff --git a/gcc/tree-loop-distribution.c b/gcc/tree-loop-distribution.c
> index abf69f4..f3906df 100644
> --- a/gcc/tree-loop-distribution.c
> +++ b/gcc/tree-loop-distribution.c
> @@ -448,7 +448,7 @@ build_rdg (vec<loop_p> loop_nest, control_dependences *cd)
>    vec<data_reference_p> datarefs;
>
>    /* Create the RDG vertices from the stmts of the loop nest.  */
> -  stack_vec<gimple, 10> stmts;
> +  auto_vec<gimple, 10> stmts;
>    stmts_from_loop (loop_nest[0], &stmts);
>    rdg = new_graph (stmts.length ());
>    datarefs.create (10);
> @@ -964,7 +964,7 @@ static partition_t
>  build_rdg_partition_for_vertex (struct graph *rdg, int v)
>  {
>    partition_t partition = partition_alloc (NULL, NULL);
> -  stack_vec<int, 3> nodes;
> +  auto_vec<int, 3> nodes;
>    unsigned i;
>    int x;
>
> @@ -1418,7 +1418,7 @@ distribute_loop (struct loop *loop, vec<gimple> stmts,
>    int num_sccs = 1;
>
>    *nb_calls = 0;
> -  stack_vec<loop_p, 3> loop_nest;
> +  auto_vec<loop_p, 3> loop_nest;
>    if (!find_loop_nest (loop, &loop_nest))
>      return 0;
>
> @@ -1436,7 +1436,7 @@ distribute_loop (struct loop *loop, vec<gimple> stmts,
>    if (dump_file && (dump_flags & TDF_DETAILS))
>      dump_rdg (dump_file, rdg);
>
> -  stack_vec<partition_t, 3> partitions;
> +  auto_vec<partition_t, 3> partitions;
>    rdg_build_partitions (rdg, stmts, &partitions);
>
>    any_builtin = false;
> diff --git a/gcc/tree-parloops.c b/gcc/tree-parloops.c
> index a56145d..368a05e 100644
> --- a/gcc/tree-parloops.c
> +++ b/gcc/tree-parloops.c
> @@ -424,7 +424,7 @@ loop_parallel_p (struct loop *loop, struct obstack * parloop_obstack)
>
>    /* Check for problems with dependences.  If the loop can be reversed,
>       the iterations are independent.  */
> -  stack_vec<loop_p, 3> loop_nest;
> +  auto_vec<loop_p, 3> loop_nest;
>    datarefs.create (10);
>    dependence_relations.create (100);
>    if (! compute_data_dependences_for_loop (loop, true, &loop_nest, &datarefs,
> @@ -752,7 +752,7 @@ static void
>  eliminate_local_variables (edge entry, edge exit)
>  {
>    basic_block bb;
> -  stack_vec<basic_block, 3> body;
> +  auto_vec<basic_block, 3> body;
>    unsigned i;
>    gimple_stmt_iterator gsi;
>    bool has_debug_stmt = false;
> @@ -1303,7 +1303,7 @@ separate_decls_in_region (edge entry, edge exit,
>    tree type, type_name, nvar;
>    gimple_stmt_iterator gsi;
>    struct clsn_data clsn_data;
> -  stack_vec<basic_block, 3> body;
> +  auto_vec<basic_block, 3> body;
>    basic_block bb;
>    basic_block entry_bb = bb1;
>    basic_block exit_bb = exit->dest;
> diff --git a/gcc/tree-predcom.c b/gcc/tree-predcom.c
> index 1d4e439..4479257 100644
> --- a/gcc/tree-predcom.c
> +++ b/gcc/tree-predcom.c
> @@ -2395,7 +2395,7 @@ tree_predictive_commoning_loop (struct loop *loop)
>
>    /* Find the data references and split them into components according to their
>       dependence relations.  */
> -  stack_vec<loop_p, 3> loop_nest;
> +  auto_vec<loop_p, 3> loop_nest;
>    dependences.create (10);
>    datarefs.create (10);
>    if (! compute_data_dependences_for_loop (loop, true, &loop_nest, &datarefs,
> diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c
> index e412d72..0fb4c44 100644
> --- a/gcc/tree-ssa-alias.c
> +++ b/gcc/tree-ssa-alias.c
> @@ -768,8 +768,8 @@ aliasing_component_refs_p (tree ref1,
>  static bool
>  nonoverlapping_component_refs_of_decl_p (tree ref1, tree ref2)
>  {
> -  stack_vec<tree, 16> component_refs1;
> -  stack_vec<tree, 16> component_refs2;
> +  auto_vec<tree, 16> component_refs1;
> +  auto_vec<tree, 16> component_refs2;
>
>    /* Create the stack of handled components for REF1.  */
>    while (handled_component_p (ref1))
> diff --git a/gcc/tree-ssa-loop-ivcanon.c b/gcc/tree-ssa-loop-ivcanon.c
> index fd4ac70..2533971 100644
> --- a/gcc/tree-ssa-loop-ivcanon.c
> +++ b/gcc/tree-ssa-loop-ivcanon.c
> @@ -1171,7 +1171,7 @@ tree_unroll_loops_completely_1 (bool may_increase_size, bool unroll_outer,
>  unsigned int
>  tree_unroll_loops_completely (bool may_increase_size, bool unroll_outer)
>  {
> -  stack_vec<loop_p, 16> father_stack;
> +  auto_vec<loop_p, 16> father_stack;
>    bool changed;
>    int iteration = 0;
>    bool irred_invalidated = false;
> diff --git a/gcc/tree-ssa-phiopt.c b/gcc/tree-ssa-phiopt.c
> index 11e565f..891c4d3 100644
> --- a/gcc/tree-ssa-phiopt.c
> +++ b/gcc/tree-ssa-phiopt.c
> @@ -1715,7 +1715,7 @@ cond_if_else_store_replacement (basic_block then_bb, basic_block else_bb,
>      }
>
>    /* Find pairs of stores with equal LHS.  */
> -  stack_vec<gimple, 1> then_stores, else_stores;
> +  auto_vec<gimple, 1> then_stores, else_stores;
>    FOR_EACH_VEC_ELT (then_datarefs, i, then_dr)
>      {
>        if (DR_IS_READ (then_dr))
> diff --git a/gcc/tree-ssa-threadedge.c b/gcc/tree-ssa-threadedge.c
> index cb6accf..e2eb471 100644
> --- a/gcc/tree-ssa-threadedge.c
> +++ b/gcc/tree-ssa-threadedge.c
> @@ -690,7 +690,7 @@ propagate_threaded_block_debug_into (basic_block dest, basic_block src)
>        i++;
>      }
>
> -  stack_vec<tree, alloc_count> fewvars;
> +  auto_vec<tree, alloc_count> fewvars;
>    pointer_set_t *vars = NULL;
>
>    /* If we're already starting with 3/4 of alloc_count, go for a
> diff --git a/gcc/tree-ssa-uncprop.c b/gcc/tree-ssa-uncprop.c
> index 44194b8..1f843ab 100644
> --- a/gcc/tree-ssa-uncprop.c
> +++ b/gcc/tree-ssa-uncprop.c
> @@ -379,7 +379,7 @@ private:
>       leading to this block.  If no such edge equivalency exists, then we
>       record NULL.  These equivalences are live until we leave the dominator
>       subtree rooted at the block where we record the equivalency.  */
> -  stack_vec<tree, 2> m_equiv_stack;
> +  auto_vec<tree, 2> m_equiv_stack;
>  };
>
>  /* Main driver for un-cprop.  */
> diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c
> index ca8d3a6..3163992 100644
> --- a/gcc/tree-vect-loop.c
> +++ b/gcc/tree-vect-loop.c
> @@ -612,7 +612,7 @@ vect_analyze_scalar_cycles_1 (loop_vec_info loop_vinfo, struct loop *loop)
>  {
>    basic_block bb = loop->header;
>    tree init, step;
> -  stack_vec<gimple, 64> worklist;
> +  auto_vec<gimple, 64> worklist;
>    gimple_stmt_iterator gsi;
>    bool double_reduc;
>
> diff --git a/gcc/tree-vect-patterns.c b/gcc/tree-vect-patterns.c
> index 7823cc3..d1f8123 100644
> --- a/gcc/tree-vect-patterns.c
> +++ b/gcc/tree-vect-patterns.c
> @@ -3213,7 +3213,7 @@ vect_pattern_recog (loop_vec_info loop_vinfo, bb_vec_info bb_vinfo)
>    gimple_stmt_iterator si;
>    unsigned int i, j;
>    vect_recog_func_ptr vect_recog_func;
> -  stack_vec<gimple, 1> stmts_to_replace;
> +  auto_vec<gimple, 1> stmts_to_replace;
>    gimple stmt;
>
>    if (dump_enabled_p ())
> diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c
> index 2387c0d..d1e1796 100644
> --- a/gcc/tree-vect-slp.c
> +++ b/gcc/tree-vect-slp.c
> @@ -2029,7 +2029,7 @@ vect_bb_vectorization_profitable_p (bb_vec_info bb_vinfo)
>    /* Calculate scalar cost.  */
>    FOR_EACH_VEC_ELT (slp_instances, i, instance)
>      {
> -      stack_vec<bool, 20> life;
> +      auto_vec<bool, 20> life;
>        life.safe_grow_cleared (SLP_INSTANCE_GROUP_SIZE (instance));
>        scalar_cost += vect_bb_slp_scalar_cost (BB_VINFO_BB (bb_vinfo),
>                                               SLP_INSTANCE_TREE (instance),
> diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c
> index ff7b59a..3bae7ec 100644
> --- a/gcc/tree-vect-stmts.c
> +++ b/gcc/tree-vect-stmts.c
> @@ -609,7 +609,7 @@ vect_mark_stmts_to_be_vectorized (loop_vec_info loop_vinfo)
>      dump_printf_loc (MSG_NOTE, vect_location,
>                       "=== vect_mark_stmts_to_be_vectorized ===\n");
>
> -  stack_vec<gimple, 64> worklist;
> +  auto_vec<gimple, 64> worklist;
>
>    /* 1. Init worklist.  */
>    for (i = 0; i < nbbs; i++)
> @@ -6129,8 +6129,8 @@ vectorizable_condition (gimple stmt, gimple_stmt_iterator *gsi,
>         {
>            if (slp_node)
>              {
> -              stack_vec<tree, 4> ops;
> -             stack_vec<vec<tree>, 4> vec_defs;
> +              auto_vec<tree, 4> ops;
> +             auto_vec<vec<tree>, 4> vec_defs;
>
>                ops.safe_push (TREE_OPERAND (cond_expr, 0));
>                ops.safe_push (TREE_OPERAND (cond_expr, 1));
> diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c
> index 7d4a983..13b877a 100644
> --- a/gcc/var-tracking.c
> +++ b/gcc/var-tracking.c
> @@ -7930,7 +7930,7 @@ struct expand_loc_callback_data
>
>    /* Stack of values and debug_exprs under expansion, and their
>       children.  */
> -  stack_vec<rtx, 4> expanding;
> +  auto_vec<rtx, 4> expanding;
>
>    /* Stack of values and debug_exprs whose expansion hit recursion
>       cycles.  They will have VALUE_RECURSED_INTO marked when added to
> @@ -7938,7 +7938,7 @@ struct expand_loc_callback_data
>       resolves to a valid location.  So, if the flag remains set at the
>       end of the search, we know no valid location for this one can
>       possibly exist.  */
> -  stack_vec<rtx, 4> pending;
> +  auto_vec<rtx, 4> pending;
>
>    /* The maximum depth among the sub-expressions under expansion.
>       Zero indicates no expansion so far.  */
> @@ -8885,7 +8885,7 @@ process_changed_values (variable_table_type htab)
>  {
>    int i, n;
>    rtx val;
> -  stack_vec<rtx, 20> changed_values_stack;
> +  auto_vec<rtx, 20> changed_values_stack;
>
>    /* Move values from changed_variables to changed_values_stack.  */
>    changed_variables
> diff --git a/gcc/vec.h b/gcc/vec.h
> index 0345585..afde351 100644
> --- a/gcc/vec.h
> +++ b/gcc/vec.h
> @@ -1184,25 +1184,17 @@ public:
>  };
>
>
> -/* auto_vec is a sub class of vec whose storage is released when it is
> -  destroyed. */
> -template<typename T>
> +/* auto_vec is a subclass of vec that automatically manages creating and
> +   releasing the internal vector. If N is non zero then it has N elements of
> +   internal storage.  The default is no internal storage, and you probably only
> +   want to ask for internal storage for vectors on the stack because if the
> +   size of the vector is larger than the internal storage that space is wasted.
> +   */
> +template<typename T, size_t N = 0>
>  class auto_vec : public vec<T, va_heap>
>  {
>  public:
> -  auto_vec () { this->m_vec = NULL; }
> -  auto_vec (size_t n) { this->create (n); }
> -  ~auto_vec () { this->release (); }
> -};
> -
> -/* stack_vec is a subclass of vec containing N elements of internal storage.
> -  You probably only want to allocate this on the stack because if the array
> -  ends up being larger or much smaller than N it will be wasting space. */
> -template<typename T, size_t N>
> -class stack_vec : public vec<T, va_heap>
> -{
> -public:
> -  stack_vec ()
> +  auto_vec ()
>    {
>      m_header.m_alloc = N;
>      m_header.m_has_auto_buf = 1;
> @@ -1210,7 +1202,7 @@ public:
>      this->m_vec = reinterpret_cast<vec<T, va_heap, vl_embed> *> (&m_header);
>    }
>
> -  ~stack_vec ()
> +  ~auto_vec ()
>    {
>      this->release ();
>    }
> @@ -1222,6 +1214,17 @@ private:
>    T m_data[N];
>  };
>
> +/* auto_vec is a sub class of vec whose storage is released when it is
> +  destroyed. */
> +template<typename T>
> +class auto_vec<T, 0> : public vec<T, va_heap>
> +{
> +public:
> +  auto_vec () { this->m_vec = NULL; }
> +  auto_vec (size_t n) { this->create (n); }
> +  ~auto_vec () { this->release (); }
> +};
> +
>
>  /* Allocate heap memory for pointer V and create the internal vector
>     with space for NELEMS elements.  If NELEMS is 0, the internal
> @@ -1421,7 +1424,7 @@ vec<T, va_heap, vl_ptr>::release (void)
>
>    if (using_auto_storage ())
>      {
> -      static_cast<stack_vec<T, 1> *> (this)->m_header.m_num = 0;
> +      static_cast<auto_vec<T, 1> *> (this)->m_header.m_num = 0;
>        return;
>      }
>
> @@ -1654,7 +1657,7 @@ vec<T, va_heap, vl_ptr>::using_auto_storage () const
>      return false;
>
>    const vec_prefix *auto_header
> -    = &static_cast<const stack_vec<T, 1> *> (this)->m_header;
> +    = &static_cast<const auto_vec<T, 1> *> (this)->m_header;
>    return reinterpret_cast<vec_prefix *> (m_vec) == auto_header;
>  }
>
> --
> 1.8.4.2
>
diff mbox

Patch

diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c
index a80d1a9..ad129c6 100644
--- a/gcc/ada/gcc-interface/decl.c
+++ b/gcc/ada/gcc-interface/decl.c
@@ -7010,7 +7010,7 @@  components_to_record (tree gnu_record_type, Node_Id gnat_component_list,
       tree gnu_union_type, gnu_union_name;
       tree this_first_free_pos, gnu_variant_list = NULL_TREE;
       bool union_field_needs_strict_alignment = false;
-      stack_vec <vinfo_t, 16> variant_types;
+      auto_vec <vinfo_t, 16> variant_types;
       vinfo_t *gnu_variant;
       unsigned int variants_align = 0;
       unsigned int i;
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 5dde632..e3f8b4d 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -30809,7 +30809,7 @@  ix86_generate_version_dispatcher_body (void *node_p)
 
   push_cfun (DECL_STRUCT_FUNCTION (resolver_decl));
 
-  stack_vec<tree, 2> fn_ver_vec;
+  auto_vec<tree, 2> fn_ver_vec;
 
   for (versn_info = node_version_info->next; versn_info;
        versn_info = versn_info->next)
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index 7c1b18e..30426d8 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -7439,7 +7439,7 @@  build_anon_member_initialization (tree member, tree init,
      to build up the initializer from the outside in so that we can reuse
      previously built CONSTRUCTORs if this is, say, the second field in an
      anonymous struct.  So we use a vec as a stack.  */
-  stack_vec<tree, 2> fields;
+  auto_vec<tree, 2> fields;
   do
     {
       fields.safe_push (TREE_OPERAND (member, 1));
diff --git a/gcc/df-scan.c b/gcc/df-scan.c
index eb7e4d4..dcb4566 100644
--- a/gcc/df-scan.c
+++ b/gcc/df-scan.c
@@ -86,10 +86,10 @@  static HARD_REG_SET elim_reg_set;
 
 struct df_collection_rec
 {
-  stack_vec<df_ref, 128> def_vec;
-  stack_vec<df_ref, 32> use_vec;
-  stack_vec<df_ref, 32> eq_use_vec;
-  stack_vec<df_mw_hardreg_ptr, 32> mw_vec;
+  auto_vec<df_ref, 128> def_vec;
+  auto_vec<df_ref, 32> use_vec;
+  auto_vec<df_ref, 32> eq_use_vec;
+  auto_vec<df_mw_hardreg_ptr, 32> mw_vec;
 };
 
 static df_ref df_null_ref_rec[1];
diff --git a/gcc/function.c b/gcc/function.c
index 2c8d781..95f7ed8 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -4114,7 +4114,7 @@  reorder_blocks (void)
   if (block == NULL_TREE)
     return;
 
-  stack_vec<tree, 10> block_stack;
+  auto_vec<tree, 10> block_stack;
 
   /* Reset the TREE_ASM_WRITTEN bit for all blocks.  */
   clear_block_marks (block);
diff --git a/gcc/genautomata.c b/gcc/genautomata.c
index 5580c69..aa05541 100644
--- a/gcc/genautomata.c
+++ b/gcc/genautomata.c
@@ -3349,7 +3349,7 @@  uniq_sort_alt_states (alt_state_t alt_states_list)
   if (alt_states_list->next_alt_state == 0)
     return alt_states_list;
 
-  stack_vec<alt_state_t, 150> alt_states;
+  auto_vec<alt_state_t, 150> alt_states;
   for (curr_alt_state = alt_states_list;
        curr_alt_state != NULL;
        curr_alt_state = curr_alt_state->next_alt_state)
@@ -5484,7 +5484,7 @@  form_ainsn_with_same_reservs (automaton_t automaton)
 {
   ainsn_t curr_ainsn;
   size_t i;
-  stack_vec<ainsn_t, 150> last_insns;
+  auto_vec<ainsn_t, 150> last_insns;
 
   for (curr_ainsn = automaton->ainsn_list;
        curr_ainsn != NULL;
@@ -5555,7 +5555,7 @@  make_automaton (automaton_t automaton)
   state_t state;
   state_t start_state;
   state_t state2;
-  stack_vec<state_t, 150> state_stack;
+  auto_vec<state_t, 150> state_stack;
   int states_n;
   reserv_sets_t reservs_matter = form_reservs_matter (automaton);
 
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index 2e8c657..d51d1b8 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -1846,7 +1846,7 @@  gimplify_compound_lval (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
 
   /* Create a stack of the subexpressions so later we can walk them in
      order from inner to outer.  */
-  stack_vec<tree, 10> expr_stack;
+  auto_vec<tree, 10> expr_stack;
 
   /* We can handle anything that get_inner_reference can deal with.  */
   for (p = expr_p; ; p = &TREE_OPERAND (*p, 0))
diff --git a/gcc/graphite-clast-to-gimple.c b/gcc/graphite-clast-to-gimple.c
index 038c4f2..2b9e743 100644
--- a/gcc/graphite-clast-to-gimple.c
+++ b/gcc/graphite-clast-to-gimple.c
@@ -1659,7 +1659,7 @@  debug_generated_program (scop_p scop)
 bool
 gloog (scop_p scop, bb_pbb_htab_type bb_pbb_mapping)
 {
-  stack_vec<tree, 10> newivs;
+  auto_vec<tree, 10> newivs;
   loop_p context_loop;
   sese region = SCOP_REGION (scop);
   ifsese if_region = NULL;
diff --git a/gcc/graphite-dependences.c b/gcc/graphite-dependences.c
index c0d769c..f16cb93 100644
--- a/gcc/graphite-dependences.c
+++ b/gcc/graphite-dependences.c
@@ -593,7 +593,7 @@  loop_is_parallel_p (loop_p loop, bb_pbb_htab_type bb_pbb_mapping, int depth)
   scop_p scop;
 
   timevar_push (TV_GRAPHITE_DATA_DEPS);
-  stack_vec<poly_bb_p, 3> body;
+  auto_vec<poly_bb_p, 3> body;
   scop = get_loop_body_pbbs (loop, bb_pbb_mapping, &body);
   dependences = loop_level_carries_dependences (scop, body, depth);
   timevar_pop (TV_GRAPHITE_DATA_DEPS);
diff --git a/gcc/graphite-scop-detection.c b/gcc/graphite-scop-detection.c
index a8db98d..00268bb 100644
--- a/gcc/graphite-scop-detection.c
+++ b/gcc/graphite-scop-detection.c
@@ -481,7 +481,7 @@  scopdet_basic_block_info (basic_block bb, loop_p outermost_loop,
 
     case GBB_LOOP_SING_EXIT_HEADER:
       {
-	stack_vec<sd_region, 3> regions;
+	auto_vec<sd_region, 3> regions;
 	struct scopdet_info sinfo;
 	edge exit_e = single_exit (loop);
 
@@ -546,7 +546,7 @@  scopdet_basic_block_info (basic_block bb, loop_p outermost_loop,
       {
         /* XXX: For now we just do not join loops with multiple exits.  If the
            exits lead to the same bb it may be possible to join the loop.  */
-        stack_vec<sd_region, 3> regions;
+        auto_vec<sd_region, 3> regions;
         vec<edge> exits = get_loop_exit_edges (loop);
         edge e;
         int i;
@@ -589,7 +589,7 @@  scopdet_basic_block_info (basic_block bb, loop_p outermost_loop,
       }
     case GBB_COND_HEADER:
       {
-	stack_vec<sd_region, 3> regions;
+	auto_vec<sd_region, 3> regions;
 	struct scopdet_info sinfo;
 	vec<basic_block> dominated;
 	int i;
@@ -1192,7 +1192,7 @@  print_graphite_statistics (FILE* file, vec<scop_p> scops)
 static void
 limit_scops (vec<scop_p> *scops)
 {
-  stack_vec<sd_region, 3> regions;
+  auto_vec<sd_region, 3> regions;
 
   int i;
   scop_p scop;
@@ -1404,7 +1404,7 @@  void
 build_scops (vec<scop_p> *scops)
 {
   struct loop *loop = current_loops->tree_root;
-  stack_vec<sd_region, 3> regions;
+  auto_vec<sd_region, 3> regions;
 
   canonicalize_loop_closed_ssa_form ();
   build_scops_1 (single_succ (ENTRY_BLOCK_PTR_FOR_FN (cfun)),
@@ -1595,7 +1595,7 @@  dot_all_scops (vec<scop_p> scops)
 DEBUG_FUNCTION void
 dot_scop (scop_p scop)
 {
-  stack_vec<scop_p, 1> scops;
+  auto_vec<scop_p, 1> scops;
 
   if (scop)
     scops.safe_push (scop);
diff --git a/gcc/graphite-sese-to-poly.c b/gcc/graphite-sese-to-poly.c
index 0eebbab..dcfafbf 100644
--- a/gcc/graphite-sese-to-poly.c
+++ b/gcc/graphite-sese-to-poly.c
@@ -1245,7 +1245,7 @@  public:
   virtual void after_dom_children (basic_block);
 
 private:
-  stack_vec<gimple, 3> m_conditions, m_cases;
+  auto_vec<gimple, 3> m_conditions, m_cases;
   sese m_region;
 };
 
@@ -1890,7 +1890,7 @@  build_scop_drs (scop_p scop)
   int i, j;
   poly_bb_p pbb;
   data_reference_p dr;
-  stack_vec<data_reference_p, 3> drs;
+  auto_vec<data_reference_p, 3> drs;
 
   /* Remove all the PBBs that do not have data references: these basic
      blocks are not handled in the polyhedral representation.  */
@@ -1988,7 +1988,7 @@  insert_stmts (scop_p scop, gimple stmt, gimple_seq stmts,
 	      gimple_stmt_iterator insert_gsi)
 {
   gimple_stmt_iterator gsi;
-  stack_vec<gimple, 3> x;
+  auto_vec<gimple, 3> x;
 
   gimple_seq_add_stmt (&stmts, stmt);
   for (gsi = gsi_start (stmts); !gsi_end_p (gsi); gsi_next (&gsi))
@@ -2007,7 +2007,7 @@  insert_out_of_ssa_copy (scop_p scop, tree res, tree expr, gimple after_stmt)
   gimple_stmt_iterator gsi;
   tree var = force_gimple_operand (expr, &stmts, true, NULL_TREE);
   gimple stmt = gimple_build_assign (unshare_expr (res), var);
-  stack_vec<gimple, 3> x;
+  auto_vec<gimple, 3> x;
 
   gimple_seq_add_stmt (&stmts, stmt);
   for (gsi = gsi_start (stmts); !gsi_end_p (gsi); gsi_next (&gsi))
@@ -2062,7 +2062,7 @@  insert_out_of_ssa_copy_on_edge (scop_p scop, edge e, tree res, tree expr)
   tree var = force_gimple_operand (expr, &stmts, true, NULL_TREE);
   gimple stmt = gimple_build_assign (unshare_expr (res), var);
   basic_block bb;
-  stack_vec<gimple, 3> x;
+  auto_vec<gimple, 3> x;
 
   gimple_seq_add_stmt (&stmts, stmt);
   for (gsi = gsi_start (stmts); !gsi_end_p (gsi); gsi_next (&gsi))
@@ -2870,7 +2870,7 @@  remove_phi (gimple phi)
   tree def;
   use_operand_p use_p;
   gimple_stmt_iterator gsi;
-  stack_vec<gimple, 3> update;
+  auto_vec<gimple, 3> update;
   unsigned int i;
   gimple stmt;
 
@@ -3028,8 +3028,8 @@  rewrite_commutative_reductions_out_of_ssa_close_phi (scop_p scop,
 						     gimple close_phi)
 {
   bool res;
-  stack_vec<gimple, 10> in;
-  stack_vec<gimple, 10> out;
+  auto_vec<gimple, 10> in;
+  auto_vec<gimple, 10> out;
 
   detect_commutative_reduction (scop, close_phi, &in, &out);
   res = in.length () > 1;
diff --git a/gcc/hw-doloop.c b/gcc/hw-doloop.c
index 77c8149..a246668 100644
--- a/gcc/hw-doloop.c
+++ b/gcc/hw-doloop.c
@@ -252,7 +252,7 @@  discover_loop (hwloop_info loop, basic_block tail_bb, rtx tail_insn, rtx reg)
   loop->head = BRANCH_EDGE (tail_bb)->dest;
   loop->successor = FALLTHRU_EDGE (tail_bb)->dest;
 
-  stack_vec<basic_block, 20> works;
+  auto_vec<basic_block, 20> works;
   works.safe_push (loop->head);
 
   found_tail = false;
diff --git a/gcc/trans-mem.c b/gcc/trans-mem.c
index b2adc3d..ca8374a 100644
--- a/gcc/trans-mem.c
+++ b/gcc/trans-mem.c
@@ -4531,7 +4531,7 @@  ipa_tm_scan_irr_function (struct cgraph_node *node, bool for_clone)
   calculate_dominance_info (CDI_DOMINATORS);
 
   d = get_cg_data (&node, true);
-  stack_vec<basic_block, 10> queue;
+  auto_vec<basic_block, 10> queue;
   new_irr = BITMAP_ALLOC (&tm_obstack);
 
   /* Scan each tm region, propagating irrevocable status through the tree.  */
diff --git a/gcc/tree-call-cdce.c b/gcc/tree-call-cdce.c
index 19402e3..93d45a0 100644
--- a/gcc/tree-call-cdce.c
+++ b/gcc/tree-call-cdce.c
@@ -727,7 +727,7 @@  shrink_wrap_one_built_in_call (gimple bi_call)
   tree bi_call_label_decl;
   gimple bi_call_label;
 
-  stack_vec<gimple, 12> conds;
+  auto_vec<gimple, 12> conds;
   gen_shrink_wrap_conditions (bi_call, conds, &nconds);
 
   /* This can happen if the condition generator decides
diff --git a/gcc/tree-data-ref.c b/gcc/tree-data-ref.c
index 09b50d8..6f9b77b 100644
--- a/gcc/tree-data-ref.c
+++ b/gcc/tree-data-ref.c
@@ -4424,7 +4424,7 @@  find_data_references_in_stmt (struct loop *nest, gimple stmt,
 			      vec<data_reference_p> *datarefs)
 {
   unsigned i;
-  stack_vec<data_ref_loc, 2> references;
+  auto_vec<data_ref_loc, 2> references;
   data_ref_loc *ref;
   bool ret = true;
   data_reference_p dr;
@@ -4454,7 +4454,7 @@  graphite_find_data_references_in_stmt (loop_p nest, loop_p loop, gimple stmt,
 				       vec<data_reference_p> *datarefs)
 {
   unsigned i;
-  stack_vec<data_ref_loc, 2> references;
+  auto_vec<data_ref_loc, 2> references;
   data_ref_loc *ref;
   bool ret = true;
   data_reference_p dr;
diff --git a/gcc/tree-dfa.c b/gcc/tree-dfa.c
index 27d6a71..54825d4 100644
--- a/gcc/tree-dfa.c
+++ b/gcc/tree-dfa.c
@@ -737,7 +737,7 @@  dump_enumerated_decls (FILE *file, int flags)
 {
   basic_block bb;
   struct walk_stmt_info wi;
-  stack_vec<numbered_tree, 40> decl_list;
+  auto_vec<numbered_tree, 40> decl_list;
 
   memset (&wi, '\0', sizeof (wi));
   wi.info = (void *) &decl_list;
diff --git a/gcc/tree-if-conv.c b/gcc/tree-if-conv.c
index 7f6a150..cfeb98d 100644
--- a/gcc/tree-if-conv.c
+++ b/gcc/tree-if-conv.c
@@ -1208,7 +1208,7 @@  if_convertible_loop_p (struct loop *loop)
 
   refs.create (5);
   ddrs.create (25);
-  stack_vec<loop_p, 3> loop_nest;
+  auto_vec<loop_p, 3> loop_nest;
   res = if_convertible_loop_p_1 (loop, &loop_nest, &refs, &ddrs);
 
   if (flag_tree_loop_if_convert_stores)
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
index f42ade02..dc97bad 100644
--- a/gcc/tree-inline.c
+++ b/gcc/tree-inline.c
@@ -5234,7 +5234,7 @@  tree_function_versioning (tree old_decl, tree new_decl,
   unsigned i;
   struct ipa_replace_map *replace_info;
   basic_block old_entry_block, bb;
-  stack_vec<gimple, 10> init_stmts;
+  auto_vec<gimple, 10> init_stmts;
   tree vars = NULL_TREE;
 
   gcc_assert (TREE_CODE (old_decl) == FUNCTION_DECL
diff --git a/gcc/tree-loop-distribution.c b/gcc/tree-loop-distribution.c
index abf69f4..f3906df 100644
--- a/gcc/tree-loop-distribution.c
+++ b/gcc/tree-loop-distribution.c
@@ -448,7 +448,7 @@  build_rdg (vec<loop_p> loop_nest, control_dependences *cd)
   vec<data_reference_p> datarefs;
 
   /* Create the RDG vertices from the stmts of the loop nest.  */
-  stack_vec<gimple, 10> stmts;
+  auto_vec<gimple, 10> stmts;
   stmts_from_loop (loop_nest[0], &stmts);
   rdg = new_graph (stmts.length ());
   datarefs.create (10);
@@ -964,7 +964,7 @@  static partition_t
 build_rdg_partition_for_vertex (struct graph *rdg, int v)
 {
   partition_t partition = partition_alloc (NULL, NULL);
-  stack_vec<int, 3> nodes;
+  auto_vec<int, 3> nodes;
   unsigned i;
   int x;
 
@@ -1418,7 +1418,7 @@  distribute_loop (struct loop *loop, vec<gimple> stmts,
   int num_sccs = 1;
 
   *nb_calls = 0;
-  stack_vec<loop_p, 3> loop_nest;
+  auto_vec<loop_p, 3> loop_nest;
   if (!find_loop_nest (loop, &loop_nest))
     return 0;
 
@@ -1436,7 +1436,7 @@  distribute_loop (struct loop *loop, vec<gimple> stmts,
   if (dump_file && (dump_flags & TDF_DETAILS))
     dump_rdg (dump_file, rdg);
 
-  stack_vec<partition_t, 3> partitions;
+  auto_vec<partition_t, 3> partitions;
   rdg_build_partitions (rdg, stmts, &partitions);
 
   any_builtin = false;
diff --git a/gcc/tree-parloops.c b/gcc/tree-parloops.c
index a56145d..368a05e 100644
--- a/gcc/tree-parloops.c
+++ b/gcc/tree-parloops.c
@@ -424,7 +424,7 @@  loop_parallel_p (struct loop *loop, struct obstack * parloop_obstack)
 
   /* Check for problems with dependences.  If the loop can be reversed,
      the iterations are independent.  */
-  stack_vec<loop_p, 3> loop_nest;
+  auto_vec<loop_p, 3> loop_nest;
   datarefs.create (10);
   dependence_relations.create (100);
   if (! compute_data_dependences_for_loop (loop, true, &loop_nest, &datarefs,
@@ -752,7 +752,7 @@  static void
 eliminate_local_variables (edge entry, edge exit)
 {
   basic_block bb;
-  stack_vec<basic_block, 3> body;
+  auto_vec<basic_block, 3> body;
   unsigned i;
   gimple_stmt_iterator gsi;
   bool has_debug_stmt = false;
@@ -1303,7 +1303,7 @@  separate_decls_in_region (edge entry, edge exit,
   tree type, type_name, nvar;
   gimple_stmt_iterator gsi;
   struct clsn_data clsn_data;
-  stack_vec<basic_block, 3> body;
+  auto_vec<basic_block, 3> body;
   basic_block bb;
   basic_block entry_bb = bb1;
   basic_block exit_bb = exit->dest;
diff --git a/gcc/tree-predcom.c b/gcc/tree-predcom.c
index 1d4e439..4479257 100644
--- a/gcc/tree-predcom.c
+++ b/gcc/tree-predcom.c
@@ -2395,7 +2395,7 @@  tree_predictive_commoning_loop (struct loop *loop)
 
   /* Find the data references and split them into components according to their
      dependence relations.  */
-  stack_vec<loop_p, 3> loop_nest;
+  auto_vec<loop_p, 3> loop_nest;
   dependences.create (10);
   datarefs.create (10);
   if (! compute_data_dependences_for_loop (loop, true, &loop_nest, &datarefs,
diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c
index e412d72..0fb4c44 100644
--- a/gcc/tree-ssa-alias.c
+++ b/gcc/tree-ssa-alias.c
@@ -768,8 +768,8 @@  aliasing_component_refs_p (tree ref1,
 static bool
 nonoverlapping_component_refs_of_decl_p (tree ref1, tree ref2)
 {
-  stack_vec<tree, 16> component_refs1;
-  stack_vec<tree, 16> component_refs2;
+  auto_vec<tree, 16> component_refs1;
+  auto_vec<tree, 16> component_refs2;
 
   /* Create the stack of handled components for REF1.  */
   while (handled_component_p (ref1))
diff --git a/gcc/tree-ssa-loop-ivcanon.c b/gcc/tree-ssa-loop-ivcanon.c
index fd4ac70..2533971 100644
--- a/gcc/tree-ssa-loop-ivcanon.c
+++ b/gcc/tree-ssa-loop-ivcanon.c
@@ -1171,7 +1171,7 @@  tree_unroll_loops_completely_1 (bool may_increase_size, bool unroll_outer,
 unsigned int
 tree_unroll_loops_completely (bool may_increase_size, bool unroll_outer)
 {
-  stack_vec<loop_p, 16> father_stack;
+  auto_vec<loop_p, 16> father_stack;
   bool changed;
   int iteration = 0;
   bool irred_invalidated = false;
diff --git a/gcc/tree-ssa-phiopt.c b/gcc/tree-ssa-phiopt.c
index 11e565f..891c4d3 100644
--- a/gcc/tree-ssa-phiopt.c
+++ b/gcc/tree-ssa-phiopt.c
@@ -1715,7 +1715,7 @@  cond_if_else_store_replacement (basic_block then_bb, basic_block else_bb,
     }
 
   /* Find pairs of stores with equal LHS.  */
-  stack_vec<gimple, 1> then_stores, else_stores;
+  auto_vec<gimple, 1> then_stores, else_stores;
   FOR_EACH_VEC_ELT (then_datarefs, i, then_dr)
     {
       if (DR_IS_READ (then_dr))
diff --git a/gcc/tree-ssa-threadedge.c b/gcc/tree-ssa-threadedge.c
index cb6accf..e2eb471 100644
--- a/gcc/tree-ssa-threadedge.c
+++ b/gcc/tree-ssa-threadedge.c
@@ -690,7 +690,7 @@  propagate_threaded_block_debug_into (basic_block dest, basic_block src)
       i++;
     }
 
-  stack_vec<tree, alloc_count> fewvars;
+  auto_vec<tree, alloc_count> fewvars;
   pointer_set_t *vars = NULL;
 
   /* If we're already starting with 3/4 of alloc_count, go for a
diff --git a/gcc/tree-ssa-uncprop.c b/gcc/tree-ssa-uncprop.c
index 44194b8..1f843ab 100644
--- a/gcc/tree-ssa-uncprop.c
+++ b/gcc/tree-ssa-uncprop.c
@@ -379,7 +379,7 @@  private:
      leading to this block.  If no such edge equivalency exists, then we
      record NULL.  These equivalences are live until we leave the dominator
      subtree rooted at the block where we record the equivalency.  */
-  stack_vec<tree, 2> m_equiv_stack;
+  auto_vec<tree, 2> m_equiv_stack;
 };
 
 /* Main driver for un-cprop.  */
diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c
index ca8d3a6..3163992 100644
--- a/gcc/tree-vect-loop.c
+++ b/gcc/tree-vect-loop.c
@@ -612,7 +612,7 @@  vect_analyze_scalar_cycles_1 (loop_vec_info loop_vinfo, struct loop *loop)
 {
   basic_block bb = loop->header;
   tree init, step;
-  stack_vec<gimple, 64> worklist;
+  auto_vec<gimple, 64> worklist;
   gimple_stmt_iterator gsi;
   bool double_reduc;
 
diff --git a/gcc/tree-vect-patterns.c b/gcc/tree-vect-patterns.c
index 7823cc3..d1f8123 100644
--- a/gcc/tree-vect-patterns.c
+++ b/gcc/tree-vect-patterns.c
@@ -3213,7 +3213,7 @@  vect_pattern_recog (loop_vec_info loop_vinfo, bb_vec_info bb_vinfo)
   gimple_stmt_iterator si;
   unsigned int i, j;
   vect_recog_func_ptr vect_recog_func;
-  stack_vec<gimple, 1> stmts_to_replace;
+  auto_vec<gimple, 1> stmts_to_replace;
   gimple stmt;
 
   if (dump_enabled_p ())
diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c
index 2387c0d..d1e1796 100644
--- a/gcc/tree-vect-slp.c
+++ b/gcc/tree-vect-slp.c
@@ -2029,7 +2029,7 @@  vect_bb_vectorization_profitable_p (bb_vec_info bb_vinfo)
   /* Calculate scalar cost.  */
   FOR_EACH_VEC_ELT (slp_instances, i, instance)
     {
-      stack_vec<bool, 20> life;
+      auto_vec<bool, 20> life;
       life.safe_grow_cleared (SLP_INSTANCE_GROUP_SIZE (instance));
       scalar_cost += vect_bb_slp_scalar_cost (BB_VINFO_BB (bb_vinfo),
 					      SLP_INSTANCE_TREE (instance),
diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c
index ff7b59a..3bae7ec 100644
--- a/gcc/tree-vect-stmts.c
+++ b/gcc/tree-vect-stmts.c
@@ -609,7 +609,7 @@  vect_mark_stmts_to_be_vectorized (loop_vec_info loop_vinfo)
     dump_printf_loc (MSG_NOTE, vect_location,
                      "=== vect_mark_stmts_to_be_vectorized ===\n");
 
-  stack_vec<gimple, 64> worklist;
+  auto_vec<gimple, 64> worklist;
 
   /* 1. Init worklist.  */
   for (i = 0; i < nbbs; i++)
@@ -6129,8 +6129,8 @@  vectorizable_condition (gimple stmt, gimple_stmt_iterator *gsi,
 	{
           if (slp_node)
             {
-              stack_vec<tree, 4> ops;
-	      stack_vec<vec<tree>, 4> vec_defs;
+              auto_vec<tree, 4> ops;
+	      auto_vec<vec<tree>, 4> vec_defs;
 
               ops.safe_push (TREE_OPERAND (cond_expr, 0));
               ops.safe_push (TREE_OPERAND (cond_expr, 1));
diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c
index 7d4a983..13b877a 100644
--- a/gcc/var-tracking.c
+++ b/gcc/var-tracking.c
@@ -7930,7 +7930,7 @@  struct expand_loc_callback_data
 
   /* Stack of values and debug_exprs under expansion, and their
      children.  */
-  stack_vec<rtx, 4> expanding;
+  auto_vec<rtx, 4> expanding;
 
   /* Stack of values and debug_exprs whose expansion hit recursion
      cycles.  They will have VALUE_RECURSED_INTO marked when added to
@@ -7938,7 +7938,7 @@  struct expand_loc_callback_data
      resolves to a valid location.  So, if the flag remains set at the
      end of the search, we know no valid location for this one can
      possibly exist.  */
-  stack_vec<rtx, 4> pending;
+  auto_vec<rtx, 4> pending;
 
   /* The maximum depth among the sub-expressions under expansion.
      Zero indicates no expansion so far.  */
@@ -8885,7 +8885,7 @@  process_changed_values (variable_table_type htab)
 {
   int i, n;
   rtx val;
-  stack_vec<rtx, 20> changed_values_stack;
+  auto_vec<rtx, 20> changed_values_stack;
 
   /* Move values from changed_variables to changed_values_stack.  */
   changed_variables
diff --git a/gcc/vec.h b/gcc/vec.h
index 0345585..afde351 100644
--- a/gcc/vec.h
+++ b/gcc/vec.h
@@ -1184,25 +1184,17 @@  public:
 };
 
 
-/* auto_vec is a sub class of vec whose storage is released when it is
-  destroyed. */
-template<typename T>
+/* auto_vec is a subclass of vec that automatically manages creating and
+   releasing the internal vector. If N is non zero then it has N elements of
+   internal storage.  The default is no internal storage, and you probably only
+   want to ask for internal storage for vectors on the stack because if the
+   size of the vector is larger than the internal storage that space is wasted.
+   */
+template<typename T, size_t N = 0>
 class auto_vec : public vec<T, va_heap>
 {
 public:
-  auto_vec () { this->m_vec = NULL; }
-  auto_vec (size_t n) { this->create (n); }
-  ~auto_vec () { this->release (); }
-};
-
-/* stack_vec is a subclass of vec containing N elements of internal storage.
-  You probably only want to allocate this on the stack because if the array
-  ends up being larger or much smaller than N it will be wasting space. */
-template<typename T, size_t N>
-class stack_vec : public vec<T, va_heap>
-{
-public:
-  stack_vec ()
+  auto_vec ()
   {
     m_header.m_alloc = N;
     m_header.m_has_auto_buf = 1;
@@ -1210,7 +1202,7 @@  public:
     this->m_vec = reinterpret_cast<vec<T, va_heap, vl_embed> *> (&m_header);
   }
 
-  ~stack_vec ()
+  ~auto_vec ()
   {
     this->release ();
   }
@@ -1222,6 +1214,17 @@  private:
   T m_data[N];
 };
 
+/* auto_vec is a sub class of vec whose storage is released when it is
+  destroyed. */
+template<typename T>
+class auto_vec<T, 0> : public vec<T, va_heap>
+{
+public:
+  auto_vec () { this->m_vec = NULL; }
+  auto_vec (size_t n) { this->create (n); }
+  ~auto_vec () { this->release (); }
+};
+
 
 /* Allocate heap memory for pointer V and create the internal vector
    with space for NELEMS elements.  If NELEMS is 0, the internal
@@ -1421,7 +1424,7 @@  vec<T, va_heap, vl_ptr>::release (void)
 
   if (using_auto_storage ())
     {
-      static_cast<stack_vec<T, 1> *> (this)->m_header.m_num = 0;
+      static_cast<auto_vec<T, 1> *> (this)->m_header.m_num = 0;
       return;
     }
 
@@ -1654,7 +1657,7 @@  vec<T, va_heap, vl_ptr>::using_auto_storage () const
     return false;
 
   const vec_prefix *auto_header
-    = &static_cast<const stack_vec<T, 1> *> (this)->m_header;
+    = &static_cast<const auto_vec<T, 1> *> (this)->m_header;
   return reinterpret_cast<vec_prefix *> (m_vec) == auto_header;
 }