aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2017-06-29 14:04:02 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2017-06-29 14:04:02 +0000
commit0630a4ecda602a90e978c3285cf1028e92ff5e8b (patch)
treecc5cefd595920573102156822f21d901451a76c1
parentf76b422479df586a93a0a2eaac748b59923d6e97 (diff)
downloadgcc-0630a4ecda602a90e978c3285cf1028e92ff5e8b.zip
gcc-0630a4ecda602a90e978c3285cf1028e92ff5e8b.tar.gz
gcc-0630a4ecda602a90e978c3285cf1028e92ff5e8b.tar.bz2
tree-vect-loop.c (vect_analyze_scalar_cycles_1): Do not add reduction chains to LOOP_VINFO_REDUCTIONS.
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
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/vect/slp-reduc-8.c48
-rw-r--r--gcc/tree-vect-loop.c6
-rw-r--r--gcc/tree-vect-slp.c21
5 files changed, 69 insertions, 17 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f230dad..bc58f15 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 70651d5..3dbd4e2 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..618c800
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/slp-reduc-8.c
@@ -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" } } */
diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c
index a055836..32a5caa 100644
--- a/gcc/tree-vect-loop.c
+++ b/gcc/tree-vect-loop.c
@@ -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);
}
}
}
diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c
index eb7bc55..9e7a20d 100644
--- a/gcc/tree-vect-slp.c
+++ b/gcc/tree-vect-slp.c
@@ -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;