Use vec<> in build_vector
authorRichard Sandiford <richard.sandiford@linaro.org>
Thu, 14 Sep 2017 15:46:08 +0000 (15:46 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Thu, 14 Sep 2017 15:46:08 +0000 (15:46 +0000)
This patch makes build_vector take the elements as a vec<> rather
than a tree *.  This is useful for SVE because it bundles the number
of elements with the elements themselves, and enforces the fact that
the number is constant.  Also, I think things like the folds can be used
with any generic GNU vector, not just those that match machine vectors,
so the arguments to XALLOCAVEC had no clear limit.

2017-09-14  Richard Sandiford  <richard.sandiford@linaro.org>
    Alan Hayward  <alan.hayward@arm.com>
    David Sherwood  <david.sherwood@arm.com>

gcc/
* tree.h (build_vector): Take a vec<tree> instead of a tree *.
* tree.c (build_vector): Likewise.
(build_vector_from_ctor): Update accordingly.
(build_vector_from_val): Likewise.
* gimple-fold.c (gimple_fold_stmt_to_constant_1): Likewise.
* tree-ssa-forwprop.c (simplify_vector_constructor): Likewise.
* tree-vect-generic.c (add_rshift): Likewise.
(expand_vector_divmod): Likewise.
(optimize_vector_constructor): Likewise.
* tree-vect-slp.c (vect_get_constant_vectors): Likewise.
(vect_transform_slp_perm_load): Likewise.
(vect_schedule_slp_instance): Likewise.
* tree-vect-stmts.c (vectorizable_bswap): Likewise.
(vectorizable_call): Likewise.
(vect_gen_perm_mask_any): Likewise.  Add elements in order.
* expmed.c (make_tree): Likewise.
* fold-const.c (fold_negate_expr_1): Use auto_vec<tree> when building
a vector passed to build_vector.
(fold_convert_const): Likewise.
(exact_inverse): Likewise.
(fold_ternary_loc): Likewise.
(fold_relational_const): Likewise.
(const_binop): Likewise.  Use VECTOR_CST_ELT directly when operating
on VECTOR_CSTs, rather than going through vec_cst_ctor_to_array.
(const_unop): Likewise.  Store the reduction accumulator in a
variable rather than an array.
(vec_cst_ctor_to_array): Take the number of elements as a parameter.
(fold_vec_perm): Update calls accordingly.  Use auto_vec<tree> for
the new vector, rather than constructing it after the input arrays.
(native_interpret_vector): Use auto_vec<tree> when building
a vector passed to build_vector.  Add elements in order.
* tree-vect-loop.c (get_initial_defs_for_reduction): Use
auto_vec<tree> when building a vector passed to build_vector.
(vect_create_epilog_for_reduction): Likewise.
(vectorizable_induction): Likewise.
(get_initial_def_for_reduction): Likewise.  Fix indentation of
case statements.
* config/sparc/sparc.c (sparc_handle_vis_mul8x16): Change n_elts
to a vec<tree> *.
(sparc_fold_builtin): Use auto_vec<tree> when building a vector
passed to build_vector.

Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
Co-Authored-By: David Sherwood <david.sherwood@arm.com>
From-SVN: r252760

12 files changed:
gcc/ChangeLog
gcc/config/sparc/sparc.c
gcc/expmed.c
gcc/fold-const.c
gcc/gimple-fold.c
gcc/tree-ssa-forwprop.c
gcc/tree-vect-generic.c
gcc/tree-vect-loop.c
gcc/tree-vect-slp.c
gcc/tree-vect-stmts.c
gcc/tree.c
gcc/tree.h

index fb9c448efafc541a02fc3c5dc2b06a59d835504a..b52eced6e1a6be862599dc9b3a114dbc51097af9 100644 (file)
@@ -1,3 +1,49 @@
+2017-09-14  Richard Sandiford  <richard.sandiford@linaro.org>
+           Alan Hayward  <alan.hayward@arm.com>
+           David Sherwood  <david.sherwood@arm.com>
+
+       * tree.h (build_vector): Take a vec<tree> instead of a tree *.
+       * tree.c (build_vector): Likewise.
+       (build_vector_from_ctor): Update accordingly.
+       (build_vector_from_val): Likewise.
+       * gimple-fold.c (gimple_fold_stmt_to_constant_1): Likewise.
+       * tree-ssa-forwprop.c (simplify_vector_constructor): Likewise.
+       * tree-vect-generic.c (add_rshift): Likewise.
+       (expand_vector_divmod): Likewise.
+       (optimize_vector_constructor): Likewise.
+       * tree-vect-slp.c (vect_get_constant_vectors): Likewise.
+       (vect_transform_slp_perm_load): Likewise.
+       (vect_schedule_slp_instance): Likewise.
+       * tree-vect-stmts.c (vectorizable_bswap): Likewise.
+       (vectorizable_call): Likewise.
+       (vect_gen_perm_mask_any): Likewise.  Add elements in order.
+       * expmed.c (make_tree): Likewise.
+       * fold-const.c (fold_negate_expr_1): Use auto_vec<tree> when building
+       a vector passed to build_vector.
+       (fold_convert_const): Likewise.
+       (exact_inverse): Likewise.
+       (fold_ternary_loc): Likewise.
+       (fold_relational_const): Likewise.
+       (const_binop): Likewise.  Use VECTOR_CST_ELT directly when operating
+       on VECTOR_CSTs, rather than going through vec_cst_ctor_to_array.
+       (const_unop): Likewise.  Store the reduction accumulator in a
+       variable rather than an array.
+       (vec_cst_ctor_to_array): Take the number of elements as a parameter.
+       (fold_vec_perm): Update calls accordingly.  Use auto_vec<tree> for
+       the new vector, rather than constructing it after the input arrays.
+       (native_interpret_vector): Use auto_vec<tree> when building
+       a vector passed to build_vector.  Add elements in order.
+       * tree-vect-loop.c (get_initial_defs_for_reduction): Use
+       auto_vec<tree> when building a vector passed to build_vector.
+       (vect_create_epilog_for_reduction): Likewise.
+       (vectorizable_induction): Likewise.
+       (get_initial_def_for_reduction): Likewise.  Fix indentation of
+       case statements.
+       * config/sparc/sparc.c (sparc_handle_vis_mul8x16): Change n_elts
+       to a vec<tree> *.
+       (sparc_fold_builtin): Use auto_vec<tree> when building a vector
+       passed to build_vector.
+
 2017-09-14  Richard Sandiford  <richard.sandiford@linaro.org>
            Alan Hayward  <alan.hayward@arm.com>
            David Sherwood  <david.sherwood@arm.com>
index aa66f24f1b3d32383da0144e3fa6464dede12e0f..53689a1ccfa27fb39d4d80997b3640b8c3cd0673 100644 (file)
@@ -11446,7 +11446,7 @@ sparc_vis_mul8x16 (int e8, int e16)
    the result into the array N_ELTS, whose elements are of INNER_TYPE.  */
 
 static void
-sparc_handle_vis_mul8x16 (tree *n_elts, enum sparc_builtins fncode,
+sparc_handle_vis_mul8x16 (vec<tree> *n_elts, enum sparc_builtins fncode,
                          tree inner_type, tree cst0, tree cst1)
 {
   unsigned i, num = VECTOR_CST_NELTS (cst0);
@@ -11460,7 +11460,7 @@ sparc_handle_vis_mul8x16 (tree *n_elts, enum sparc_builtins fncode,
          int val
            = sparc_vis_mul8x16 (TREE_INT_CST_LOW (VECTOR_CST_ELT (cst0, i)),
                                 TREE_INT_CST_LOW (VECTOR_CST_ELT (cst1, i)));
-         n_elts[i] = build_int_cst (inner_type, val);
+         n_elts->quick_push (build_int_cst (inner_type, val));
        }
       break;
 
@@ -11472,7 +11472,7 @@ sparc_handle_vis_mul8x16 (tree *n_elts, enum sparc_builtins fncode,
          int val
            = sparc_vis_mul8x16 (TREE_INT_CST_LOW (VECTOR_CST_ELT (cst0, i)),
                                 scale);
-         n_elts[i] = build_int_cst (inner_type, val);
+         n_elts->quick_push (build_int_cst (inner_type, val));
        }
       break;
 
@@ -11484,7 +11484,7 @@ sparc_handle_vis_mul8x16 (tree *n_elts, enum sparc_builtins fncode,
          int val
            = sparc_vis_mul8x16 (TREE_INT_CST_LOW (VECTOR_CST_ELT (cst0, i)),
                                 scale);
-         n_elts[i] = build_int_cst (inner_type, val);
+         n_elts->quick_push (build_int_cst (inner_type, val));
        }
       break;
 
@@ -11533,14 +11533,15 @@ sparc_fold_builtin (tree fndecl, int n_args ATTRIBUTE_UNUSED,
       if (TREE_CODE (arg0) == VECTOR_CST)
        {
          tree inner_type = TREE_TYPE (rtype);
-         tree *n_elts;
          unsigned i;
 
-         n_elts = XALLOCAVEC (tree, VECTOR_CST_NELTS (arg0));
+         auto_vec<tree, 32> n_elts (VECTOR_CST_NELTS (arg0));
          for (i = 0; i < VECTOR_CST_NELTS (arg0); ++i)
-           n_elts[i] = build_int_cst (inner_type,
-                                      TREE_INT_CST_LOW
-                                        (VECTOR_CST_ELT (arg0, i)) << 4);
+           {
+             unsigned HOST_WIDE_INT val
+               = TREE_INT_CST_LOW (VECTOR_CST_ELT (arg0, i));
+             n_elts.quick_push (build_int_cst (inner_type, val << 4));
+           }
          return build_vector (rtype, n_elts);
        }
       break;
@@ -11556,8 +11557,8 @@ sparc_fold_builtin (tree fndecl, int n_args ATTRIBUTE_UNUSED,
       if (TREE_CODE (arg0) == VECTOR_CST && TREE_CODE (arg1) == VECTOR_CST)
        {
          tree inner_type = TREE_TYPE (rtype);
-         tree *n_elts = XALLOCAVEC (tree, VECTOR_CST_NELTS (arg0));
-         sparc_handle_vis_mul8x16 (n_elts, code, inner_type, arg0, arg1);
+         auto_vec<tree, 32> n_elts (VECTOR_CST_NELTS (arg0));
+         sparc_handle_vis_mul8x16 (&n_elts, code, inner_type, arg0, arg1);
          return build_vector (rtype, n_elts);
        }
       break;
@@ -11570,12 +11571,12 @@ sparc_fold_builtin (tree fndecl, int n_args ATTRIBUTE_UNUSED,
 
       if (TREE_CODE (arg0) == VECTOR_CST && TREE_CODE (arg1) == VECTOR_CST)
        {
-         tree *n_elts = XALLOCAVEC (tree, 2 * VECTOR_CST_NELTS (arg0));
+         auto_vec<tree, 32> n_elts (2 * VECTOR_CST_NELTS (arg0));
          unsigned i;
          for (i = 0; i < VECTOR_CST_NELTS (arg0); ++i)
            {
-             n_elts[2*i] = VECTOR_CST_ELT (arg0, i);
-             n_elts[2*i+1] = VECTOR_CST_ELT (arg1, i);
+             n_elts.quick_push (VECTOR_CST_ELT (arg0, i));
+             n_elts.quick_push (VECTOR_CST_ELT (arg1, i));
            }
 
          return build_vector (rtype, n_elts);
index f81163e15a56af4b06cb1ce6e644f60b4f9e35aa..b9d31921047d00eff57d9bc37f851ce00ebe4613 100644 (file)
@@ -5180,15 +5180,14 @@ make_tree (tree type, rtx x)
       {
        int units = CONST_VECTOR_NUNITS (x);
        tree itype = TREE_TYPE (type);
-       tree *elts;
        int i;
 
        /* Build a tree with vector elements.  */
-       elts = XALLOCAVEC (tree, units);
-       for (i = units - 1; i >= 0; --i)
+       auto_vec<tree, 32> elts (units);
+       for (i = 0; i < units; ++i)
          {
            rtx elt = CONST_VECTOR_ELT (x, i);
-           elts[i] = make_tree (itype, elt);
+           elts.quick_push (make_tree (itype, elt));
          }
 
        return build_vector (type, elts);
index 66e7cc7b189fa3a3f8865582f232f2258198e2db..013081da673999a94a1881d6885fc9194b064e87 100644 (file)
@@ -136,7 +136,6 @@ static tree fold_not_const (const_tree, tree);
 static tree fold_relational_const (enum tree_code, tree, tree, tree);
 static tree fold_convert_const (enum tree_code, tree, tree);
 static tree fold_view_convert_expr (tree, tree);
-static bool vec_cst_ctor_to_array (tree, tree *);
 static tree fold_negate_expr (location_t, tree);
 
 
@@ -565,13 +564,14 @@ fold_negate_expr_1 (location_t loc, tree t)
     case VECTOR_CST:
       {
        int count = VECTOR_CST_NELTS (t), i;
-       tree *elts = XALLOCAVEC (tree, count);
 
+       auto_vec<tree, 32> elts (count);
        for (i = 0; i < count; i++)
          {
-           elts[i] = fold_negate_expr (loc, VECTOR_CST_ELT (t, i));
-           if (elts[i] == NULL_TREE)
+           tree elt = fold_negate_expr (loc, VECTOR_CST_ELT (t, i));
+           if (elt == NULL_TREE)
              return NULL_TREE;
+           elts.quick_push (elt);
          }
 
        return build_vector (type, elts);
@@ -1414,19 +1414,20 @@ const_binop (enum tree_code code, tree arg1, tree arg2)
     {
       tree type = TREE_TYPE (arg1);
       int count = VECTOR_CST_NELTS (arg1), i;
-      tree *elts = XALLOCAVEC (tree, count);
 
+      auto_vec<tree, 32> elts (count);
       for (i = 0; i < count; i++)
        {
          tree elem1 = VECTOR_CST_ELT (arg1, i);
          tree elem2 = VECTOR_CST_ELT (arg2, i);
 
-         elts[i] = const_binop (code, elem1, elem2);
+         tree elt = const_binop (code, elem1, elem2);
 
          /* It is possible that const_binop cannot handle the given
             code and return NULL_TREE */
-         if (elts[i] == NULL_TREE)
+         if (elt == NULL_TREE)
            return NULL_TREE;
+         elts.quick_push (elt);
        }
 
       return build_vector (type, elts);
@@ -1438,18 +1439,19 @@ const_binop (enum tree_code code, tree arg1, tree arg2)
     {
       tree type = TREE_TYPE (arg1);
       int count = VECTOR_CST_NELTS (arg1), i;
-      tree *elts = XALLOCAVEC (tree, count);
 
+      auto_vec<tree, 32> elts (count);
       for (i = 0; i < count; i++)
        {
          tree elem1 = VECTOR_CST_ELT (arg1, i);
 
-         elts[i] = const_binop (code, elem1, arg2);
+         tree elt = const_binop (code, elem1, arg2);
 
          /* It is possible that const_binop cannot handle the given
             code and return NULL_TREE.  */
-         if (elts[i] == NULL_TREE)
+         if (elt == NULL_TREE)
            return NULL_TREE;
+         elts.quick_push (elt);
        }
 
       return build_vector (type, elts);
@@ -1481,7 +1483,6 @@ const_binop (enum tree_code code, tree type, tree arg1, tree arg2)
     case VEC_PACK_TRUNC_EXPR:
     case VEC_PACK_FIX_TRUNC_EXPR:
       {
-       tree *elts;
        unsigned int out_nelts, in_nelts, i;
 
        if (TREE_CODE (arg1) != VECTOR_CST
@@ -1493,18 +1494,18 @@ 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));
 
-       elts = XALLOCAVEC (tree, out_nelts);
-       if (!vec_cst_ctor_to_array (arg1, elts)
-           || !vec_cst_ctor_to_array (arg2, elts + in_nelts))
-         return NULL_TREE;
-
+       auto_vec<tree, 32> elts (out_nelts);
        for (i = 0; i < out_nelts; i++)
          {
-           elts[i] = fold_convert_const (code == VEC_PACK_TRUNC_EXPR
-                                         ? NOP_EXPR : FIX_TRUNC_EXPR,
-                                         TREE_TYPE (type), elts[i]);
-           if (elts[i] == NULL_TREE || !CONSTANT_CLASS_P (elts[i]))
+           tree elt = (i < in_nelts
+                       ? VECTOR_CST_ELT (arg1, i)
+                       : VECTOR_CST_ELT (arg2, i - in_nelts));
+           elt = fold_convert_const (code == VEC_PACK_TRUNC_EXPR
+                                     ? NOP_EXPR : FIX_TRUNC_EXPR,
+                                     TREE_TYPE (type), elt);
+           if (elt == NULL_TREE || !CONSTANT_CLASS_P (elt))
              return NULL_TREE;
+           elts.quick_push (elt);
          }
 
        return build_vector (type, elts);
@@ -1516,7 +1517,6 @@ const_binop (enum tree_code code, tree type, tree arg1, tree arg2)
     case VEC_WIDEN_MULT_ODD_EXPR:
       {
        unsigned int out_nelts, in_nelts, out, ofs, scale;
-       tree *elts;
 
        if (TREE_CODE (arg1) != VECTOR_CST || TREE_CODE (arg2) != VECTOR_CST)
          return NULL_TREE;
@@ -1526,11 +1526,6 @@ 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));
 
-       elts = XALLOCAVEC (tree, in_nelts * 2);
-       if (!vec_cst_ctor_to_array (arg1, elts)
-           || !vec_cst_ctor_to_array (arg2, elts + in_nelts))
-         return NULL_TREE;
-
        if (code == VEC_WIDEN_MULT_LO_EXPR)
          scale = 0, ofs = BYTES_BIG_ENDIAN ? out_nelts : 0;
        else if (code == VEC_WIDEN_MULT_HI_EXPR)
@@ -1540,20 +1535,21 @@ 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);
        for (out = 0; out < out_nelts; out++)
          {
-           unsigned int in1 = (out << scale) + ofs;
-           unsigned int in2 = in1 + in_nelts;
-           tree t1, t2;
-
-           t1 = fold_convert_const (NOP_EXPR, TREE_TYPE (type), elts[in1]);
-           t2 = fold_convert_const (NOP_EXPR, TREE_TYPE (type), elts[in2]);
+           unsigned int in = (out << scale) + ofs;
+           tree t1 = fold_convert_const (NOP_EXPR, TREE_TYPE (type),
+                                         VECTOR_CST_ELT (arg1, in));
+           tree t2 = fold_convert_const (NOP_EXPR, TREE_TYPE (type),
+                                         VECTOR_CST_ELT (arg2, in));
 
            if (t1 == NULL_TREE || t2 == NULL_TREE)
              return NULL_TREE;
-           elts[out] = const_binop (MULT_EXPR, t1, t2);
-           if (elts[out] == NULL_TREE || !CONSTANT_CLASS_P (elts[out]))
+           tree elt = const_binop (MULT_EXPR, t1, t2);
+           if (elt == NULL_TREE || !CONSTANT_CLASS_P (elt))
              return NULL_TREE;
+           elts.quick_push (elt);
          }
 
        return build_vector (type, elts);
@@ -1638,18 +1634,17 @@ const_unop (enum tree_code code, tree type, tree arg0)
       /* Perform BIT_NOT_EXPR on each element individually.  */
       else if (TREE_CODE (arg0) == VECTOR_CST)
        {
-         tree *elements;
          tree elem;
          unsigned count = VECTOR_CST_NELTS (arg0), i;
 
-         elements = XALLOCAVEC (tree, count);
+         auto_vec<tree, 32> elements (count);
          for (i = 0; i < count; i++)
            {
              elem = VECTOR_CST_ELT (arg0, i);
              elem = const_unop (BIT_NOT_EXPR, TREE_TYPE (type), elem);
              if (elem == NULL_TREE)
                break;
-             elements[i] = elem;
+             elements.quick_push (elem);
            }
          if (i == count)
            return build_vector (type, elements);
@@ -1677,7 +1672,6 @@ const_unop (enum tree_code code, tree type, tree arg0)
     case VEC_UNPACK_FLOAT_HI_EXPR:
       {
        unsigned int out_nelts, in_nelts, i;
-       tree *elts;
        enum tree_code subcode;
 
        if (TREE_CODE (arg0) != VECTOR_CST)
@@ -1687,24 +1681,24 @@ const_unop (enum tree_code code, tree type, tree arg0)
        out_nelts = in_nelts / 2;
        gcc_assert (out_nelts == TYPE_VECTOR_SUBPARTS (type));
 
-       elts = XALLOCAVEC (tree, in_nelts);
-       if (!vec_cst_ctor_to_array (arg0, elts))
-         return NULL_TREE;
-
+       unsigned int offset = 0;
        if ((!BYTES_BIG_ENDIAN) ^ (code == VEC_UNPACK_LO_EXPR
                                   || code == VEC_UNPACK_FLOAT_LO_EXPR))
-         elts += out_nelts;
+         offset = out_nelts;
 
        if (code == VEC_UNPACK_LO_EXPR || code == VEC_UNPACK_HI_EXPR)
          subcode = NOP_EXPR;
        else
          subcode = FLOAT_EXPR;
 
+       auto_vec<tree, 32> elts (out_nelts);
        for (i = 0; i < out_nelts; i++)
          {
-           elts[i] = fold_convert_const (subcode, TREE_TYPE (type), elts[i]);
-           if (elts[i] == NULL_TREE || !CONSTANT_CLASS_P (elts[i]))
+           tree elt = fold_convert_const (subcode, TREE_TYPE (type),
+                                          VECTOR_CST_ELT (arg0, i + offset));
+           if (elt == NULL_TREE || !CONSTANT_CLASS_P (elt))
              return NULL_TREE;
+           elts.quick_push (elt);
          }
 
        return build_vector (type, elts);
@@ -1715,17 +1709,12 @@ const_unop (enum tree_code code, tree type, tree arg0)
     case REDUC_PLUS_EXPR:
       {
        unsigned int nelts, i;
-       tree *elts;
        enum tree_code subcode;
 
        if (TREE_CODE (arg0) != VECTOR_CST)
          return NULL_TREE;
        nelts = VECTOR_CST_NELTS (arg0);
 
-       elts = XALLOCAVEC (tree, nelts);
-       if (!vec_cst_ctor_to_array (arg0, elts))
-         return NULL_TREE;
-
        switch (code)
          {
          case REDUC_MIN_EXPR: subcode = MIN_EXPR; break;
@@ -1734,14 +1723,15 @@ const_unop (enum tree_code code, tree type, tree arg0)
          default: gcc_unreachable ();
          }
 
+       tree res = VECTOR_CST_ELT (arg0, 0);
        for (i = 1; i < nelts; i++)
          {
-           elts[0] = const_binop (subcode, elts[0], elts[i]);
-           if (elts[0] == NULL_TREE || !CONSTANT_CLASS_P (elts[0]))
+           res = const_binop (subcode, res, VECTOR_CST_ELT (arg0, i));
+           if (res == NULL_TREE || !CONSTANT_CLASS_P (res))
              return NULL_TREE;
          }
 
-       return elts[0];
+       return res;
       }
 
     default:
@@ -2163,14 +2153,14 @@ fold_convert_const (enum tree_code code, tree type, tree arg1)
        {
          int len = VECTOR_CST_NELTS (arg1);
          tree elttype = TREE_TYPE (type);
-         tree *v = XALLOCAVEC (tree, len);
+         auto_vec<tree, 32> v (len);
          for (int i = 0; i < len; ++i)
            {
              tree elt = VECTOR_CST_ELT (arg1, i);
              tree cvt = fold_convert_const (code, elttype, elt);
              if (cvt == NULL_TREE)
                return NULL_TREE;
-             v[i] = cvt;
+             v.quick_push (cvt);
            }
          return build_vector (type, v);
        }
@@ -7392,7 +7382,6 @@ native_interpret_vector (tree type, const unsigned char *ptr, int len)
 {
   tree etype, elem;
   int i, size, count;
-  tree *elements;
 
   etype = TREE_TYPE (type);
   size = GET_MODE_SIZE (SCALAR_TYPE_MODE (etype));
@@ -7400,13 +7389,13 @@ native_interpret_vector (tree type, const unsigned char *ptr, int len)
   if (size * count > len)
     return NULL_TREE;
 
-  elements = XALLOCAVEC (tree, count);
-  for (i = count - 1; i >= 0; i--)
+  auto_vec<tree, 32> elements (count);
+  for (i = 0; i < count; ++i)
     {
       elem = native_interpret_expr (etype, ptr+(i*size), size);
       if (!elem)
        return NULL_TREE;
-      elements[i] = elem;
+      elements.quick_push (elem);
     }
   return build_vector (type, elements);
 }
@@ -8761,12 +8750,13 @@ fold_mult_zconjz (location_t loc, tree type, tree expr)
 
 
 /* Helper function for fold_vec_perm.  Store elements of VECTOR_CST or
-   CONSTRUCTOR ARG into array ELTS and return true if successful.  */
+   CONSTRUCTOR ARG into array ELTS, which has NELTS elements, and return
+   true if successful.  */
 
 static bool
-vec_cst_ctor_to_array (tree arg, tree *elts)
+vec_cst_ctor_to_array (tree arg, unsigned int nelts, tree *elts)
 {
-  unsigned int nelts = TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg)), i;
+  unsigned int i;
 
   if (TREE_CODE (arg) == VECTOR_CST)
     {
@@ -8799,7 +8789,6 @@ static tree
 fold_vec_perm (tree type, tree arg0, tree arg1, const unsigned char *sel)
 {
   unsigned int nelts = TYPE_VECTOR_SUBPARTS (type), i;
-  tree *elts;
   bool need_ctor = false;
 
   gcc_assert (TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0)) == nelts
@@ -8808,16 +8797,17 @@ fold_vec_perm (tree type, tree arg0, tree arg1, const unsigned char *sel)
       || TREE_TYPE (TREE_TYPE (arg1)) != TREE_TYPE (type))
     return NULL_TREE;
 
-  elts = XALLOCAVEC (tree, nelts * 3);
-  if (!vec_cst_ctor_to_array (arg0, elts)
-      || !vec_cst_ctor_to_array (arg1, elts + nelts))
+  tree *in_elts = XALLOCAVEC (tree, nelts * 2);
+  if (!vec_cst_ctor_to_array (arg0, nelts, in_elts)
+      || !vec_cst_ctor_to_array (arg1, nelts, in_elts + nelts))
     return NULL_TREE;
 
+  auto_vec<tree, 32> out_elts (nelts);
   for (i = 0; i < nelts; i++)
     {
-      if (!CONSTANT_CLASS_P (elts[sel[i]]))
+      if (!CONSTANT_CLASS_P (in_elts[sel[i]]))
        need_ctor = true;
-      elts[i + 2 * nelts] = unshare_expr (elts[sel[i]]);
+      out_elts.quick_push (unshare_expr (in_elts[sel[i]]));
     }
 
   if (need_ctor)
@@ -8825,11 +8815,11 @@ fold_vec_perm (tree type, tree arg0, tree arg1, const unsigned char *sel)
       vec<constructor_elt, va_gc> *v;
       vec_alloc (v, nelts);
       for (i = 0; i < nelts; i++)
-       CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, elts[2 * nelts + i]);
+       CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, out_elts[i]);
       return build_constructor (type, v);
     }
   else
-    return build_vector (type, &elts[2 * nelts]);
+    return build_vector (type, out_elts);
 }
 
 /* Try to fold a pointer difference of type TYPE two address expressions of
@@ -8879,7 +8869,7 @@ tree
 exact_inverse (tree type, tree cst)
 {
   REAL_VALUE_TYPE r;
-  tree unit_type, *elts;
+  tree unit_type;
   machine_mode mode;
   unsigned vec_nelts, i;
 
@@ -8894,20 +8884,22 @@ exact_inverse (tree type, tree cst)
       return NULL_TREE;
 
     case VECTOR_CST:
-      vec_nelts = VECTOR_CST_NELTS (cst);
-      elts = XALLOCAVEC (tree, vec_nelts);
-      unit_type = TREE_TYPE (type);
-      mode = TYPE_MODE (unit_type);
+      {
+       vec_nelts = VECTOR_CST_NELTS (cst);
+       unit_type = TREE_TYPE (type);
+       mode = TYPE_MODE (unit_type);
 
-      for (i = 0; i < vec_nelts; i++)
-       {
-         r = TREE_REAL_CST (VECTOR_CST_ELT (cst, i));
-         if (!exact_real_inverse (mode, &r))
-           return NULL_TREE;
-         elts[i] = build_real (unit_type, r);
-       }
+       auto_vec<tree, 32> elts (vec_nelts);
+       for (i = 0; i < vec_nelts; i++)
+         {
+           r = TREE_REAL_CST (VECTOR_CST_ELT (cst, i));
+           if (!exact_real_inverse (mode, &r))
+             return NULL_TREE;
+           elts.quick_push (build_real (unit_type, r));
+         }
 
-      return build_vector (type, elts);
+       return build_vector (type, elts);
+      }
 
     default:
       return NULL_TREE;
@@ -11596,9 +11588,9 @@ fold_ternary_loc (location_t loc, enum tree_code code, tree type,
                  if (n == 1)
                    return VECTOR_CST_ELT (arg0, idx);
 
-                 tree *vals = XALLOCAVEC (tree, n);
+                 auto_vec<tree, 32> vals (n);
                  for (unsigned i = 0; i < n; ++i)
-                   vals[i] = VECTOR_CST_ELT (arg0, idx + i);
+                   vals.quick_push (VECTOR_CST_ELT (arg0, idx + i));
                  return build_vector (type, vals);
                }
            }
@@ -11731,10 +11723,10 @@ fold_ternary_loc (location_t loc, enum tree_code code, tree type,
 
          if (need_mask_canon && arg2 == op2)
            {
-             tree *tsel = XALLOCAVEC (tree, nelts);
              tree eltype = TREE_TYPE (TREE_TYPE (arg2));
+             auto_vec<tree, 32> tsel (nelts);
              for (i = 0; i < nelts; i++)
-               tsel[i] = build_int_cst (eltype, sel[i]);
+               tsel.quick_push (build_int_cst (eltype, sel[i]));
              op2 = build_vector (TREE_TYPE (arg2), tsel);
              changed = true;
            }
@@ -11775,8 +11767,10 @@ fold_ternary_loc (location_t loc, enum tree_code code, tree type,
              else
                {
                  unsigned int nelts = VECTOR_CST_NELTS (arg0);
-                 tree *elts = XALLOCAVEC (tree, nelts);
-                 memcpy (elts, VECTOR_CST_ELTS (arg0), sizeof (tree) * nelts);
+                 auto_vec<tree, 32> elts (nelts);
+                 elts.quick_grow (nelts);
+                 memcpy (&elts[0], VECTOR_CST_ELTS (arg0),
+                         sizeof (tree) * nelts);
                  elts[k] = arg1;
                  return build_vector (type, elts);
                }
@@ -13894,10 +13888,10 @@ fold_relational_const (enum tree_code code, tree type, tree op0, tree op1)
          return constant_boolean_node (true, type);
        }
       unsigned count = VECTOR_CST_NELTS (op0);
-      tree *elts =  XALLOCAVEC (tree, count);
       gcc_assert (VECTOR_CST_NELTS (op1) == count
                  && TYPE_VECTOR_SUBPARTS (type) == count);
 
+      auto_vec<tree, 32> elts (count);
       for (unsigned i = 0; i < count; i++)
        {
          tree elem_type = TREE_TYPE (type);
@@ -13910,7 +13904,8 @@ fold_relational_const (enum tree_code code, tree type, tree op0, tree op1)
          if (tem == NULL_TREE)
            return NULL_TREE;
 
-         elts[i] = build_int_cst (elem_type, integer_zerop (tem) ? 0 : -1);
+         elts.quick_push (build_int_cst (elem_type,
+                                         integer_zerop (tem) ? 0 : -1));
        }
 
       return build_vector (type, elts);
index 0ec225610aa207591fdcb840c6700f2d170c97cc..bde20a34bfbb12e6bbf666096b2d939ba51deff1 100644 (file)
@@ -5919,18 +5919,18 @@ gimple_fold_stmt_to_constant_1 (gimple *stmt, tree (*valueize) (tree),
                       && (CONSTRUCTOR_NELTS (rhs)
                           == TYPE_VECTOR_SUBPARTS (TREE_TYPE (rhs))))
                {
-                 unsigned i;
-                 tree val, *vec;
+                 unsigned i, nelts;
+                 tree val;
 
-                 vec = XALLOCAVEC (tree,
-                                   TYPE_VECTOR_SUBPARTS (TREE_TYPE (rhs)));
+                 nelts = TYPE_VECTOR_SUBPARTS (TREE_TYPE (rhs));
+                 auto_vec<tree, 32> vec (nelts);
                  FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (rhs), i, val)
                    {
                      val = (*valueize) (val);
                      if (TREE_CODE (val) == INTEGER_CST
                          || TREE_CODE (val) == REAL_CST
                          || TREE_CODE (val) == FIXED_CST)
-                       vec[i] = val;
+                       vec.quick_push (val);
                      else
                        return NULL_TREE;
                    }
index 529620672374d71445d0b7851747976182b1eade..82d940bd36eb7fc6c20fad1293cca1da2193a984 100644 (file)
@@ -2051,7 +2051,7 @@ simplify_vector_constructor (gimple_stmt_iterator *gsi)
     }
   else
     {
-      tree mask_type, *mask_elts;
+      tree mask_type;
 
       if (!can_vec_perm_p (TYPE_MODE (type), false, sel))
        return false;
@@ -2062,9 +2062,9 @@ simplify_vector_constructor (gimple_stmt_iterator *gsi)
          || GET_MODE_SIZE (TYPE_MODE (mask_type))
             != GET_MODE_SIZE (TYPE_MODE (type)))
        return false;
-      mask_elts = XALLOCAVEC (tree, nelts);
+      auto_vec<tree, 32> mask_elts (nelts);
       for (i = 0; i < nelts; i++)
-       mask_elts[i] = build_int_cst (TREE_TYPE (mask_type), sel[i]);
+       mask_elts.quick_push (build_int_cst (TREE_TYPE (mask_type), sel[i]));
       op2 = build_vector (mask_type, mask_elts);
       if (conv_code == ERROR_MARK)
        gimple_assign_set_rhs_with_ops (gsi, VEC_PERM_EXPR, orig, orig, op2);
index dc8b2ed38ade8343532e8f4b56b05cb53de8f6fd..1341d66deed72baa31b75fc32dbdaf14528eefb0 100644 (file)
@@ -398,9 +398,9 @@ add_rshift (gimple_stmt_iterator *gsi, tree type, tree op0, int *shiftcnts)
   if (op != unknown_optab
       && optab_handler (op, TYPE_MODE (type)) != CODE_FOR_nothing)
     {
-      tree *vec = XALLOCAVEC (tree, nunits);
+      auto_vec<tree, 32> vec (nunits);
       for (i = 0; i < nunits; i++)
-       vec[i] = build_int_cst (TREE_TYPE (type), shiftcnts[i]);
+       vec.quick_push (build_int_cst (TREE_TYPE (type), shiftcnts[i]));
       return gimplify_build2 (gsi, RSHIFT_EXPR, type, op0,
                              build_vector (type, vec));
     }
@@ -429,7 +429,6 @@ expand_vector_divmod (gimple_stmt_iterator *gsi, tree type, tree op0,
   unsigned int i;
   signop sign_p = TYPE_SIGN (TREE_TYPE (type));
   unsigned HOST_WIDE_INT mask = GET_MODE_MASK (TYPE_MODE (TREE_TYPE (type)));
-  tree *vec;
   tree cur_op, mulcst, tem;
   optab op;
 
@@ -593,8 +592,6 @@ expand_vector_divmod (gimple_stmt_iterator *gsi, tree type, tree op0,
        mode = -2;
     }
 
-  vec = XALLOCAVEC (tree, nunits);
-
   if (use_pow2)
     {
       tree addend = NULL_TREE;
@@ -638,10 +635,11 @@ expand_vector_divmod (gimple_stmt_iterator *gsi, tree type, tree op0,
              mask_type = build_same_sized_truth_vector_type (type);
              zero = build_zero_cst (type);
              cond = build2 (LT_EXPR, mask_type, op0, zero);
+             auto_vec<tree, 32> vec (nunits);
              for (i = 0; i < nunits; i++)
-               vec[i] = build_int_cst (TREE_TYPE (type),
-                                       (HOST_WIDE_INT_1U
-                                        << shifts[i]) - 1);
+               vec.quick_push (build_int_cst (TREE_TYPE (type),
+                                              (HOST_WIDE_INT_1U
+                                               << shifts[i]) - 1));
              cst = build_vector (type, vec);
              addend = make_ssa_name (type);
              stmt = gimple_build_assign (addend, VEC_COND_EXPR, cond,
@@ -676,10 +674,11 @@ expand_vector_divmod (gimple_stmt_iterator *gsi, tree type, tree op0,
       else
        {
          tree mask;
+         auto_vec<tree, 32> vec (nunits);
          for (i = 0; i < nunits; i++)
-           vec[i] = build_int_cst (TREE_TYPE (type),
-                                   (HOST_WIDE_INT_1U
-                                    << shifts[i]) - 1);
+           vec.quick_push (build_int_cst (TREE_TYPE (type),
+                                          (HOST_WIDE_INT_1U
+                                           << shifts[i]) - 1));
          mask = build_vector (type, vec);
          op = optab_for_tree_code (BIT_AND_EXPR, type, optab_default);
          if (op != unknown_optab
@@ -754,8 +753,9 @@ expand_vector_divmod (gimple_stmt_iterator *gsi, tree type, tree op0,
       return NULL_TREE;
     }
 
+  auto_vec<tree, 32> vec (nunits);
   for (i = 0; i < nunits; i++)
-    vec[i] = build_int_cst (TREE_TYPE (type), mulc[i]);
+    vec.quick_push (build_int_cst (TREE_TYPE (type), mulc[i]));
   mulcst = build_vector (type, vec);
 
   cur_op = gimplify_build2 (gsi, MULT_HIGHPART_EXPR, type, cur_op, mulcst);
@@ -1066,7 +1066,6 @@ optimize_vector_constructor (gimple_stmt_iterator *gsi)
   unsigned int i, j, nelts = TYPE_VECTOR_SUBPARTS (type);
   bool all_same = true;
   constructor_elt *elt;
-  tree *cst;
   gimple *g;
   tree base = NULL_TREE;
   optab op;
@@ -1105,22 +1104,23 @@ optimize_vector_constructor (gimple_stmt_iterator *gsi)
       }
   if (all_same)
     return;
-  cst = XALLOCAVEC (tree, nelts);
+  auto_vec<tree, 32> cst (nelts);
   for (i = 0; i < nelts; i++)
     {
-      tree this_base = CONSTRUCTOR_ELT (rhs, i)->value;;
-      cst[i] = build_zero_cst (TREE_TYPE (base));
+      tree this_base = CONSTRUCTOR_ELT (rhs, i)->value;
+      tree elt = build_zero_cst (TREE_TYPE (base));
       while (this_base != base)
        {
          g = SSA_NAME_DEF_STMT (this_base);
-         cst[i] = fold_binary (PLUS_EXPR, TREE_TYPE (base),
-                               cst[i], gimple_assign_rhs2 (g));
-         if (cst[i] == NULL_TREE
-             || TREE_CODE (cst[i]) != INTEGER_CST
-             || TREE_OVERFLOW (cst[i]))
+         elt = fold_binary (PLUS_EXPR, TREE_TYPE (base),
+                            elt, gimple_assign_rhs2 (g));
+         if (elt == NULL_TREE
+             || TREE_CODE (elt) != INTEGER_CST
+             || TREE_OVERFLOW (elt))
            return;
          this_base = gimple_assign_rhs1 (g);
        }
+      cst.quick_push (elt);
     }
   for (i = 0; i < nelts; i++)
     CONSTRUCTOR_ELT (rhs, i)->value = base;
index 5a1d9ff7a5a4fae50b0c4509cc741087960ac826..3b4a71eba894caf408855ea67a74a3b99da4ec1f 100644 (file)
@@ -3969,7 +3969,6 @@ get_initial_def_for_reduction (gimple *stmt, tree init_val,
   enum tree_code code = gimple_assign_rhs_code (stmt);
   tree def_for_init;
   tree init_def;
-  tree *elts;
   int i;
   bool nested_in_vect_loop = false;
   REAL_VALUE_TYPE real_init_val = dconst0;
@@ -4015,15 +4014,16 @@ get_initial_def_for_reduction (gimple *stmt, tree init_val,
 
   switch (code)
     {
-      case WIDEN_SUM_EXPR:
-      case DOT_PROD_EXPR:
-      case SAD_EXPR:
-      case PLUS_EXPR:
-      case MINUS_EXPR:
-      case BIT_IOR_EXPR:
-      case BIT_XOR_EXPR:
-      case MULT_EXPR:
-      case BIT_AND_EXPR:
+    case WIDEN_SUM_EXPR:
+    case DOT_PROD_EXPR:
+    case SAD_EXPR:
+    case PLUS_EXPR:
+    case MINUS_EXPR:
+    case BIT_IOR_EXPR:
+    case BIT_XOR_EXPR:
+    case MULT_EXPR:
+    case BIT_AND_EXPR:
+      {
         /* ADJUSMENT_DEF is NULL when called from
            vect_create_epilog_for_reduction to vectorize double reduction.  */
         if (adjustment_def)
@@ -4044,17 +4044,19 @@ get_initial_def_for_reduction (gimple *stmt, tree init_val,
           def_for_init = build_int_cst (scalar_type, int_init_val);
 
         /* Create a vector of '0' or '1' except the first element.  */
-       elts = XALLOCAVEC (tree, nunits);
+       auto_vec<tree, 32> elts (nunits);
+       elts.quick_grow (nunits);
         for (i = nunits - 2; i >= 0; --i)
          elts[i + 1] = def_for_init;
 
         /* Option1: the first element is '0' or '1' as well.  */
-        if (adjustment_def)
-          {
+       if (adjustment_def)
+         {
            elts[0] = def_for_init;
-            init_def = build_vector (vectype, elts);
-            break;
-          }
+
+           init_def = build_vector (vectype, elts);
+           break;
+         }
 
         /* Option2: the first element is INIT_VAL.  */
        elts[0] = init_val;
@@ -4069,12 +4071,13 @@ get_initial_def_for_reduction (gimple *stmt, tree init_val,
              CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, elts[i]);
            init_def = build_constructor (vectype, v);
          }
+      }
+      break;
 
-        break;
-
-      case MIN_EXPR:
-      case MAX_EXPR:
-      case COND_EXPR:
+    case MIN_EXPR:
+    case MAX_EXPR:
+    case COND_EXPR:
+      {
        if (adjustment_def)
           {
            *adjustment_def = NULL_TREE;
@@ -4088,10 +4091,11 @@ get_initial_def_for_reduction (gimple *stmt, tree init_val,
        if (! gimple_seq_empty_p (stmts))
          gsi_insert_seq_on_edge_immediate (loop_preheader_edge (loop), stmts);
        init_def = build_vector_from_val (vectype, init_val);
-       break;
+      }
+      break;
 
-      default:
-        gcc_unreachable ();
+    default:
+      gcc_unreachable ();
     }
 
   return init_def;
@@ -4111,7 +4115,6 @@ get_initial_defs_for_reduction (slp_tree slp_node,
   stmt_vec_info stmt_vinfo = vinfo_for_stmt (stmt);
   unsigned nunits;
   tree vec_cst;
-  tree *elts;
   unsigned j, number_of_places_left_in_vector;
   tree vector_type, scalar_type;
   tree vop;
@@ -4195,7 +4198,8 @@ get_initial_defs_for_reduction (slp_tree slp_node,
 
   number_of_places_left_in_vector = nunits;
   constant_p = true;
-  elts = XALLOCAVEC (tree, nunits);
+  auto_vec<tree, 32> elts (nunits);
+  elts.quick_grow (nunits);
   for (j = 0; j < number_of_copies; j++)
     {
       for (i = group_size - 1; stmts.iterate (i, &stmt); i--)
@@ -4533,9 +4537,9 @@ vect_create_epilog_for_reduction (vec<tree> vect_defs, gimple *stmt,
         vector size (STEP).  */
 
       /* Create a {1,2,3,...} vector.  */
-      tree *vtemp = XALLOCAVEC (tree, nunits_out);
+      auto_vec<tree, 32> vtemp (nunits_out);
       for (k = 0; k < nunits_out; ++k)
-       vtemp[k] = build_int_cst (cr_index_scalar_type, k + 1);
+       vtemp.quick_push (build_int_cst (cr_index_scalar_type, k + 1));
       tree series_vect = build_vector (cr_index_vector_type, vtemp);
 
       /* Create a vector of the step value.  */
@@ -6731,7 +6735,7 @@ vectorizable_induction (gimple *phi,
       unsigned ivn;
       for (ivn = 0; ivn < nivs; ++ivn)
        {
-         tree *elts = XALLOCAVEC (tree, nunits);
+         auto_vec<tree, 32> elts (nunits);
          bool constant_p = true;
          for (unsigned eltn = 0; eltn < nunits; ++eltn)
            {
@@ -6749,7 +6753,7 @@ vectorizable_induction (gimple *phi,
                }
              if (! CONSTANT_CLASS_P (elt))
                constant_p = false;
-             elts[eltn] = elt;
+             elts.quick_push (elt);
            }
          if (constant_p)
            new_vec = build_vector (vectype, elts);
index 38738930be32a3698786a73c7174675158d36ea9..32ca6afa614524aa65f0e150e87e5a7162cb968d 100644 (file)
@@ -3105,7 +3105,6 @@ vect_get_constant_vectors (tree op, slp_tree slp_node,
   stmt_vec_info stmt_vinfo = vinfo_for_stmt (stmt);
   unsigned nunits;
   tree vec_cst;
-  tree *elts;
   unsigned j, number_of_places_left_in_vector;
   tree vector_type;
   tree vop;
@@ -3158,7 +3157,8 @@ vect_get_constant_vectors (tree op, slp_tree slp_node,
 
   number_of_places_left_in_vector = nunits;
   constant_p = true;
-  elts = XALLOCAVEC (tree, nunits);
+  auto_vec<tree, 32> elts (nunits);
+  elts.quick_grow (nunits);
   bool place_after_defs = false;
   for (j = 0; j < number_of_copies; j++)
     {
@@ -3600,10 +3600,10 @@ vect_transform_slp_perm_load (slp_tree node, vec<tree> dr_chain,
                  
                  if (! noop_p)
                    {
-                     tree *mask_elts = XALLOCAVEC (tree, nunits);
+                     auto_vec<tree, 32> mask_elts (nunits);
                      for (int l = 0; l < nunits; ++l)
-                       mask_elts[l] = build_int_cst (mask_element_type,
-                                                     mask[l]);
+                       mask_elts.quick_push (build_int_cst (mask_element_type,
+                                                            mask[l]));
                      mask_vec = build_vector (mask_type, mask_elts);
                    }
 
@@ -3759,13 +3759,14 @@ vect_schedule_slp_instance (slp_tree node, slp_instance instance,
          unsigned k = 0, l;
          for (j = 0; j < v0.length (); ++j)
            {
-             tree *melts = XALLOCAVEC (tree, TYPE_VECTOR_SUBPARTS (vectype));
-             for (l = 0; l < TYPE_VECTOR_SUBPARTS (vectype); ++l)
+             unsigned int nunits = TYPE_VECTOR_SUBPARTS (vectype);
+             auto_vec<tree, 32> melts (nunits);
+             for (l = 0; l < nunits; ++l)
                {
                  if (k >= group_size)
                    k = 0;
-                 melts[l] = build_int_cst
-                     (meltype, mask[k++] * TYPE_VECTOR_SUBPARTS (vectype) + l);
+                 tree t = build_int_cst (meltype, mask[k++] * nunits + l);
+                 melts.quick_push (t);
                }
              tmask = build_vector (mvectype, melts);
 
index df93022f7cc83ebfcbcb2060d58e0217cbaa084e..b5f706c1f31ee8e9b923da01a2c5f1f4fe135eb0 100644 (file)
@@ -2480,10 +2480,10 @@ vectorizable_bswap (gimple *stmt, gimple_stmt_iterator *gsi,
   if (! char_vectype)
     return false;
 
-  unsigned char *elts
-    = XALLOCAVEC (unsigned char, TYPE_VECTOR_SUBPARTS (char_vectype));
+  unsigned int num_bytes = TYPE_VECTOR_SUBPARTS (char_vectype);
+  unsigned char *elts = XALLOCAVEC (unsigned char, num_bytes);
   unsigned char *elt = elts;
-  unsigned word_bytes = TYPE_VECTOR_SUBPARTS (char_vectype) / nunits;
+  unsigned word_bytes = num_bytes / nunits;
   for (unsigned i = 0; i < nunits; ++i)
     for (unsigned j = 0; j < word_bytes; ++j)
       *elt++ = (i + 1) * word_bytes - j - 1;
@@ -2507,9 +2507,9 @@ vectorizable_bswap (gimple *stmt, gimple_stmt_iterator *gsi,
       return true;
     }
 
-  tree *telts = XALLOCAVEC (tree, TYPE_VECTOR_SUBPARTS (char_vectype));
-  for (unsigned i = 0; i < TYPE_VECTOR_SUBPARTS (char_vectype); ++i)
-    telts[i] = build_int_cst (char_type_node, elts[i]);
+  auto_vec<tree, 32> telts (num_bytes);
+  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);
 
   /* Transform.  */
@@ -2928,10 +2928,10 @@ 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)
            {
-             tree *v = XALLOCAVEC (tree, nunits_out);
-             int k;
-             for (k = 0; k < nunits_out; ++k)
-               v[k] = build_int_cst (unsigned_type_node, j * nunits_out + k);
+             auto_vec<tree, 32> v (nunits_out);
+             for (int k = 0; k < nunits_out; ++k)
+               v.quick_push (build_int_cst (unsigned_type_node,
+                                            j * nunits_out + k));
              tree cst = build_vector (vectype_out, v);
              tree new_var
                = vect_get_new_ssa_name (vectype_out, vect_simple_var, "cst_");
@@ -6505,7 +6505,7 @@ vectorizable_store (gimple *stmt, gimple_stmt_iterator *gsi, gimple **vec_stmt,
 tree
 vect_gen_perm_mask_any (tree vectype, const unsigned char *sel)
 {
-  tree mask_elt_type, mask_type, mask_vec, *mask_elts;
+  tree mask_elt_type, mask_type, mask_vec;
   int i, nunits;
 
   nunits = TYPE_VECTOR_SUBPARTS (vectype);
@@ -6514,9 +6514,9 @@ vect_gen_perm_mask_any (tree vectype, const unsigned char *sel)
     (int_mode_for_mode (TYPE_MODE (TREE_TYPE (vectype))).require (), 1);
   mask_type = get_vectype_for_scalar_type (mask_elt_type);
 
-  mask_elts = XALLOCAVEC (tree, nunits);
-  for (i = nunits - 1; i >= 0; i--)
-    mask_elts[i] = build_int_cst (mask_elt_type, sel[i]);
+  auto_vec<tree, 32> mask_elts (nunits);
+  for (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;
index 0f505c2db01758590a2ad16cbf258f33e7552348..788a84b511eb30ba31b048483aef028fa46cf310 100644 (file)
@@ -1702,18 +1702,20 @@ make_vector (unsigned len MEM_STAT_DECL)
 }
 
 /* Return a new VECTOR_CST node whose type is TYPE and whose values
-   are in a list pointed to by VALS.  */
+   are given by VALS.  */
 
 tree
-build_vector (tree type, tree *vals MEM_STAT_DECL)
+build_vector (tree type, vec<tree> vals MEM_STAT_DECL)
 {
+  unsigned int nelts = vals.length ();
+  gcc_assert (nelts == TYPE_VECTOR_SUBPARTS (type));
   int over = 0;
   unsigned cnt = 0;
-  tree v = make_vector (TYPE_VECTOR_SUBPARTS (type));
+  tree v = make_vector (nelts);
   TREE_TYPE (v) = type;
 
   /* Iterate through elements and check for overflow.  */
-  for (cnt = 0; cnt < TYPE_VECTOR_SUBPARTS (type); ++cnt)
+  for (cnt = 0; cnt < nelts; ++cnt)
     {
       tree value = vals[cnt];
 
@@ -1736,20 +1738,21 @@ build_vector (tree type, tree *vals MEM_STAT_DECL)
 tree
 build_vector_from_ctor (tree type, vec<constructor_elt, va_gc> *v)
 {
-  tree *vec = XALLOCAVEC (tree, TYPE_VECTOR_SUBPARTS (type));
-  unsigned HOST_WIDE_INT idx, pos = 0;
+  unsigned int nelts = TYPE_VECTOR_SUBPARTS (type);
+  unsigned HOST_WIDE_INT idx;
   tree value;
 
+  auto_vec<tree, 32> vec (nelts);
   FOR_EACH_CONSTRUCTOR_VALUE (v, idx, value)
     {
       if (TREE_CODE (value) == VECTOR_CST)
        for (unsigned i = 0; i < VECTOR_CST_NELTS (value); ++i)
-         vec[pos++] = VECTOR_CST_ELT (value, i);
+         vec.quick_push (VECTOR_CST_ELT (value, i));
       else
-       vec[pos++] = value;
+       vec.quick_push (value);
     }
-  while (pos < TYPE_VECTOR_SUBPARTS (type))
-    vec[pos++] = build_zero_cst (TREE_TYPE (type));
+  while (vec.length () < nelts)
+    vec.quick_push (build_zero_cst (TREE_TYPE (type)));
 
   return build_vector (type, vec);
 }
@@ -1774,9 +1777,9 @@ build_vector_from_val (tree vectype, tree sc)
 
   if (CONSTANT_CLASS_P (sc))
     {
-      tree *v = XALLOCAVEC (tree, nunits);
+      auto_vec<tree, 32> v (nunits);
       for (i = 0; i < nunits; ++i)
-       v[i] = sc;
+       v.quick_push (sc);
       return build_vector (vectype, v);
     }
   else
index 490c3b6e51dbcb77fe0d97db346b45b9da5e5084..caa4a69977d4c39f3710149246228a0d63c50a73 100644 (file)
@@ -4026,7 +4026,7 @@ extern tree build_int_cst (tree, HOST_WIDE_INT);
 extern tree build_int_cstu (tree type, unsigned HOST_WIDE_INT cst);
 extern tree build_int_cst_type (tree, HOST_WIDE_INT);
 extern tree make_vector (unsigned CXX_MEM_STAT_INFO);
-extern tree build_vector (tree, tree * CXX_MEM_STAT_INFO);
+extern tree build_vector (tree, vec<tree> CXX_MEM_STAT_INFO);
 extern tree build_vector_from_ctor (tree, vec<constructor_elt, va_gc> *);
 extern tree build_vector_from_val (tree, tree);
 extern void recompute_constructor_flags (tree);