[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