Add missing cases to vect_get_smallest_scalar_type (PR 85286)
commit7c63a6aea400d85302a955c3e0af7b22f2823790
authorrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 10 Apr 2018 10:28:33 +0000 (10 10:28 +0000)
committerrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 10 Apr 2018 10:28:33 +0000 (10 10:28 +0000)
tree76f515b13d6c8afd7d42d5ba5d416e64b0cf8cd1
parent05dbe0c7a55ad55d65f47d6173a3e1ceb7ef07e1
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  <richard.sandiford@linaro.org>

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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@259268 138bc75d-0d04-0410-961f-82ee72b054a4
gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vect/pr85286.c [new file with mode: 0644]
gcc/tree-vect-data-refs.c