diff options
author | Richard Sandiford <richard.sandiford@arm.com> | 2018-08-09 16:03:25 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2018-08-09 16:03:25 +0000 |
commit | b8d5e148f669d56ccfd294dc396daba607237cdb (patch) | |
tree | 30024b7111392033a7f7ca3969997417773fc6fd /gcc | |
parent | 56b61d7fc4f38c1a3fd51bf3315b0338513a2d2d (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/aarch64/sve/reduc_8.c | 20 | ||||
-rw-r--r-- | gcc/tree-vect-loop.c | 1 |
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 ()) { |