[PATCH] merge auto_vec and stack_vec
Richard Biener
richard.guenther@gmail.com
Fri Dec 20 13:19:00 GMT 2013
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
>
More information about the Gcc-patches
mailing list