aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@linaro.org>2017-09-14 16:24:31 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2017-09-14 16:24:31 +0000
commitdccf43aed37281a7bb91a7984a75470ad62eb0f1 (patch)
treec21c0358a4a4c3ca03d13aae79b8af5c1c535545 /gcc
parente7c45b6600acfdc0930b980a45a364f77844139a (diff)
downloadgcc-dccf43aed37281a7bb91a7984a75470ad62eb0f1.zip
gcc-dccf43aed37281a7bb91a7984a75470ad62eb0f1.tar.gz
gcc-dccf43aed37281a7bb91a7984a75470ad62eb0f1.tar.bz2
Make more use of gimple-fold.h in tree-vect-loop.c
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/tree-vect-loop.c31
2 files changed, 26 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d582e2c..12863fa 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c
index 3fe3034..6746696 100644
--- a/gcc/tree-vect-loop.c
+++ b/gcc/tree-vect-loop.c
@@ -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);