diff options
author | Richard Sandiford <richard.sandiford@linaro.org> | 2018-03-18 10:25:29 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2018-03-18 10:25:29 +0000 |
commit | 928b965f29f587bb033555f0db646c94afe8e7ef (patch) | |
tree | 0e183b4538fea404815ada3c300fd059d50a5e8e | |
parent | 4a8298b46d966bcc979bb170b32a163db235f1b5 (diff) | |
download | gcc-928b965f29f587bb033555f0db646c94afe8e7ef.zip gcc-928b965f29f587bb033555f0db646c94afe8e7ef.tar.gz gcc-928b965f29f587bb033555f0db646c94afe8e7ef.tar.bz2 |
Don't try to vectorise COND_EXPR reduction chains (PR 84913)
The testcase ICEd for both SVE and AVX512 because we were trying
to vectorise a chain of COND_EXPRs as a reduction and getting
confused by reduc_index == -1.
2018-03-18 Richard Sandiford <richard.sandiford@linaro.org>
gcc/
PR tree-optimization/84913
* tree-vect-loop.c (vectorizable_reduction): Don't try to
vectorize chains of COND_EXPRs.
gcc/testsuite/
PR tree-optimization/84913
* gfortran.dg/vect/pr84913.f90: New test.
From-SVN: r258631
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/vect/pr84913.f90 | 13 | ||||
-rw-r--r-- | gcc/tree-vect-loop.c | 24 |
4 files changed, 48 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 601cf59..2a77e3b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2018-03-18 Richard Sandiford <richard.sandiford@linaro.org> + + PR tree-optimization/84913 + * tree-vect-loop.c (vectorizable_reduction): Don't try to + vectorize chains of COND_EXPRs. + 2018-03-18 Chung-Ju Wu <jasonwucj@gmail.com> * config/nds32/nds32.h (MAX_REGS_PER_ADDRESS): Fix the value. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 098444a..7d9a3fd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-03-18 Richard Sandiford <richard.sandiford@linaro.org> + + PR tree-optimization/84913 + * gfortran.dg/vect/pr84913.f90: New test. + 2018-03-18 Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/79929 diff --git a/gcc/testsuite/gfortran.dg/vect/pr84913.f90 b/gcc/testsuite/gfortran.dg/vect/pr84913.f90 new file mode 100644 index 0000000..f2ec4d2 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/vect/pr84913.f90 @@ -0,0 +1,13 @@ +! { dg-do compile } + +function foo(a, b, c, n) + integer :: a(n), b(n), c(n), n, i, foo + foo = 0 + do i = 1, n + if (a(i) .eq. b(i)) then + foo = 1 + else if (a(i) .eq. c(i)) then + foo = 2 + end if + end do +end function foo diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index 6585c85..7b3009a 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -6788,6 +6788,30 @@ vectorizable_reduction (gimple *stmt, gimple_stmt_iterator *gsi, /* If we have a condition reduction, see if we can simplify it further. */ if (v_reduc_type == COND_REDUCTION) { + /* TODO: We can't yet handle reduction chains, since we need to treat + each COND_EXPR in the chain specially, not just the last one. + E.g. for: + + x_1 = PHI <x_3, ...> + x_2 = a_2 ? ... : x_1; + x_3 = a_3 ? ... : x_2; + + we're interested in the last element in x_3 for which a_2 || a_3 + is true, whereas the current reduction chain handling would + vectorize x_2 as a normal VEC_COND_EXPR and only treat x_3 + as a reduction operation. */ + if (reduc_index == -1) + { + if (dump_enabled_p ()) + dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, + "conditional reduction chains not supported\n"); + return false; + } + + /* vect_is_simple_reduction ensured that operand 2 is the + loop-carried operand. */ + gcc_assert (reduc_index == 2); + /* Loop peeling modifies initial value of reduction PHI, which makes the reduction stmt to be transformed different to the original stmt analyzed. We need to record reduction code for |