[gcc(refs/vendors/ARM/heads/arm-struct-reorg-wip)] vect: Fix COND_EXPRs involving variant booleans [PR94727]

Tamar Christina tnfchris@gcc.gnu.org
Fri Jul 17 14:49:07 GMT 2020


https://gcc.gnu.org/g:e62a820d686d1fa97a9eefdc65ca07d8f96ac9f4

commit e62a820d686d1fa97a9eefdc65ca07d8f96ac9f4
Author: Richard Sandiford <richard.sandiford@arm.com>
Date:   Tue Apr 28 08:04:29 2020 +0100

    vect: Fix COND_EXPRs involving variant booleans [PR94727]
    
    The previous patch for this PR handled separate comparisons.
    However, as arm targets show, the same fix is needed when
    handling comparisons embedded in a VEC_COND_EXPR.
    
    Here too, the problem is that vect_get_constant_vectors will
    calculate its own vector type, using truth_type_for on the
    STMT_VINFO_VECTYPE, and the vectoriable_* routines need to be
    consistent with that.
    
    2020-04-28  Richard Sandiford  <richard.sandiford@arm.com>
    
    gcc/
            PR tree-optimization/94727
            * tree-vect-stmts.c (vect_is_simple_cond): If both comparison
            operands are invariant booleans, use the mask type associated with the
            STMT_VINFO_VECTYPE.  Use !slp_node instead of !vectype to exclude SLP.
            (vectorizable_condition): Pass vectype unconditionally to
            vect_is_simple_cond.

Diff:
---
 gcc/ChangeLog         |  9 +++++++++
 gcc/tree-vect-stmts.c | 27 ++++++++++++++++-----------
 2 files changed, 25 insertions(+), 11 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a98cb47a521..fe1ddac16eb 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2020-04-28  Richard Sandiford  <richard.sandiford@arm.com>
+
+	PR tree-optimization/94727
+	* tree-vect-stmts.c (vect_is_simple_cond): If both comparison
+	operands are invariant booleans, use the mask type associated with the
+	STMT_VINFO_VECTYPE.  Use !slp_node instead of !vectype to exclude SLP.
+	(vectorizable_condition): Pass vectype unconditionally to
+	vect_is_simple_cond.
+
 2020-04-27  Jakub Jelinek  <jakub@redhat.com>
 
 	PR target/94780
diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c
index 88a1e2c51d2..1984787bac4 100644
--- a/gcc/tree-vect-stmts.c
+++ b/gcc/tree-vect-stmts.c
@@ -9942,16 +9942,21 @@ vect_is_simple_cond (tree cond, vec_info *vinfo, slp_tree slp_node,
   if (! *comp_vectype)
     {
       tree scalar_type = TREE_TYPE (lhs);
-      /* If we can widen the comparison to match vectype do so.  */
-      if (INTEGRAL_TYPE_P (scalar_type)
-	  && vectype
-	  && tree_int_cst_lt (TYPE_SIZE (scalar_type),
-			      TYPE_SIZE (TREE_TYPE (vectype))))
-	scalar_type = build_nonstandard_integer_type
-	  (tree_to_uhwi (TYPE_SIZE (TREE_TYPE (vectype))),
-	   TYPE_UNSIGNED (scalar_type));
-      *comp_vectype = get_vectype_for_scalar_type (vinfo, scalar_type,
-						   slp_node);
+      if (VECT_SCALAR_BOOLEAN_TYPE_P (scalar_type))
+	*comp_vectype = truth_type_for (vectype);
+      else
+	{
+	  /* If we can widen the comparison to match vectype do so.  */
+	  if (INTEGRAL_TYPE_P (scalar_type)
+	      && !slp_node
+	      && tree_int_cst_lt (TYPE_SIZE (scalar_type),
+				  TYPE_SIZE (TREE_TYPE (vectype))))
+	    scalar_type = build_nonstandard_integer_type
+	      (tree_to_uhwi (TYPE_SIZE (TREE_TYPE (vectype))),
+	       TYPE_UNSIGNED (scalar_type));
+	  *comp_vectype = get_vectype_for_scalar_type (vinfo, scalar_type,
+						       slp_node);
+	}
     }
 
   return true;
@@ -10066,7 +10071,7 @@ vectorizable_condition (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi,
   else_clause = gimple_assign_rhs3 (stmt);
 
   if (!vect_is_simple_cond (cond_expr, stmt_info->vinfo, slp_node,
-			    &comp_vectype, &dts[0], slp_node ? NULL : vectype)
+			    &comp_vectype, &dts[0], vectype)
       || !comp_vectype)
     return false;


More information about the Gcc-cvs mailing list