From: Richard Biener Date: Wed, 27 Nov 2019 12:09:36 +0000 (+0000) Subject: backport: re PR tree-optimization/92222 (ice in useless_type_conversion_p, at gimple... X-Git-Tag: releases/gcc-9.3.0~351 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=de819c7eb26504f7752b89db089985c83ac5774c;p=thirdparty%2Fgcc.git backport: re PR tree-optimization/92222 (ice in useless_type_conversion_p, at gimple-expr.c:86) 2019-11-27 Richard Biener Backport from mainline 2019-10-25 Richard Biener 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: r278763 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b7c5c5617d11..d75b9005eb2f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,18 @@ +2019-11-27 Richard Biener + + Backport from mainline + 2019-10-25 Richard Biener + + 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-11-21 Jakub Jelinek PR tree-optimization/91355 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2ec93f884c79..ef0e59311f7e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2019-11-27 Richard Biener + + Backport from mainline + 2019-10-25 Richard Biener + + PR tree-optimization/92222 + * gcc.dg/torture/pr92222.c: New testcase. + 2019-11-26 Jerry DeLisle Backport from trunk diff --git a/gcc/testsuite/gcc.dg/torture/pr92222.c b/gcc/testsuite/gcc.dg/torture/pr92222.c new file mode 100644 index 000000000000..f48010d6d310 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr92222.c @@ -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(); +} diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c index 05e14569ee05..2abf480270c5 100644 --- a/gcc/tree-vect-slp.c +++ b/gcc/tree-vect-slp.c @@ -151,8 +151,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; @@ -172,8 +171,7 @@ vect_create_oprnd_info (int nops, int group_size) oprnd_info->def_stmts.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); } @@ -310,13 +308,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 (stmt_info->stmt)) { @@ -379,13 +375,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 @@ -1228,7 +1223,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; @@ -1272,7 +1267,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, @@ -1403,7 +1399,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;