+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
+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.
--- /dev/null
+/* { 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" } } */
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);
}
}
}
{
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))
{
{
/* 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;