Commit 0630a4ec by Richard Biener Committed by Richard Biener

tree-vect-loop.c (vect_analyze_scalar_cycles_1): Do not add reduction chains to…

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
parent f76b4224
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> 2017-06-29 Nathan Sidwell <nathan@acm.org>
* builtins.c (fold_builtin_FUNCTION): Use * 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> 2017-06-29 Nathan Sidwell <nathan@acm.org>
* g++.dg/cpp1y/builtin_FUNCTION.C: New. * g++.dg/cpp1y/builtin_FUNCTION.C: New.
......
/* { 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" } } */
...@@ -890,8 +890,10 @@ vect_analyze_scalar_cycles_1 (loop_vec_info loop_vinfo, struct loop *loop) ...@@ -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)) = STMT_VINFO_DEF_TYPE (vinfo_for_stmt (reduc_stmt)) =
vect_reduction_def; vect_reduction_def;
/* Store the reduction cycles for possible vectorization in /* Store the reduction cycles for possible vectorization in
loop-aware SLP. */ loop-aware SLP if it was not detected as reduction
LOOP_VINFO_REDUCTIONS (loop_vinfo).safe_push (reduc_stmt); chain. */
if (! GROUP_FIRST_ELEMENT (vinfo_for_stmt (reduc_stmt)))
LOOP_VINFO_REDUCTIONS (loop_vinfo).safe_push (reduc_stmt);
} }
} }
} }
......
...@@ -2102,15 +2102,13 @@ vect_analyze_slp (vec_info *vinfo, unsigned max_tree_size) ...@@ -2102,15 +2102,13 @@ vect_analyze_slp (vec_info *vinfo, unsigned max_tree_size)
{ {
unsigned int i; unsigned int i;
gimple *first_element; gimple *first_element;
bool ok = false;
if (dump_enabled_p ()) if (dump_enabled_p ())
dump_printf_loc (MSG_NOTE, vect_location, "=== vect_analyze_slp ===\n"); dump_printf_loc (MSG_NOTE, vect_location, "=== vect_analyze_slp ===\n");
/* Find SLP sequences starting from groups of grouped stores. */ /* Find SLP sequences starting from groups of grouped stores. */
FOR_EACH_VEC_ELT (vinfo->grouped_stores, i, first_element) FOR_EACH_VEC_ELT (vinfo->grouped_stores, i, first_element)
if (vect_analyze_slp_instance (vinfo, first_element, max_tree_size)) vect_analyze_slp_instance (vinfo, first_element, max_tree_size);
ok = true;
if (loop_vec_info loop_vinfo = dyn_cast <loop_vec_info> (vinfo)) 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) ...@@ -2118,22 +2116,15 @@ vect_analyze_slp (vec_info *vinfo, unsigned max_tree_size)
{ {
/* Find SLP sequences starting from reduction chains. */ /* Find SLP sequences starting from reduction chains. */
FOR_EACH_VEC_ELT (loop_vinfo->reduction_chains, i, first_element) 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)) max_tree_size))
ok = true; return false;
else
return false;
/* Don't try to vectorize SLP reductions if reduction chain was
detected. */
return ok;
} }
/* Find SLP sequences starting from groups of reductions. */ /* Find SLP sequences starting from groups of reductions. */
if (loop_vinfo->reductions.length () > 1 if (loop_vinfo->reductions.length () > 1)
&& vect_analyze_slp_instance (vinfo, loop_vinfo->reductions[0], vect_analyze_slp_instance (vinfo, loop_vinfo->reductions[0],
max_tree_size)) max_tree_size);
ok = true;
} }
return true; return true;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment