aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr69170.c18
-rw-r--r--gcc/tree-vect-slp.c14
4 files changed, 41 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c869492..1cc9288 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2016-01-18 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/69170
+ * tree-vect-slp.c (vect_build_slp_tree): Verify we are not
+ building a vector from scalar results of a pattern stmt.
+
2016-01-18 Jakub Jelinek <jakub@redhat.com>
* haifa-sched.c (autopref_multipass_init): Work around
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index bd9a116..9016093 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-01-18 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/69170
+ * gcc.dg/torture/pr69170.c: New testcase.
+
2016-01-17 John David Anglin <danglin@gcc.gnu.org>
* gcc.dg/torture/builtin-integral-1.c: Require c99_runtime.
diff --git a/gcc/testsuite/gcc.dg/torture/pr69170.c b/gcc/testsuite/gcc.dg/torture/pr69170.c
new file mode 100644
index 0000000..2af0bde
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr69170.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+
+typedef long sha2_word_t;
+typedef struct {
+ sha2_word_t length_upper, length_lower;
+ char buf[];
+} hash_state;
+int a;
+hash_state b;
+void fn1()
+{
+ a = 0;
+ for (; a < 8; a++)
+ b.buf[a + 1024 / 8] = b.length_upper >> (1 - a) * 5;
+ a = 0;
+ for (; a < 8; a++)
+ b.buf[a + 1024 / 8 + 8] = b.length_lower >> (1 - a) * 5;
+}
diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c
index 5767e19..d5bd92e 100644
--- a/gcc/tree-vect-slp.c
+++ b/gcc/tree-vect-slp.c
@@ -966,7 +966,12 @@ vect_build_slp_tree (vec_info *vinfo,
{
/* If we have all children of child built up from scalars then just
throw that away and build it up this node from scalars. */
- if (!SLP_TREE_CHILDREN (child).is_empty ())
+ if (!SLP_TREE_CHILDREN (child).is_empty ()
+ /* ??? 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
+ (vinfo_for_stmt (SLP_TREE_SCALAR_STMTS (child)[0])))
{
slp_tree grandchild;
@@ -1110,7 +1115,12 @@ vect_build_slp_tree (vec_info *vinfo,
/* If we have all children of child built up from scalars then
just throw that away and build it up this node from scalars. */
- if (!SLP_TREE_CHILDREN (child).is_empty ())
+ if (!SLP_TREE_CHILDREN (child).is_empty ()
+ /* ??? 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
+ (vinfo_for_stmt (SLP_TREE_SCALAR_STMTS (child)[0])))
{
unsigned int j;
slp_tree grandchild;