tree-vect-loop.c (vect_analyze_scalar_cycles_1): Do not add reduction chains to LOOP_...
authorRichard Biener <rguenther@suse.de>
Thu, 29 Jun 2017 14:04:02 +0000 (14:04 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 29 Jun 2017 14:04:02 +0000 (14:04 +0000)
2017-06-29  Richard Biener  <rguenther@suse.de>

* tree-vect-loop.c (vect_analyze_scalar_cycles_1): Do not add
reduction chains to LOOP_VINFO_REDUCTIONS.
* tree-vect-slp.c (vect_analyze_slp): Continue looking for
SLP reductions after processing reduction chains.

* gcc.dg/vect/slp-reduc-8.c: New testcase.

From-SVN: r249785

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

index f230dad271a7e7ccf4e233b08756c6814a7a75b6..bc58f15c5d5b00c01b189fe391b3d543bffe76f2 100644 (file)
@@ -1,3 +1,10 @@
+2017-06-29  Richard Biener  <rguenther@suse.de>
+
+       * tree-vect-loop.c (vect_analyze_scalar_cycles_1): Do not add
+       reduction chains to LOOP_VINFO_REDUCTIONS.
+       * tree-vect-slp.c (vect_analyze_slp): Continue looking for
+       SLP reductions after processing reduction chains.
+
 2017-06-29  Nathan Sidwell  <nathan@acm.org>
 
        * builtins.c (fold_builtin_FUNCTION): Use
index 70651d5f3ab0ee4d93551a7ed73773779553f237..3dbd4e2628658f8eeab9559245efb5b12eb5a6e6 100644 (file)
@@ -1,3 +1,7 @@
+2017-06-29  Richard Biener  <rguenther@suse.de>
+
+       * gcc.dg/vect/slp-reduc-8.c: New testcase.
+
 2017-06-29  Nathan Sidwell  <nathan@acm.org>
 
        * g++.dg/cpp1y/builtin_FUNCTION.C: New.
diff --git a/gcc/testsuite/gcc.dg/vect/slp-reduc-8.c b/gcc/testsuite/gcc.dg/vect/slp-reduc-8.c
new file mode 100644 (file)
index 0000000..618c800
--- /dev/null
@@ -0,0 +1,48 @@
+/* { dg-require-effective-target vect_int } */
+
+#include "tree-vect.h"
+
+static int a[512], b[512];
+
+void __attribute__((noinline,noclone))
+foo (int *sum1p, int *sum2p, int *sum3p)
+{
+  int sum1 = 0;
+  int sum2 = 0;
+  int sum3 = 0;
+  /* Check that we vectorize a reduction chain and a SLP reduction
+     at the same time.  */
+  for (int i = 0; i < 256; ++i)
+    {
+      sum1 += a[2*i];
+      sum1 += a[2*i + 1];
+      sum2 += b[2*i];
+      sum3 += b[2*i + 1];
+    }
+  *sum1p = sum1;
+  *sum2p = sum2;
+  *sum3p = sum3;
+}
+
+int main()
+{
+  check_vect ();
+
+  for (int i = 0; i < 256; ++i)
+    {
+      a[2*i] = i;
+      a[2*i + 1] = i/2;
+      b[2*i] = i + 1;
+      b[2*i + 1] = i/2 + 1;
+      __asm__ volatile ("" : : : "memory");
+    }
+  int sum1, sum2, sum3;
+  foo (&sum1, &sum2, &sum3);
+  if (sum1 != 48896 || sum2 != 32896 || sum3 != 16512)
+    abort ();
+
+  return 0;
+}
+
+/* { dg-final { scan-tree-dump "Loop contains only SLP stmts" "vect" } } */
+/* { dg-final { scan-tree-dump "vectorized 1 loops" "vect" } } */
index a0558360a96dc7c3554c4554c9a1e33c6037285d..32a5caa391e669c2fb4cd0dbf359553acdb6d46f 100644 (file)
@@ -890,8 +890,10 @@ vect_analyze_scalar_cycles_1 (loop_vec_info loop_vinfo, struct loop *loop)
                   STMT_VINFO_DEF_TYPE (vinfo_for_stmt (reduc_stmt)) =
                                                            vect_reduction_def;
                   /* Store the reduction cycles for possible vectorization in
-                     loop-aware SLP.  */
-                  LOOP_VINFO_REDUCTIONS (loop_vinfo).safe_push (reduc_stmt);
+                     loop-aware SLP if it was not detected as reduction
+                    chain.  */
+                 if (! GROUP_FIRST_ELEMENT (vinfo_for_stmt (reduc_stmt)))
+                   LOOP_VINFO_REDUCTIONS (loop_vinfo).safe_push (reduc_stmt);
                 }
             }
         }
index eb7bc55c43fbf56c1712b0225a4bcb72b64dbfc0..9e7a20dbfe433f84b8b85a71e27bad32cb4d7e62 100644 (file)
@@ -2102,15 +2102,13 @@ vect_analyze_slp (vec_info *vinfo, unsigned max_tree_size)
 {
   unsigned int i;
   gimple *first_element;
-  bool ok = false;
 
   if (dump_enabled_p ())
     dump_printf_loc (MSG_NOTE, vect_location, "=== vect_analyze_slp ===\n");
 
   /* Find SLP sequences starting from groups of grouped stores.  */
   FOR_EACH_VEC_ELT (vinfo->grouped_stores, i, first_element)
-    if (vect_analyze_slp_instance (vinfo, first_element, max_tree_size))
-      ok = true;
+    vect_analyze_slp_instance (vinfo, first_element, max_tree_size);
 
   if (loop_vec_info loop_vinfo = dyn_cast <loop_vec_info> (vinfo))
     {
@@ -2118,22 +2116,15 @@ vect_analyze_slp (vec_info *vinfo, unsigned max_tree_size)
        {
          /* Find SLP sequences starting from reduction chains.  */
          FOR_EACH_VEC_ELT (loop_vinfo->reduction_chains, i, first_element)
-             if (vect_analyze_slp_instance (vinfo, first_element,
+           if (! vect_analyze_slp_instance (vinfo, first_element,
                                             max_tree_size))
-               ok = true;
-             else
-               return false;
-
-         /* Don't try to vectorize SLP reductions if reduction chain was
-            detected.  */
-         return ok;
+             return false;
        }
 
       /* Find SLP sequences starting from groups of reductions.  */
-      if (loop_vinfo->reductions.length () > 1
-         && vect_analyze_slp_instance (vinfo, loop_vinfo->reductions[0],
-                                       max_tree_size))
-       ok = true;
+      if (loop_vinfo->reductions.length () > 1)
+       vect_analyze_slp_instance (vinfo, loop_vinfo->reductions[0],
+                                  max_tree_size);
     }
 
   return true;