summaryrefslogtreecommitdiff
path: root/gcc/tree-vect-slp.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2019-10-25 13:03:56 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2019-10-25 13:03:56 +0000
commit7098ab48b08782af5016dc8ac6d10215994447a4 (patch)
tree5d27d2ddaa20b183311d9a7fa54f6a637c3a57c3 /gcc/tree-vect-slp.c
parent77100812a3bf4c693cb24c65be54ea367f17a246 (diff)
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
Diffstat (limited to 'gcc/tree-vect-slp.c')
-rw-r--r--gcc/tree-vect-slp.c20
1 files changed, 8 insertions, 12 deletions
diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c
index f3675955fcb..e32731b6db1 100644
--- a/gcc/tree-vect-slp.c
+++ b/gcc/tree-vect-slp.c
@@ -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;