aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@linaro.org>2018-01-03 07:16:41 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2018-01-03 07:16:41 +0000
commitdad55d7014374121fd75112014ccadcfb9653182 (patch)
treefac63e9d72df42fb9be302e5d787225855f35ffb /gcc
parenta23644f23da672210ea6a443cefb7cd17111b160 (diff)
downloadgcc-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/ChangeLog8
-rw-r--r--gcc/tree-vect-slp.c23
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 ();