The following makes sure to lower all VEC_COND_EXPRs that we cannot
trivially expand.

Bootstrapped and tested on x86_64-unknown-linux-gnu.

        * tree-vect-generic.cc (expand_vector_condition): Lower
        vector conditions that we cannot trivially expand.
---
 gcc/tree-vect-generic.cc | 28 +++++++++++++---------------
 1 file changed, 13 insertions(+), 15 deletions(-)

diff --git a/gcc/tree-vect-generic.cc b/gcc/tree-vect-generic.cc
index 72f251f0962..dc4e0e241fe 100644
--- a/gcc/tree-vect-generic.cc
+++ b/gcc/tree-vect-generic.cc
@@ -1033,6 +1033,13 @@ expand_vector_condition (gimple_stmt_iterator *gsi, 
bitmap dce_ssa_names)
   tree_code code = TREE_CODE (a);
   gassign *assign = NULL;
 
+  gcc_assert (VECTOR_BOOLEAN_TYPE_P (TREE_TYPE (a)));
+
+  /* Mask typed, non-vector mode VEC_COND_EXPRs are expanded as bitwise
+     operations by ISEL.  */
+  if (VECTOR_BOOLEAN_TYPE_P (type) && !VECTOR_MODE_P (TYPE_MODE (type)))
+    return true;
+
   if (code == SSA_NAME)
     {
       assign = dyn_cast<gassign *> (SSA_NAME_DEF_STMT (a));
@@ -1048,21 +1055,12 @@ expand_vector_condition (gimple_stmt_iterator *gsi, 
bitmap dce_ssa_names)
        }
     }
 
-  if (expand_vec_cond_expr_p (type, TREE_TYPE (a1), code)
-      || (integer_all_onesp (b) && integer_zerop (c)
-         && expand_vec_cmp_expr_p (type, TREE_TYPE (a1), code)))
-    {
-      gcc_assert (TREE_CODE (a) == SSA_NAME || TREE_CODE (a) == VECTOR_CST);
-      return true;
-    }
-
-  /* If a has vector boolean type and is a comparison, above
-     expand_vec_cond_expr_p might fail, even if both the comparison and
-     VEC_COND_EXPR could be supported individually.  See PR109176.  */
-  if (a_is_comparison
-      && VECTOR_BOOLEAN_TYPE_P (TREE_TYPE (a))
-      && expand_vec_cond_expr_p (type, TREE_TYPE (a))
-      && expand_vec_cmp_expr_p (TREE_TYPE (a1), TREE_TYPE (a), code))
+  /* We are not lowering vector compares separately - those cannot be
+     generated by source without a wrapping vector condition.  Simplifications
+     that separate the comparison need to verify we can code generate it.  */
+  if (expand_vec_cond_expr_p (type, TREE_TYPE (a))
+      && (!a_is_comparison
+         || expand_vec_cmp_expr_p (TREE_TYPE (a1), TREE_TYPE (a), code)))
     return true;
 
   /* Handle vector boolean types with bitmasks.  If there is a comparison
-- 
2.43.0

Reply via email to