Add missing cases to vect_get_smallest_scalar_type (PR 85286)
authorRichard Sandiford <richard.sandiford@linaro.org>
Tue, 10 Apr 2018 10:28:33 +0000 (10:28 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Tue, 10 Apr 2018 10:28:33 +0000 (10:28 +0000)
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.

From-SVN: r259268

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vect/pr85286.c [new file with mode: 0644]
gcc/tree-vect-data-refs.c

index 50484facbb9d32e7077deb10d11743519b4a691c..495895992699e34abe8f6a94b00caa6397205610 100644 (file)
@@ -1,3 +1,8 @@
+2018-04-10  Richard Sandiford  <richard.sandiford@linaro.org>
+
+       PR tree-optimization/85286
+       * tree-vect-data-refs.c (vect_get_smallest_scalar_type):
+
 2018-04-10  Richard Sandiford  <richard.sandiford@linaro.org>
 
        * final.c (final_1): Set insn_last_address as well as
index f7ca8340e8ffe77f046d8e0e1097a9ac9a2ca906..3cfc12c3c9176cc51216513834542e3c28a3be9e 100644 (file)
@@ -1,3 +1,8 @@
+2018-04-10  Richard Sandiford  <richard.sandiford@linaro.org>
+
+       PR tree-optimization/85286
+       * gcc.dg/vect/pr85286.c: New test.
+
 2018-04-10  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        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 (file)
index 0000000..320ed6b
--- /dev/null
@@ -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;
+}
+
index ce2438799b85283f932ec1e51d089eb8c45ce6c5..161a886a5cfea41ce5f6a07398df5787be3fd17b 100644 (file)
@@ -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))