Commit 1442bc31 by Richard Biener

tree-optimization/93397 delay converted reduction chain adjustment

The following delays adjusting the SLP graph for converted reduction
chains to a point where the SLP build no longer can fail since we
otherwise fail to undo marking the conversion as a group.

2020-01-27  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/93397
	* tree-vect-slp.c (vect_analyze_slp_instance): Delay
	converted reduction chain SLP graph adjustment.

	* gcc.dg/torture/pr93397.c: New testcase.
parent 86075aa5
2020-01-27 Richard Biener <rguenther@suse.de>
PR tree-optimization/93397
* tree-vect-slp.c (vect_analyze_slp_instance): Delay
converted reduction chain SLP graph adjustment.
2020-01-26 Marek Polacek <polacek@redhat.com>
PR sanitizer/93436
......
2020-01-27 Richard Biener <rguenther@suse.de>
PR tree-optimization/93397
* gcc.dg/torture/pr93397.c: New testcase.
2020-01-27 Tobias Burnus <tobias@codesourcery.com>
PR fortran/85781
......
/* { dg-do compile } */
/* { dg-additional-options "-ftree-vectorize" } */
char
bn (char *vu)
{
int b6;
char wv = 0;
for (b6 = 0; b6 <= 64; b6 += 4)
wv += vu[b6] + vu[b6 + 1];
return wv;
}
......@@ -2210,34 +2210,6 @@ vect_analyze_slp_instance (vec_info *vinfo,
&tree_size, bst_map);
if (node != NULL)
{
/* If this is a reduction chain with a conversion in front
amend the SLP tree with a node for that. */
if (!dr
&& REDUC_GROUP_FIRST_ELEMENT (stmt_info)
&& STMT_VINFO_DEF_TYPE (stmt_info) != vect_reduction_def)
{
/* Get at the conversion stmt - we know it's the single use
of the last stmt of the reduction chain. */
gimple *tem = vect_orig_stmt (scalar_stmts[group_size - 1])->stmt;
use_operand_p use_p;
gimple *use_stmt;
bool r = single_imm_use (gimple_assign_lhs (tem), &use_p, &use_stmt);
gcc_assert (r);
next_info = vinfo->lookup_stmt (use_stmt);
next_info = vect_stmt_to_vectorize (next_info);
scalar_stmts = vNULL;
scalar_stmts.create (group_size);
for (unsigned i = 0; i < group_size; ++i)
scalar_stmts.quick_push (next_info);
slp_tree conv = vect_create_new_slp_node (scalar_stmts);
SLP_TREE_CHILDREN (conv).quick_push (node);
node = conv;
/* We also have to fake this conversion stmt as SLP reduction group
so we don't have to mess with too much code elsewhere. */
REDUC_GROUP_FIRST_ELEMENT (next_info) = next_info;
REDUC_GROUP_NEXT_ELEMENT (next_info) = NULL;
}
/* Calculate the unrolling factor based on the smallest type. */
poly_uint64 unrolling_factor
= calculate_unrolling_factor (max_nunits, group_size);
......@@ -2355,6 +2327,36 @@ vect_analyze_slp_instance (vec_info *vinfo,
}
}
/* If this is a reduction chain with a conversion in front
amend the SLP tree with a node for that. */
if (!dr
&& REDUC_GROUP_FIRST_ELEMENT (stmt_info)
&& STMT_VINFO_DEF_TYPE (stmt_info) != vect_reduction_def)
{
/* Get at the conversion stmt - we know it's the single use
of the last stmt of the reduction chain. */
gimple *tem = vect_orig_stmt (scalar_stmts[group_size - 1])->stmt;
use_operand_p use_p;
gimple *use_stmt;
bool r = single_imm_use (gimple_assign_lhs (tem),
&use_p, &use_stmt);
gcc_assert (r);
next_info = vinfo->lookup_stmt (use_stmt);
next_info = vect_stmt_to_vectorize (next_info);
scalar_stmts = vNULL;
scalar_stmts.create (group_size);
for (unsigned i = 0; i < group_size; ++i)
scalar_stmts.quick_push (next_info);
slp_tree conv = vect_create_new_slp_node (scalar_stmts);
SLP_TREE_CHILDREN (conv).quick_push (node);
SLP_INSTANCE_TREE (new_instance) = conv;
/* We also have to fake this conversion stmt as SLP reduction
group so we don't have to mess with too much code
elsewhere. */
REDUC_GROUP_FIRST_ELEMENT (next_info) = next_info;
REDUC_GROUP_NEXT_ELEMENT (next_info) = NULL;
}
vinfo->slp_instances.safe_push (new_instance);
if (dump_enabled_p ())
......
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