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.
This commit is contained in:
Richard Sandiford 2020-04-28 08:04:29 +01:00
parent f5edc76aca
commit e62a820d68
2 changed files with 25 additions and 11 deletions

View File

@ -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> 2020-04-27 Jakub Jelinek <jakub@redhat.com>
PR target/94780 PR target/94780

View File

@ -9942,16 +9942,21 @@ vect_is_simple_cond (tree cond, vec_info *vinfo, slp_tree slp_node,
if (! *comp_vectype) if (! *comp_vectype)
{ {
tree scalar_type = TREE_TYPE (lhs); tree scalar_type = TREE_TYPE (lhs);
/* If we can widen the comparison to match vectype do so. */ if (VECT_SCALAR_BOOLEAN_TYPE_P (scalar_type))
if (INTEGRAL_TYPE_P (scalar_type) *comp_vectype = truth_type_for (vectype);
&& vectype else
&& tree_int_cst_lt (TYPE_SIZE (scalar_type), {
TYPE_SIZE (TREE_TYPE (vectype)))) /* If we can widen the comparison to match vectype do so. */
scalar_type = build_nonstandard_integer_type if (INTEGRAL_TYPE_P (scalar_type)
(tree_to_uhwi (TYPE_SIZE (TREE_TYPE (vectype))), && !slp_node
TYPE_UNSIGNED (scalar_type)); && tree_int_cst_lt (TYPE_SIZE (scalar_type),
*comp_vectype = get_vectype_for_scalar_type (vinfo, scalar_type, TYPE_SIZE (TREE_TYPE (vectype))))
slp_node); 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; return true;
@ -10066,7 +10071,7 @@ vectorizable_condition (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi,
else_clause = gimple_assign_rhs3 (stmt); else_clause = gimple_assign_rhs3 (stmt);
if (!vect_is_simple_cond (cond_expr, stmt_info->vinfo, slp_node, 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) || !comp_vectype)
return false; return false;