From fa780794692994d63febf4fb187567e245cdd4ee Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Wed, 3 Jan 2018 07:16:00 +0000 Subject: [PATCH] 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 Alan Hayward David Sherwood 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 Co-Authored-By: David Sherwood From-SVN: r256135 --- gcc/ChangeLog | 8 ++++++++ gcc/tree-vect-loop.c | 40 +++++++++++++++++++++++++++------------- 2 files changed, 35 insertions(+), 13 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 25f476a..2a62a33 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -2,6 +2,14 @@ Alan Hayward David Sherwood + * 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. + +2018-01-03 Richard Sandiford + Alan Hayward + David Sherwood + * tree-vect-loop.c (vectorizable_induction): Treat the number of units as polynomial. Punt on SLP inductions. Use an integer VEC_SERIES_EXPR for variable-length integer reductions. Use a 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 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]); -- 2.7.4