aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2016-06-06 20:35:03 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2016-06-06 20:35:03 +0200
commit158beb4ab3f6adace5f3c328cba3470eb1cc6357 (patch)
tree1f0552a56d612f2fbe874cd5e779d99ca7f51555 /gcc
parent8af83210748a6ef2d0a7f92c103d7f2baddbcabc (diff)
downloadgcc-158beb4ab3f6adace5f3c328cba3470eb1cc6357.zip
gcc-158beb4ab3f6adace5f3c328cba3470eb1cc6357.tar.gz
gcc-158beb4ab3f6adace5f3c328cba3470eb1cc6357.tar.bz2
re PR tree-optimization/71259 (GCC trunk emits wrong code)
PR tree-optimization/71259 * tree-vect-slp.c (vect_get_constant_vectors): For VECTOR_BOOLEAN_TYPE_P, return all ones constant instead of one for constant op, and use COND_EXPR for non-constant. * gcc.dg/vect/pr71259.c: New test. From-SVN: r237147
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr71259.c28
-rw-r--r--gcc/tree-vect-slp.c10
4 files changed, 48 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 68a7b78..ccabd6f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2016-06-06 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/71259
+ * tree-vect-slp.c (vect_get_constant_vectors): For
+ VECTOR_BOOLEAN_TYPE_P, return all ones constant instead of
+ one for constant op, and use COND_EXPR for non-constant.
+
2016-06-06 David Malcolm <dmalcolm@redhat.com>
* Makefile.in (OBJS): Add function-tests.o,
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 15a7716..fa5d700 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-06-06 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/71259
+ * gcc.dg/vect/pr71259.c: New test.
+
2016-06-06 David Malcolm <dmalcolm@redhat.com>
* gcc.dg/plugin/levenshtein-test-1.c: Delete.
diff --git a/gcc/testsuite/gcc.dg/vect/pr71259.c b/gcc/testsuite/gcc.dg/vect/pr71259.c
new file mode 100644
index 0000000..eefa243
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr71259.c
@@ -0,0 +1,28 @@
+/* PR tree-optimization/71259 */
+/* { dg-do run } */
+/* { dg-options "-O3" } */
+/* { dg-additional-options "-mavx" { target avx_runtime } } */
+
+#include "tree-vect.h"
+
+long a, b[1][44][2];
+long long c[44][17][2];
+
+int
+main ()
+{
+ int i, j, k;
+ check_vect ();
+ asm volatile ("" : : : "memory");
+ for (i = 0; i < 44; i++)
+ for (j = 0; j < 17; j++)
+ for (k = 0; k < 2; k++)
+ c[i][j][k] = (30995740 >= *(k + *(j + *b)) != (a != 8)) - 5105075050047261684;
+ asm volatile ("" : : : "memory");
+ for (i = 0; i < 44; i++)
+ for (j = 0; j < 17; j++)
+ for (k = 0; k < 2; k++)
+ if (c[i][j][k] != -5105075050047261684)
+ __builtin_abort ();
+ return 0;
+}
diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c
index 3de53d1..9112094 100644
--- a/gcc/tree-vect-slp.c
+++ b/gcc/tree-vect-slp.c
@@ -3056,7 +3056,7 @@ vect_get_constant_vectors (tree op, slp_tree slp_node,
if (integer_zerop (op))
op = build_int_cst (TREE_TYPE (vector_type), 0);
else if (integer_onep (op))
- op = build_int_cst (TREE_TYPE (vector_type), 1);
+ op = build_all_ones_cst (TREE_TYPE (vector_type));
else
gcc_unreachable ();
}
@@ -3071,8 +3071,14 @@ vect_get_constant_vectors (tree op, slp_tree slp_node,
gimple *init_stmt;
if (VECTOR_BOOLEAN_TYPE_P (vector_type))
{
+ tree true_val
+ = build_all_ones_cst (TREE_TYPE (vector_type));
+ tree false_val
+ = build_zero_cst (TREE_TYPE (vector_type));
gcc_assert (INTEGRAL_TYPE_P (TREE_TYPE (op)));
- init_stmt = gimple_build_assign (new_temp, NOP_EXPR, op);
+ init_stmt = gimple_build_assign (new_temp, COND_EXPR,
+ op, true_val,
+ false_val);
}
else
{