aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vect-loop.c
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@linaro.org>2018-01-03 07:16:00 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2018-01-03 07:16:00 +0000
commitfa780794692994d63febf4fb187567e245cdd4ee (patch)
tree8a3bf3a7503059b5b9cce1acbb405ddca7c5717f /gcc/tree-vect-loop.c
parent9fb9293aca4ddbe4d11a334befaa7847b279ed39 (diff)
downloadgcc-fa780794692994d63febf4fb187567e245cdd4ee.zip
gcc-fa780794692994d63febf4fb187567e245cdd4ee.tar.gz
gcc-fa780794692994d63febf4fb187567e245cdd4ee.tar.bz2
poly_int: vectorizable_live_operation
This patch makes vectorizable_live_operation cope with variable-length vectors. For now we just handle cases in which we can tell at compile time which vector contains the final result. 2018-01-03 Richard Sandiford <richard.sandiford@linaro.org> Alan Hayward <alan.hayward@arm.com> David Sherwood <david.sherwood@arm.com> gcc/ * tree-vect-loop.c (vectorizable_live_operation): Treat the number of units as polynomial. Punt if we can't tell at compile time which vector contains the final result. Co-Authored-By: Alan Hayward <alan.hayward@arm.com> Co-Authored-By: David Sherwood <david.sherwood@arm.com> From-SVN: r256135
Diffstat (limited to 'gcc/tree-vect-loop.c')
-rw-r--r--gcc/tree-vect-loop.c40
1 files changed, 27 insertions, 13 deletions
diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c
index 2b3bb07..397fc25 100644
--- a/gcc/tree-vect-loop.c
+++ b/gcc/tree-vect-loop.c
@@ -7201,10 +7201,12 @@ vectorizable_live_operation (gimple *stmt,
imm_use_iterator imm_iter;
tree lhs, lhs_type, bitsize, vec_bitsize;
tree vectype = STMT_VINFO_VECTYPE (stmt_info);
- int nunits = TYPE_VECTOR_SUBPARTS (vectype);
+ poly_uint64 nunits = TYPE_VECTOR_SUBPARTS (vectype);
int ncopies;
gimple *use_stmt;
auto_vec<tree> vec_oprnds;
+ int vec_entry = 0;
+ poly_uint64 vec_index = 0;
gcc_assert (STMT_VINFO_LIVE_P (stmt_info));
@@ -7233,6 +7235,30 @@ vectorizable_live_operation (gimple *stmt,
else
ncopies = vect_get_num_copies (loop_vinfo, vectype);
+ if (slp_node)
+ {
+ gcc_assert (slp_index >= 0);
+
+ int num_scalar = SLP_TREE_SCALAR_STMTS (slp_node).length ();
+ int num_vec = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node);
+
+ /* Get the last occurrence of the scalar index from the concatenation of
+ all the slp vectors. Calculate which slp vector it is and the index
+ within. */
+ poly_uint64 pos = (num_vec * nunits) - num_scalar + slp_index;
+
+ /* Calculate which vector contains the result, and which lane of
+ that vector we need. */
+ if (!can_div_trunc_p (pos, nunits, &vec_entry, &vec_index))
+ {
+ if (dump_enabled_p ())
+ dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
+ "Cannot determine which vector holds the"
+ " final result.\n");
+ return false;
+ }
+ }
+
if (!vec_stmt)
/* No transformation required. */
return true;
@@ -7254,18 +7280,6 @@ vectorizable_live_operation (gimple *stmt,
tree vec_lhs, bitstart;
if (slp_node)
{
- gcc_assert (slp_index >= 0);
-
- int num_scalar = SLP_TREE_SCALAR_STMTS (slp_node).length ();
- int num_vec = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node);
-
- /* Get the last occurrence of the scalar index from the concatenation of
- all the slp vectors. Calculate which slp vector it is and the index
- within. */
- int pos = (num_vec * nunits) - num_scalar + slp_index;
- int vec_entry = pos / nunits;
- int vec_index = pos % nunits;
-
/* Get the correct slp vectorized stmt. */
vec_lhs = gimple_get_lhs (SLP_TREE_VEC_STMTS (slp_node)[vec_entry]);