re PR tree-optimization/92205 (ICE in vect_get_vec_def_for_stmt_copy, at tree-vect...
authorRichard Biener <rguenther@suse.de>
Thu, 24 Oct 2019 12:11:27 +0000 (12:11 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 24 Oct 2019 12:11:27 +0000 (12:11 +0000)
2019-10-24  Richard Biener  <rguenther@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.

From-SVN: r277375

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vect/pr92205.c [new file with mode: 0644]
gcc/tree-vect-loop.c

index 4873330..d09b72d 100644 (file)
@@ -1,5 +1,12 @@
 2019-10-24  Richard Biener  <rguenther@suse.de>
 
+       PR tree-optimization/92205
+       * tree-vect-loop.c (vectorizable_reduction): Restrict
+       search for alternate vectype_in to lane-reducing patterns
+       we support.
+
+2019-10-24  Richard Biener  <rguenther@suse.de>
+
        PR tree-optimization/92203
        * treee-ssa-sccvn.c (eliminate_dom_walker::eliminate_stmt):
        Skip eliminating conversion stmts inserted by insertion.
index 5a1cd91..2742e10 100644 (file)
@@ -1,5 +1,10 @@
 2019-10-24  Richard Biener  <rguenther@suse.de>
 
+       PR tree-optimization/92205
+       * gcc.dg/vect/pr92205.c: New testcase.
+
+2019-10-24  Richard Biener  <rguenther@suse.de>
+
        PR tree-optimization/92203
        * gcc.dg/torture/pr92203.c: New testcase.
 
diff --git a/gcc/testsuite/gcc.dg/vect/pr92205.c b/gcc/testsuite/gcc.dg/vect/pr92205.c
new file mode 100644 (file)
index 0000000..ea06660
--- /dev/null
@@ -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 } } } } } */
index b66f211..9c5ce47 100644 (file)
@@ -5697,6 +5697,8 @@ vectorizable_reduction (stmt_vec_info stmt_info, slp_tree slp_node,
 
   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 stmt_info, slp_tree slp_node,
        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 stmt_info, slp_tree slp_node,
       && 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);