Bootstrapped and tested on x86_64-unknown-linux-gnu, applied.

Richard.

2019-10-24  Richard Biener  <rguent...@suse.de>

        PR tree-optimization/92205
        * tree-vect-loop.c (vectorizable_reduction): Restrict
        search for alternate vectype_in to lane-reducing patterns
        we support.

        * gcc.dg/vect/pr92205.c: New testcase.

Index: gcc/tree-vect-loop.c
===================================================================
--- gcc/tree-vect-loop.c        (revision 277365)
+++ gcc/tree-vect-loop.c        (working copy)
@@ -5697,6 +5697,8 @@ vectorizable_reduction (stmt_vec_info st
 
   gassign *stmt = as_a <gassign *> (stmt_info->stmt);
   enum tree_code code = gimple_assign_rhs_code (stmt);
+  bool lane_reduc_code_p
+    = (code == DOT_PROD_EXPR || code == WIDEN_SUM_EXPR || code == SAD_EXPR);
   int op_type = TREE_CODE_LENGTH (code);
 
   scalar_dest = gimple_assign_lhs (stmt);
@@ -5749,8 +5751,10 @@ vectorizable_reduction (stmt_vec_info st
        return false;
 
       /* To properly compute ncopies we are interested in the widest
-        input type in case we're looking at a widening accumulation.  */
-      if (tem
+        non-reduction input type in case we're looking at a widening
+        accumulation that we later handle in vect_transform_reduction.  */
+      if (lane_reduc_code_p
+         && tem
          && (!vectype_in
              || (GET_MODE_SIZE (SCALAR_TYPE_MODE (TREE_TYPE (vectype_in)))
                  < GET_MODE_SIZE (SCALAR_TYPE_MODE (TREE_TYPE (tem))))))
@@ -6233,8 +6237,6 @@ vectorizable_reduction (stmt_vec_info st
       && vect_stmt_to_vectorize (use_stmt_info) == stmt_info)
     single_defuse_cycle = true;
 
-  bool lane_reduc_code_p
-    = (code == DOT_PROD_EXPR || code == WIDEN_SUM_EXPR || code == SAD_EXPR);
   if (single_defuse_cycle || lane_reduc_code_p)
     {
       gcc_assert (code != COND_EXPR);
Index: gcc/testsuite/gcc.dg/vect/pr92205.c
===================================================================
--- gcc/testsuite/gcc.dg/vect/pr92205.c (nonexistent)
+++ gcc/testsuite/gcc.dg/vect/pr92205.c (working copy)
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target vect_int } */
+
+int b(int n, unsigned char *a)
+{
+  int d = 0;
+  a = __builtin_assume_aligned (a, __BIGGEST_ALIGNMENT__);
+  for (int c = 0; c < n; ++c)
+    d |= a[c];
+  return d;
+}
+
+/* { dg-final { scan-tree-dump "vectorized 1 loops" "vect" { target { 
vect_unpack && { ! vect_no_bitwise } } } } } */

Reply via email to