We have to avoid folding the condition when building a COND_EXPR
since we no longer gimplify the whole thing.  The folding done
at COND_EXPR build time will deal with possible simplifications.

Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.

2021-04-28  Richard Biener  <rguent...@suse.de>

        PR tree-optimization/100292
        * tree-vect-generic.c (expand_vector_condition): Do not fold
        the comparisons.

        * gcc.dg/pr100292.c: New testcase.
---
 gcc/testsuite/gcc.dg/pr100292.c | 11 +++++++++++
 gcc/tree-vect-generic.c         |  6 +++---
 2 files changed, 14 insertions(+), 3 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/pr100292.c

diff --git a/gcc/testsuite/gcc.dg/pr100292.c b/gcc/testsuite/gcc.dg/pr100292.c
new file mode 100644
index 00000000000..675a60c3412
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr100292.c
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+
+typedef unsigned char __attribute__((__vector_size__ (4))) V;
+
+extern void bar (V v);
+
+void
+foo (char c)
+{
+  bar (c <= (V) 127);
+}
diff --git a/gcc/tree-vect-generic.c b/gcc/tree-vect-generic.c
index 5cc32c40663..d9c0ac9de7e 100644
--- a/gcc/tree-vect-generic.c
+++ b/gcc/tree-vect-generic.c
@@ -1116,15 +1116,15 @@ expand_vector_condition (gimple_stmt_iterator *gsi, 
bitmap dce_ssa_names)
                                       comp_width, comp_index);
          tree aa2 = tree_vec_extract (gsi, comp_inner_type, a2,
                                       comp_width, comp_index);
-         aa = fold_build2 (code, cond_type, aa1, aa2);
+         aa = build2 (code, cond_type, aa1, aa2);
        }
       else if (a_is_scalar_bitmask)
        {
          wide_int w = wi::set_bit_in_zero (i, TYPE_PRECISION (TREE_TYPE (a)));
          result = gimplify_build2 (gsi, BIT_AND_EXPR, TREE_TYPE (a),
                                    a, wide_int_to_tree (TREE_TYPE (a), w));
-         aa = fold_build2 (NE_EXPR, boolean_type_node, result,
-                           build_zero_cst (TREE_TYPE (a)));
+         aa = build2 (NE_EXPR, boolean_type_node, result,
+                      build_zero_cst (TREE_TYPE (a)));
        }
       else
        aa = tree_vec_extract (gsi, cond_type, a, width, index);
-- 
2.26.2

Reply via email to