diff options
author | Richard Biener <rguenther@suse.de> | 2013-01-31 16:52:28 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2013-01-31 16:52:28 +0000 |
commit | e44978dcc76c928a85de87bebed33a7ab5609571 (patch) | |
tree | 061022a78dd78325d70e31b1a17238815064417f /gcc | |
parent | 422e2fc06270497c479de0da7408158cc5e31c9a (diff) | |
download | gcc-e44978dcc76c928a85de87bebed33a7ab5609571.zip gcc-e44978dcc76c928a85de87bebed33a7ab5609571.tar.gz gcc-e44978dcc76c928a85de87bebed33a7ab5609571.tar.bz2 |
re PR tree-optimization/56157 (ICE with -ftree-vectorize in in compute_live_loop_exits)
2013-01-31 Richard Biener <rguenther@suse.de>
PR tree-optimization/56157
* tree-vect-slp.c (vect_get_slp_defs): More thoroughly try to
match up operand with SLP child.
* gcc.dg/torture/pr56157.c: New testcase.
From-SVN: r195616
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr56157.c | 25 | ||||
-rw-r--r-- | gcc/tree-vect-slp.c | 35 |
4 files changed, 50 insertions, 21 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 880dff8..9c3c9e2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2013-01-31 Richard Biener <rguenther@suse.de> + + PR tree-optimization/56157 + * tree-vect-slp.c (vect_get_slp_defs): More thoroughly try to + match up operand with SLP child. + 2013-01-31 Jason Merrill <jason@redhat.com> PR c++/54410 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2632cd0..7a8baa6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-01-31 Richard Biener <rguenther@suse.de> + + PR tree-optimization/56157 + * gcc.dg/torture/pr56157.c: New testcase. + 2013-01-30 Richard Biener <rguenther@suse.de> PR tree-optimization/56150 diff --git a/gcc/testsuite/gcc.dg/torture/pr56157.c b/gcc/testsuite/gcc.dg/torture/pr56157.c new file mode 100644 index 0000000..796e323 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr56157.c @@ -0,0 +1,25 @@ +/* { dg-do compile } */ +/* { dg-options "-ftree-vectorize" } */ + +struct Pixel { + unsigned short r; + unsigned short g; + unsigned short b; + unsigned short a; +}; + +void fn(unsigned char * __restrict dst, const unsigned char * __restrict src) +{ + unsigned x; + for(x = 0; x < 1024; x += 1) + { + struct Pixel pixel; + pixel.r = (unsigned short)(((unsigned)src[0]) * 0xffff / 0xff); + pixel.g = (unsigned short)(((unsigned)src[1]) * 0xffff / 0xff); + pixel.b = (unsigned short)(((unsigned)src[2]) * 0xffff / 0xff); + pixel.a = (unsigned short)(((unsigned)src[3]) * 0xffff / 0xff); + __builtin_memcpy(dst, &pixel, sizeof pixel); + src += 4; + dst += 8; + } +} diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c index 941661e..36f8129 100644 --- a/gcc/tree-vect-slp.c +++ b/gcc/tree-vect-slp.c @@ -2616,13 +2616,13 @@ void vect_get_slp_defs (vec<tree> ops, slp_tree slp_node, vec<slp_void_p> *vec_oprnds, int reduc_index) { - gimple first_stmt, first_def; + gimple first_stmt; int number_of_vects = 0, i; unsigned int child_index = 0; HOST_WIDE_INT lhs_size_unit, rhs_size_unit; slp_tree child = NULL; vec<tree> *vec_defs; - tree oprnd, def_lhs; + tree oprnd; bool vectorized_defs; first_stmt = SLP_TREE_SCALAR_STMTS (slp_node)[0]; @@ -2638,29 +2638,22 @@ vect_get_slp_defs (vec<tree> ops, slp_tree slp_node, if (SLP_TREE_CHILDREN (slp_node).length () > child_index) { child = (slp_tree) SLP_TREE_CHILDREN (slp_node)[child_index]; - first_def = SLP_TREE_SCALAR_STMTS (child)[0]; - - /* In the end of a pattern sequence we have a use of the original stmt, - so we need to compare OPRND with the original def. */ - if (is_pattern_stmt_p (vinfo_for_stmt (first_def)) - && !STMT_VINFO_IN_PATTERN_P (vinfo_for_stmt (first_stmt)) - && !is_pattern_stmt_p (vinfo_for_stmt (first_stmt))) - first_def = STMT_VINFO_RELATED_STMT (vinfo_for_stmt (first_def)); - if (is_gimple_call (first_def)) - def_lhs = gimple_call_lhs (first_def); - else - def_lhs = gimple_assign_lhs (first_def); + /* We have to check both pattern and original def, if available. */ + gimple first_def = SLP_TREE_SCALAR_STMTS (child)[0]; + gimple related = STMT_VINFO_RELATED_STMT (vinfo_for_stmt (first_def)); - if (operand_equal_p (oprnd, def_lhs, 0)) - { - /* The number of vector defs is determined by the number of - vector statements in the node from which we get those + if (operand_equal_p (oprnd, gimple_get_lhs (first_def), 0) + || (related + && operand_equal_p (oprnd, gimple_get_lhs (related), 0))) + { + /* The number of vector defs is determined by the number of + vector statements in the node from which we get those statements. */ - number_of_vects = SLP_TREE_NUMBER_OF_VEC_STMTS (child); - vectorized_defs = true; + number_of_vects = SLP_TREE_NUMBER_OF_VEC_STMTS (child); + vectorized_defs = true; child_index++; - } + } } if (!vectorized_defs) |