aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@arm.com>2018-08-09 16:03:25 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2018-08-09 16:03:25 +0000
commitb8d5e148f669d56ccfd294dc396daba607237cdb (patch)
tree30024b7111392033a7f7ca3969997417773fc6fd /gcc
parent56b61d7fc4f38c1a3fd51bf3315b0338513a2d2d (diff)
downloadgcc-b8d5e148f669d56ccfd294dc396daba607237cdb.zip
gcc-b8d5e148f669d56ccfd294dc396daba607237cdb.tar.gz
gcc-b8d5e148f669d56ccfd294dc396daba607237cdb.tar.bz2
Allow inner-loop reductions with variable-length vectors
While working on PR 86871, I noticed we were being overly restrictive when handling variable-length vectors. For: for (i : ...) { res = ...; for (j : ...) res op= ...; a[i] = res; } we don't need a reduction operation (although we do for double reductions like: res = ...; for (i : ...) for (j : ...) res op= ...; a[i] = res; which must still be rejected). 2018-08-08 Richard Sandiford <richard.sandiford@arm.com> gcc/ * tree-vect-loop.c (vectorizable_reduction): Allow inner-loop reductions for variable-length vectors. gcc/testsuite/ * gcc.target/aarch64/sve/reduc_8.c: New test. From-SVN: r263451
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/reduc_8.c20
-rw-r--r--gcc/tree-vect-loop.c1
4 files changed, 30 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index dd088bb..839dfc3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2018-08-09 Richard Sandiford <richard.sandiford@arm.com>
+
+ * tree-vect-loop.c (vectorizable_reduction): Allow inner-loop
+ reductions for variable-length vectors.
+
2018-08-09 David Malcolm <dmalcolm@redhat.com>
PR other/84889
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3da9f3b..8ea8530 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2018-08-09 Richard Sandiford <richard.sandiford@arm.com>
+
+ * gcc.target/aarch64/sve/reduc_8.c: New test.
+
2018-08-09 David Malcolm <dmalcolm@redhat.com>
PR other/84889
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/reduc_8.c b/gcc/testsuite/gcc.target/aarch64/sve/reduc_8.c
new file mode 100644
index 0000000..3913b88
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sve/reduc_8.c
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -ftree-vectorize" } */
+
+int
+reduc (int *restrict a, int *restrict b, int *restrict c)
+{
+ for (int i = 0; i < 100; ++i)
+ {
+ int res = 0;
+ for (int j = 0; j < 100; ++j)
+ if (b[i + j] != 0)
+ res = c[i + j];
+ a[i] = res;
+ }
+}
+
+/* { dg-final { scan-assembler-times {\tcmpne\tp[0-9]+\.s, } 1 } } */
+/* We ought to use the CMPNE result for the SEL too. */
+/* { dg-final { scan-assembler-not {\tcmpeq\tp[0-9]+\.s, } { xfail *-*-* } } } */
+/* { dg-final { scan-assembler-times {\tsel\tz[0-9]+\.s, } 1 } } */
diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c
index 0669f62..c167aec 100644
--- a/gcc/tree-vect-loop.c
+++ b/gcc/tree-vect-loop.c
@@ -6714,6 +6714,7 @@ vectorizable_reduction (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi,
}
if (reduction_type != EXTRACT_LAST_REDUCTION
+ && (!nested_cycle || double_reduc)
&& reduc_fn == IFN_LAST
&& !nunits_out.is_constant ())
{