diff options
author | Richard Sandiford <richard.sandiford@linaro.org> | 2017-12-07 18:40:50 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2017-12-07 18:40:50 +0000 |
commit | 5ebaa4774fb6de458422c660ae11f1c3b7d96262 (patch) | |
tree | 7f5cb9043bbc4cb3bbc2359234b0e6bd0eb216f1 /gcc/fold-const.c | |
parent | 734914b6e230b78eb6c34fbd5a2d93b1a919d36a (diff) | |
download | gcc-5ebaa4774fb6de458422c660ae11f1c3b7d96262.zip gcc-5ebaa4774fb6de458422c660ae11f1c3b7d96262.tar.gz gcc-5ebaa4774fb6de458422c660ae11f1c3b7d96262.tar.bz2 |
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 <richard.sandiford@linaro.org>
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
Diffstat (limited to 'gcc/fold-const.c')
-rw-r--r-- | gcc/fold-const.c | 35 |
1 files changed, 18 insertions, 17 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 2df7863..87f07bf 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -81,6 +81,7 @@ along with GCC; see the file COPYING3. If not see #include "selftest.h" #include "stringpool.h" #include "attribs.h" +#include "tree-vector-builder.h" /* Nonzero if we are folding constants inside an initializer; zero otherwise. */ @@ -1507,7 +1508,7 @@ const_binop (enum tree_code code, tree type, tree arg1, tree arg2) gcc_assert (in_nelts == VECTOR_CST_NELTS (arg2) && out_nelts == TYPE_VECTOR_SUBPARTS (type)); - auto_vec<tree, 32> elts (out_nelts); + tree_vector_builder elts (type, out_nelts, 1); for (i = 0; i < out_nelts; i++) { tree elt = (i < in_nelts @@ -1521,7 +1522,7 @@ const_binop (enum tree_code code, tree type, tree arg1, tree arg2) elts.quick_push (elt); } - return build_vector (type, elts); + return elts.build (); } case VEC_WIDEN_MULT_LO_EXPR: @@ -1548,7 +1549,7 @@ const_binop (enum tree_code code, tree type, tree arg1, tree arg2) else /* if (code == VEC_WIDEN_MULT_ODD_EXPR) */ scale = 1, ofs = 1; - auto_vec<tree, 32> elts (out_nelts); + tree_vector_builder elts (type, out_nelts, 1); for (out = 0; out < out_nelts; out++) { unsigned int in = (out << scale) + ofs; @@ -1565,7 +1566,7 @@ const_binop (enum tree_code code, tree type, tree arg1, tree arg2) elts.quick_push (elt); } - return build_vector (type, elts); + return elts.build (); } default:; @@ -1704,7 +1705,7 @@ const_unop (enum tree_code code, tree type, tree arg0) else subcode = FLOAT_EXPR; - auto_vec<tree, 32> elts (out_nelts); + tree_vector_builder elts (type, out_nelts, 1); for (i = 0; i < out_nelts; i++) { tree elt = fold_convert_const (subcode, TREE_TYPE (type), @@ -1714,7 +1715,7 @@ const_unop (enum tree_code code, tree type, tree arg0) elts.quick_push (elt); } - return build_vector (type, elts); + return elts.build (); } default: @@ -7377,7 +7378,7 @@ native_interpret_vector (tree type, const unsigned char *ptr, int len) if (size * count > len) return NULL_TREE; - auto_vec<tree, 32> elements (count); + tree_vector_builder elements (type, count, 1); for (i = 0; i < count; ++i) { elem = native_interpret_expr (etype, ptr+(i*size), size); @@ -7385,7 +7386,7 @@ native_interpret_vector (tree type, const unsigned char *ptr, int len) return NULL_TREE; elements.quick_push (elem); } - return build_vector (type, elements); + return elements.build (); } @@ -8755,7 +8756,7 @@ fold_vec_perm (tree type, tree arg0, tree arg1, vec_perm_indices sel) || !vec_cst_ctor_to_array (arg1, nelts, in_elts + nelts)) return NULL_TREE; - auto_vec<tree, 32> out_elts (nelts); + tree_vector_builder out_elts (type, nelts, 1); for (i = 0; i < nelts; i++) { if (!CONSTANT_CLASS_P (in_elts[sel[i]])) @@ -8772,7 +8773,7 @@ fold_vec_perm (tree type, tree arg0, tree arg1, vec_perm_indices sel) return build_constructor (type, v); } else - return build_vector (type, out_elts); + return out_elts.build (); } /* Try to fold a pointer difference of type TYPE two address expressions of @@ -11426,10 +11427,10 @@ fold_ternary_loc (location_t loc, enum tree_code code, tree type, if (n == 1) return VECTOR_CST_ELT (arg0, idx); - auto_vec<tree, 32> vals (n); + tree_vector_builder vals (type, n, 1); for (unsigned i = 0; i < n; ++i) vals.quick_push (VECTOR_CST_ELT (arg0, idx + i)); - return build_vector (type, vals); + return vals.build (); } } } @@ -11565,10 +11566,10 @@ fold_ternary_loc (location_t loc, enum tree_code code, tree type, if (need_mask_canon && arg2 == op2) { tree eltype = TREE_TYPE (TREE_TYPE (arg2)); - auto_vec<tree, 32> tsel (nelts); + tree_vector_builder tsel (TREE_TYPE (arg2), nelts, 1); for (i = 0; i < nelts; i++) tsel.quick_push (build_int_cst (eltype, sel[i])); - op2 = build_vector (TREE_TYPE (arg2), tsel); + op2 = tsel.build (); changed = true; } @@ -11608,11 +11609,11 @@ fold_ternary_loc (location_t loc, enum tree_code code, tree type, else { unsigned int nelts = VECTOR_CST_NELTS (arg0); - auto_vec<tree, 32> elts (nelts); + tree_vector_builder elts (type, nelts, 1); elts.quick_grow (nelts); - for (unsigned int i = 0; i < VECTOR_CST_NELTS (arg0); ++i) + for (unsigned int i = 0; i < nelts; ++i) elts[i] = (i == k ? arg1 : VECTOR_CST_ELT (arg0, i)); - return build_vector (type, elts); + return elts.build (); } } } |