diff options
author | Richard Sandiford <richard.sandiford@linaro.org> | 2017-09-14 16:24:31 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2017-09-14 16:24:31 +0000 |
commit | dccf43aed37281a7bb91a7984a75470ad62eb0f1 (patch) | |
tree | c21c0358a4a4c3ca03d13aae79b8af5c1c535545 /gcc | |
parent | e7c45b6600acfdc0930b980a45a364f77844139a (diff) | |
download | gcc-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/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/tree-vect-loop.c | 31 |
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); |