From 5ebaa4774fb6de458422c660ae11f1c3b7d96262 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Thu, 7 Dec 2017 18:40:50 +0000 Subject: Use tree_vector_builder instead of build_vector This patch switches most build_vector calls over to tree_vector_builder, using explicit encodings where appropriate. Later patches handle the remaining uses of build_vector. 2017-12-07 Richard Sandiford gcc/ * config/sparc/sparc.c: Include tree-vector-builder.h. (sparc_fold_builtin): Use tree_vector_builder instead of build_vector. * expmed.c: Include tree-vector-builder.h. (make_tree): Use tree_vector_builder instead of build_vector. * fold-const.c: Include tree-vector-builder.h. (const_binop): Use tree_vector_builder instead of build_vector. (const_unop): Likewise. (native_interpret_vector): Likewise. (fold_vec_perm): Likewise. (fold_ternary_loc): Likewise. * gimple-fold.c: Include tree-vector-builder.h. (gimple_fold_stmt_to_constant_1): Use tree_vector_builder instead of build_vector. * tree-ssa-forwprop.c: Include tree-vector-builder.h. (simplify_vector_constructor): Use tree_vector_builder instead of build_vector. * tree-vect-generic.c: Include tree-vector-builder.h. (add_rshift): Use tree_vector_builder instead of build_vector. (expand_vector_divmod): Likewise. (optimize_vector_constructor): Likewise. * tree-vect-loop.c: Include tree-vector-builder.h. (vect_create_epilog_for_reduction): Use tree_vector_builder instead of build_vector. Explicitly use a stepped encoding for { 1, 2, 3, ... }. * tree-vect-slp.c: Include tree-vector-builder.h. (vect_get_constant_vectors): Use tree_vector_builder instead of build_vector. (vect_transform_slp_perm_load): Likewise. (vect_schedule_slp_instance): Likewise. * tree-vect-stmts.c: Include tree-vector-builder.h. (vectorizable_bswap): Use tree_vector_builder instead of build_vector. (vect_gen_perm_mask_any): Likewise. (vectorizable_call): Likewise. Explicitly use a stepped encoding. * tree.c: (build_vector_from_ctor): Use tree_vector_builder instead of build_vector. (build_vector_from_val): Likewise. Explicitly use a duplicate encoding. From-SVN: r255475 --- gcc/tree-vect-stmts.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) (limited to 'gcc/tree-vect-stmts.c') diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c index 0b9f4e6..ee2f1ca 100644 --- a/gcc/tree-vect-stmts.c +++ b/gcc/tree-vect-stmts.c @@ -48,6 +48,7 @@ along with GCC; see the file COPYING3. If not see #include "tree-vectorizer.h" #include "builtins.h" #include "internal-fn.h" +#include "tree-vector-builder.h" /* For lang_hooks.types.type_for_mode. */ #include "langhooks.h" @@ -2520,10 +2521,10 @@ vectorizable_bswap (gimple *stmt, gimple_stmt_iterator *gsi, return true; } - auto_vec telts (num_bytes); + tree_vector_builder telts (char_vectype, num_bytes, 1); for (unsigned i = 0; i < num_bytes; ++i) telts.quick_push (build_int_cst (char_type_node, elts[i])); - tree bswap_vconst = build_vector (char_vectype, telts); + tree bswap_vconst = telts.build (); /* Transform. */ vec vec_oprnds = vNULL; @@ -2941,11 +2942,11 @@ vectorizable_call (gimple *gs, gimple_stmt_iterator *gsi, gimple **vec_stmt, if (gimple_call_internal_p (stmt) && gimple_call_internal_fn (stmt) == IFN_GOMP_SIMD_LANE) { - auto_vec v (nunits_out); - for (int k = 0; k < nunits_out; ++k) + tree_vector_builder v (vectype_out, 1, 3); + for (int k = 0; k < 3; ++k) v.quick_push (build_int_cst (unsigned_type_node, j * nunits_out + k)); - tree cst = build_vector (vectype_out, v); + tree cst = v.build (); tree new_var = vect_get_new_ssa_name (vectype_out, vect_simple_var, "cst_"); gimple *init_stmt = gimple_build_assign (new_var, cst); @@ -6507,7 +6508,7 @@ vectorizable_store (gimple *stmt, gimple_stmt_iterator *gsi, gimple **vec_stmt, tree vect_gen_perm_mask_any (tree vectype, vec_perm_indices sel) { - tree mask_elt_type, mask_type, mask_vec; + tree mask_elt_type, mask_type; unsigned int nunits = sel.length (); gcc_checking_assert (nunits == TYPE_VECTOR_SUBPARTS (vectype)); @@ -6516,12 +6517,10 @@ vect_gen_perm_mask_any (tree vectype, vec_perm_indices sel) (int_mode_for_mode (TYPE_MODE (TREE_TYPE (vectype))).require (), 1); mask_type = get_vectype_for_scalar_type (mask_elt_type); - auto_vec mask_elts (nunits); + tree_vector_builder mask_elts (mask_type, nunits, 1); for (unsigned int i = 0; i < nunits; ++i) mask_elts.quick_push (build_int_cst (mask_elt_type, sel[i])); - mask_vec = build_vector (mask_type, mask_elts); - - return mask_vec; + return mask_elts.build (); } /* Checked version of vect_gen_perm_mask_any. Asserts can_vec_perm_p, -- cgit v1.1