diff options
author | Richard Sandiford <richard.sandiford@linaro.org> | 2018-01-03 07:16:41 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2018-01-03 07:16:41 +0000 |
commit | dad55d7014374121fd75112014ccadcfb9653182 (patch) | |
tree | fac63e9d72df42fb9be302e5d787225855f35ffb /gcc | |
parent | a23644f23da672210ea6a443cefb7cd17111b160 (diff) | |
download | gcc-dad55d7014374121fd75112014ccadcfb9653182.zip gcc-dad55d7014374121fd75112014ccadcfb9653182.tar.gz gcc-dad55d7014374121fd75112014ccadcfb9653182.tar.bz2 |
poly_int: two-operation SLP
This patch makes two-operation SLP handle but reject variable-length
vectors. Adding support for this is a post-GCC8 thing.
2018-01-03 Richard Sandiford <richard.sandiford@linaro.org>
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>
gcc/
* tree-vect-slp.c (vect_build_slp_tree_1): Handle polynomial
numbers of units.
(vect_schedule_slp_instance): Likewise.
Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
Co-Authored-By: David Sherwood <david.sherwood@arm.com>
From-SVN: r256141
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/tree-vect-slp.c | 23 |
2 files changed, 26 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c25eb15..992ad1d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -2,6 +2,14 @@ Alan Hayward <alan.hayward@arm.com> David Sherwood <david.sherwood@arm.com> + * tree-vect-slp.c (vect_build_slp_tree_1): Handle polynomial + numbers of units. + (vect_schedule_slp_instance): Likewise. + +2018-01-03 Richard Sandiford <richard.sandiford@linaro.org> + Alan Hayward <alan.hayward@arm.com> + David Sherwood <david.sherwood@arm.com> + * tree-vect-slp.c (vect_get_and_check_slp_defs): Reject constant and extern definitions for variable-length vectors. (vect_get_constant_vectors): Note that the number of units diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c index 4aa816f..391b3ea 100644 --- a/gcc/tree-vect-slp.c +++ b/gcc/tree-vect-slp.c @@ -905,10 +905,19 @@ vect_build_slp_tree_1 (vec_info *vinfo, unsigned char *swap, /* If we allowed a two-operation SLP node verify the target can cope with the permute we are going to use. */ + poly_uint64 nunits = TYPE_VECTOR_SUBPARTS (vectype); if (alt_stmt_code != ERROR_MARK && TREE_CODE_CLASS (alt_stmt_code) != tcc_reference) { - unsigned int count = TYPE_VECTOR_SUBPARTS (vectype); + unsigned HOST_WIDE_INT count; + if (!nunits.is_constant (&count)) + { + if (dump_enabled_p ()) + dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, + "Build SLP failed: different operations " + "not allowed with variable-length SLP.\n"); + return false; + } vec_perm_builder sel (count, count, 1); for (i = 0; i < count; ++i) { @@ -3824,6 +3833,7 @@ vect_schedule_slp_instance (slp_tree node, slp_instance instance, /* VECTYPE is the type of the destination. */ vectype = STMT_VINFO_VECTYPE (stmt_info); + poly_uint64 nunits = TYPE_VECTOR_SUBPARTS (vectype); group_size = SLP_INSTANCE_GROUP_SIZE (instance); if (!SLP_TREE_VEC_STMTS (node).exists ()) @@ -3886,13 +3896,16 @@ vect_schedule_slp_instance (slp_tree node, slp_instance instance, unsigned k = 0, l; for (j = 0; j < v0.length (); ++j) { - unsigned int nunits = TYPE_VECTOR_SUBPARTS (vectype); - tree_vector_builder melts (mvectype, nunits, 1); - for (l = 0; l < nunits; ++l) + /* Enforced by vect_build_slp_tree, which rejects variable-length + vectors for SLP_TREE_TWO_OPERATORS. */ + unsigned int const_nunits = nunits.to_constant (); + tree_vector_builder melts (mvectype, const_nunits, 1); + for (l = 0; l < const_nunits; ++l) { if (k >= group_size) k = 0; - tree t = build_int_cst (meltype, mask[k++] * nunits + l); + tree t = build_int_cst (meltype, + mask[k++] * const_nunits + l); melts.quick_push (t); } tmask = melts.build (); |