On Mon, Apr 9, 2018 at 7:47 PM, Richard Sandiford <richard.sandif...@linaro.org> wrote: > 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. > > Tested on aarch64-linux-gnu and x86_64-linux-gnu. OK to install?
OK. Richard. > Richard > > > 2018-04-09 Richard Sandiford <richard.sandif...@linaro.org> > > gcc/ > PR tree-optimization/85286 > * tree-vect-data-refs.c (vect_get_smallest_scalar_type): > > gcc/testsuite/ > * gcc.dg/vect/pr85286.c: New test. > > Index: gcc/tree-vect-data-refs.c > =================================================================== > --- gcc/tree-vect-data-refs.c 2018-03-24 10:52:25.616823316 +0000 > +++ gcc/tree-vect-data-refs.c 2018-04-09 18:44:09.676561821 +0100 > @@ -132,6 +132,8 @@ vect_get_smallest_scalar_type (gimple *s > > 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)) > Index: gcc/testsuite/gcc.dg/vect/pr85286.c > =================================================================== > --- /dev/null 2018-04-08 19:55:28.217132277 +0100 > +++ gcc/testsuite/gcc.dg/vect/pr85286.c 2018-04-09 18:44:09.675561881 +0100 > @@ -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; > +} > +