re PR tree-optimization/92222 (ice in useless_type_conversion_p, at gimple-expr.c:86)

2019-10-25  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/92222
	* tree-vect-slp.c (_slp_oprnd_info::first_pattern): Remove.
	(_slp_oprnd_info::second_pattern): Likewise.
	(_slp_oprnd_info::any_pattern): New.
	(vect_create_oprnd_info): Adjust.
	(vect_get_and_check_slp_defs): Compute whether any stmt is
	in a pattern.
	(vect_build_slp_tree_2): Avoid building up a node from scalars
	if any of the operand defs, not just the first, is in a pattern.

	* gcc.dg/torture/pr92222.c: New testcase.

From-SVN: r277448
This commit is contained in:
Richard Biener 2019-10-25 13:03:56 +00:00 committed by Richard Biener
parent 77100812a3
commit 7098ab48b0
4 changed files with 42 additions and 12 deletions

View File

@ -1,3 +1,15 @@
2019-10-25 Richard Biener <rguenther@suse.de>
PR tree-optimization/92222
* tree-vect-slp.c (_slp_oprnd_info::first_pattern): Remove.
(_slp_oprnd_info::second_pattern): Likewise.
(_slp_oprnd_info::any_pattern): New.
(vect_create_oprnd_info): Adjust.
(vect_get_and_check_slp_defs): Compute whether any stmt is
in a pattern.
(vect_build_slp_tree_2): Avoid building up a node from scalars
if any of the operand defs, not just the first, is in a pattern.
2019-10-25 Richard Biener <rguenther@suse.de>
* tree-vect-slp.c (vect_get_and_check_slp_defs): Only fail

View File

@ -1,3 +1,8 @@
2019-10-25 Richard Biener <rguenther@suse.de>
PR tree-optimization/92222
* gcc.dg/torture/pr92222.c: New testcase.
2019-10-25 Richard Sandiford <richard.sandiford@arm.com>
* gcc.target/aarch64/sve/reduc_strict_3.c (double_reduc1): Prevent

View File

@ -0,0 +1,17 @@
/* { dg-do compile } */
/* { dg-additional-options "-ftree-vectorize" } */
unsigned char *a;
int b;
void f();
void c()
{
char *d;
int e;
for (; b; b++) {
e = 7;
for (; e >= 0; e--)
*d++ = a[b] & 1 << e ? '1' : '0';
}
f();
}

View File

@ -177,8 +177,7 @@ typedef struct _slp_oprnd_info
stmt. */
tree first_op_type;
enum vect_def_type first_dt;
bool first_pattern;
bool second_pattern;
bool any_pattern;
} *slp_oprnd_info;
@ -199,8 +198,7 @@ vect_create_oprnd_info (int nops, int group_size)
oprnd_info->ops.create (group_size);
oprnd_info->first_dt = vect_uninitialized_def;
oprnd_info->first_op_type = NULL_TREE;
oprnd_info->first_pattern = false;
oprnd_info->second_pattern = false;
oprnd_info->any_pattern = false;
oprnds_info.quick_push (oprnd_info);
}
@ -339,13 +337,11 @@ vect_get_and_check_slp_defs (vec_info *vinfo, unsigned char *swap,
tree oprnd;
unsigned int i, number_of_oprnds;
enum vect_def_type dt = vect_uninitialized_def;
bool pattern = false;
slp_oprnd_info oprnd_info;
int first_op_idx = 1;
unsigned int commutative_op = -1U;
bool first_op_cond = false;
bool first = stmt_num == 0;
bool second = stmt_num == 1;
if (gcall *stmt = dyn_cast <gcall *> (stmt_info->stmt))
{
@ -418,13 +414,12 @@ again:
return -1;
}
if (second)
oprnd_info->second_pattern = pattern;
if (def_stmt_info && is_pattern_stmt_p (def_stmt_info))
oprnd_info->any_pattern = true;
if (first)
{
oprnd_info->first_dt = dt;
oprnd_info->first_pattern = pattern;
oprnd_info->first_op_type = TREE_TYPE (oprnd);
}
else
@ -1311,7 +1306,7 @@ vect_build_slp_tree_2 (vec_info *vinfo,
/* ??? Rejecting patterns this way doesn't work. We'd have to
do extra work to cancel the pattern so the uses see the
scalar version. */
&& !is_pattern_stmt_p (SLP_TREE_SCALAR_STMTS (child)[0]))
&& !oprnd_info->any_pattern)
{
slp_tree grandchild;
@ -1358,7 +1353,8 @@ vect_build_slp_tree_2 (vec_info *vinfo,
/* ??? Rejecting patterns this way doesn't work. We'd have to
do extra work to cancel the pattern so the uses see the
scalar version. */
&& !is_pattern_stmt_p (stmt_info))
&& !is_pattern_stmt_p (stmt_info)
&& !oprnd_info->any_pattern)
{
if (dump_enabled_p ())
dump_printf_loc (MSG_NOTE, vect_location,
@ -1447,7 +1443,7 @@ vect_build_slp_tree_2 (vec_info *vinfo,
/* ??? Rejecting patterns this way doesn't work. We'd have
to do extra work to cancel the pattern so the uses see the
scalar version. */
&& !is_pattern_stmt_p (SLP_TREE_SCALAR_STMTS (child)[0]))
&& !oprnd_info->any_pattern)
{
unsigned int j;
slp_tree grandchild;