aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2020-07-27 13:55:38 +0200
committerMartin Liska <mliska@suse.cz>2020-07-27 15:04:24 +0200
commit55c9695cbe91c406805ac0cd342949f32f13b779 (patch)
tree400c5b7ea838ff951c9bdb35a541456c4f2c0a82 /gcc
parentc4c22e830251e1961c6ebec78d28d039eb2e6017 (diff)
downloadgcc-55c9695cbe91c406805ac0cd342949f32f13b779.zip
gcc-55c9695cbe91c406805ac0cd342949f32f13b779.tar.gz
gcc-55c9695cbe91c406805ac0cd342949f32f13b779.tar.bz2
Do not expand vector comparison with VEC_COND_EXPR.
gcc/ChangeLog: PR tree-optimization/96128 * tree-vect-generic.c (expand_vector_comparison): Do not expand vector comparison with VEC_COND_EXPR. gcc/testsuite/ChangeLog: PR tree-optimization/96128 * gcc.target/s390/vector/pr96128.c: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/gcc.target/s390/vector/pr96128.c35
-rw-r--r--gcc/tree-vect-generic.c3
2 files changed, 36 insertions, 2 deletions
diff --git a/gcc/testsuite/gcc.target/s390/vector/pr96128.c b/gcc/testsuite/gcc.target/s390/vector/pr96128.c
new file mode 100644
index 0000000..20abe5e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/vector/pr96128.c
@@ -0,0 +1,35 @@
+/* PR tree-optimization/96128 */
+/* { dg-options "-march=z13" } */
+
+#define B_TEST(TYPE) { TYPE v __attribute__((vector_size(16))); (void)((v < v) < v); }
+#ifdef __cplusplus
+#define T_TEST(TYPE) { TYPE s; TYPE v __attribute__((vector_size(16))); __typeof((v<v)[0]) iv __attribute__((vector_size(16))); (void)((iv ? s : s) < v); }
+#else
+#define T_TEST(TYPE)
+#endif
+#define T(TYPE) B_TEST(TYPE) T_TEST(TYPE)
+#ifdef __SIZEOF_INT128__
+#define SIZEOF_MAXINT __SIZEOF_INT128__
+#else
+#define SIZEOF_MAXINT __SIZEOF_LONG_LONG__
+#endif
+
+void f ()
+{
+ T(short)
+ T(int)
+ T(long)
+ T(long long)
+
+ T_TEST(float)
+ T_TEST(double)
+ /* Avoid trouble with non-power-of-two sizes.
+ Also avoid trouble with long double larger than integral types. */
+#if !defined(__i386__) && !defined(__x86_64__) && !defined(__m68k__) \
+ && !defined(__ia64__) && !defined(__hppa__) \
+ && (__SIZEOF_LONG_DOUBLE__ & (__SIZEOF_LONG_DOUBLE__ - 1)) == 0 \
+ && __SIZEOF_LONG_DOUBLE__ <= 16 \
+ && __SIZEOF_LONG_DOUBLE__ <= SIZEOF_MAXINT
+ T_TEST(long double)
+#endif
+}
diff --git a/gcc/tree-vect-generic.c b/gcc/tree-vect-generic.c
index f8bd26f..fe6477c 100644
--- a/gcc/tree-vect-generic.c
+++ b/gcc/tree-vect-generic.c
@@ -419,8 +419,7 @@ expand_vector_comparison (gimple_stmt_iterator *gsi, tree type, tree op0,
return NULL_TREE;
tree t;
- if (!expand_vec_cmp_expr_p (TREE_TYPE (op0), type, code)
- && !expand_vec_cond_expr_p (type, TREE_TYPE (op0), code))
+ if (!expand_vec_cmp_expr_p (TREE_TYPE (op0), type, code))
{
if (VECTOR_BOOLEAN_TYPE_P (type)
&& SCALAR_INT_MODE_P (TYPE_MODE (type))