Make more use of gimple-fold.h in tree-vect-loop.c
authorRichard Sandiford <richard.sandiford@linaro.org>
Thu, 14 Sep 2017 16:24:31 +0000 (16:24 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Thu, 14 Sep 2017 16:24:31 +0000 (16:24 +0000)
This patch makes the vectoriser use the gimple-fold.h routines
in more cases, instead of vect_init_vector.  Later patches want
to use the same interface to handle variable-length vectors.

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

gcc/
* tree-vect-loop.c (vectorizable_induction): Use gimple_build instead
of vect_init_vector.

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

gcc/ChangeLog
gcc/tree-vect-loop.c

index d582e2c..12863fa 100644 (file)
@@ -2,6 +2,13 @@
            Alan Hayward  <alan.hayward@arm.com>
            David Sherwood  <david.sherwood@arm.com>
 
+       * tree-vect-loop.c (vectorizable_induction): Use gimple_build instead
+       of vect_init_vector.
+
+2017-09-14  Richard Sandiford  <richard.sandiford@linaro.org>
+           Alan Hayward  <alan.hayward@arm.com>
+           David Sherwood  <david.sherwood@arm.com>
+
        * gimple-fold.h (gimple_build_vector_from_val): Declare, and provide
        an inline wrapper that provides a location.
        (gimple_build_vector): Likewise.
index 3fe3034..6746696 100644 (file)
@@ -6839,18 +6839,21 @@ vectorizable_induction (gimple *phi,
     {
       /* iv_loop is the loop to be vectorized. Generate:
          vec_step = [VF*S, VF*S, VF*S, VF*S]  */
+      gimple_seq seq = NULL;
       if (SCALAR_FLOAT_TYPE_P (TREE_TYPE (step_expr)))
        {
          expr = build_int_cst (integer_type_node, vf);
-         expr = fold_convert (TREE_TYPE (step_expr), expr);
+         expr = gimple_build (&seq, FLOAT_EXPR, TREE_TYPE (step_expr), expr);
        }
       else
        expr = build_int_cst (TREE_TYPE (step_expr), vf);
-      new_name = fold_build2 (MULT_EXPR, TREE_TYPE (step_expr),
-                             expr, step_expr);
-      if (TREE_CODE (step_expr) == SSA_NAME)
-       new_name = vect_init_vector (phi, new_name,
-                                    TREE_TYPE (step_expr), NULL);
+      new_name = gimple_build (&seq, MULT_EXPR, TREE_TYPE (step_expr),
+                              expr, step_expr);
+      if (seq)
+       {
+         new_bb = gsi_insert_seq_on_edge_immediate (pe, seq);
+         gcc_assert (!new_bb);
+       }
     }
 
   t = unshare_expr (new_name);
@@ -6899,6 +6902,7 @@ vectorizable_induction (gimple *phi,
 
   if (ncopies > 1)
     {
+      gimple_seq seq = NULL;
       stmt_vec_info prev_stmt_vinfo;
       /* FORNOW. This restriction should be relaxed.  */
       gcc_assert (!nested_in_vect_loop);
@@ -6907,15 +6911,18 @@ vectorizable_induction (gimple *phi,
       if (SCALAR_FLOAT_TYPE_P (TREE_TYPE (step_expr)))
        {
          expr = build_int_cst (integer_type_node, nunits);
-         expr = fold_convert (TREE_TYPE (step_expr), expr);
+         expr = gimple_build (&seq, FLOAT_EXPR, TREE_TYPE (step_expr), expr);
        }
       else
        expr = build_int_cst (TREE_TYPE (step_expr), nunits);
-      new_name = fold_build2 (MULT_EXPR, TREE_TYPE (step_expr),
-                             expr, step_expr);
-      if (TREE_CODE (step_expr) == SSA_NAME)
-       new_name = vect_init_vector (phi, new_name,
-                                    TREE_TYPE (step_expr), NULL);
+      new_name = gimple_build (&seq, MULT_EXPR, TREE_TYPE (step_expr),
+                              expr, step_expr);
+      if (seq)
+       {
+         new_bb = gsi_insert_seq_on_edge_immediate (pe, seq);
+         gcc_assert (!new_bb);
+       }
+
       t = unshare_expr (new_name);
       gcc_assert (CONSTANT_CLASS_P (new_name)
                  || TREE_CODE (new_name) == SSA_NAME);