From eb38d071636da1ea2d0f9a068c86c7ceee2634b2 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Tue, 10 Apr 2018 10:28:33 +0000 Subject: [PATCH] Add missing cases to vect_get_smallest_scalar_type (PR 85286) In this PR we used WIDEN_SUM_EXPR to vectorise: short i, y; int sum; [...] for (i = x; i > 0; i--) sum += y; with 4 ints and 8 shorts per vector. The problem was that we set the VF based only on the ints, then calculated the number of vector copies based on the shorts, giving 4/8. Previously that led to ncopies==0, but after r249897 we pick it up as an ICE. In this particular case we could vectorise the reduction by setting ncopies based on the output type rather than the input type, but it doesn't seem worth adding a special "optimisation" for such a pathological case. I think it's really an instance of the more general problem that we can't vectorise using combinations of (say) 64-bit and 128-bit vectors on targets that support both. 2018-04-10 Richard Sandiford gcc/ PR tree-optimization/85286 * tree-vect-data-refs.c (vect_get_smallest_scalar_type): gcc/testsuite/ PR tree-optimization/85286 * gcc.dg/vect/pr85286.c: New test. From-SVN: r259268 --- gcc/ChangeLog | 5 +++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/vect/pr85286.c | 19 +++++++++++++++++++ gcc/tree-vect-data-refs.c | 2 ++ 4 files changed, 31 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/vect/pr85286.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 50484facbb9..49589599269 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2018-04-10 Richard Sandiford + + PR tree-optimization/85286 + * tree-vect-data-refs.c (vect_get_smallest_scalar_type): + 2018-04-10 Richard Sandiford * final.c (final_1): Set insn_last_address as well as diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f7ca8340e8f..3cfc12c3c91 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-04-10 Richard Sandiford + + PR tree-optimization/85286 + * gcc.dg/vect/pr85286.c: New test. + 2018-04-10 Kyrylo Tkachov PR target/85173 diff --git a/gcc/testsuite/gcc.dg/vect/pr85286.c b/gcc/testsuite/gcc.dg/vect/pr85286.c new file mode 100644 index 00000000000..320ed6b7e79 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/pr85286.c @@ -0,0 +1,19 @@ +/* PR tree-optimization/45241 */ +/* { dg-do compile } */ +/* { dg-additional-options "--param scev-max-expr-complexity=0" } */ + +int +foo (short x) +{ + short i, y; + int sum; + + for (i = 0; i < x; i++) + y = x * i; + + for (i = x; i > 0; i--) + sum += y; + + return sum; +} + diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c index ce2438799b8..161a886a5cf 100644 --- a/gcc/tree-vect-data-refs.c +++ b/gcc/tree-vect-data-refs.c @@ -132,6 +132,8 @@ vect_get_smallest_scalar_type (gimple *stmt, HOST_WIDE_INT *lhs_size_unit, if (is_gimple_assign (stmt) && (gimple_assign_cast_p (stmt) + || gimple_assign_rhs_code (stmt) == DOT_PROD_EXPR + || gimple_assign_rhs_code (stmt) == WIDEN_SUM_EXPR || gimple_assign_rhs_code (stmt) == WIDEN_MULT_EXPR || gimple_assign_rhs_code (stmt) == WIDEN_LSHIFT_EXPR || gimple_assign_rhs_code (stmt) == FLOAT_EXPR)) -- 2.30.2