+2019-11-14 Richard Sandiford <richard.sandiford@arm.com>
+
+ * tree.h (build_truth_vector_type): Delete.
+ (build_same_sized_truth_vector_type): Likewise.
+ * tree.c (build_truth_vector_type): Rename to...
+ (build_truth_vector_type_for): ...this. Make static and take
+ a vector type as argument.
+ (truth_type_for): Update accordingly.
+ (build_same_sized_truth_vector_type): Delete.
+ * tree-vect-generic.c (expand_vector_divmod): Use truth_type_for
+ instead of build_same_sized_truth_vector_type.
+ * tree-vect-loop.c (vect_create_epilog_for_reduction): Likewise.
+ (vect_record_loop_mask, vect_get_loop_mask): Likewise.
+ * tree-vect-patterns.c (build_mask_conversion): Likeise.
+ * tree-vect-slp.c (vect_get_constant_vectors): Likewise.
+ * tree-vect-stmts.c (vect_get_vec_def_for_operand): Likewise.
+ (vect_build_gather_load_calls, vectorizable_call): Likewise.
+ (scan_store_can_perm_p, vectorizable_scan_store): Likewise.
+ (vectorizable_store, vectorizable_condition): Likewise.
+ (get_mask_type_for_scalar_type, get_same_sized_vectype): Likewise.
+ (vect_get_mask_type_for_stmt): Use truth_type_for instead of
+ build_truth_vector_type.
+ * config/aarch64/aarch64-sve-builtins.cc (gimple_folder::convert_pred):
+ Use truth_type_for instead of build_same_sized_truth_vector_type.
+ * config/rs6000/rs6000-call.c (fold_build_vec_cmp): Likewise.
+
2019-11-14 Richard Sandiford <richard.sandiford@arm.com>
* tree.h (build_truth_vector_type_for_mode): Declare.
+2019-11-14 Richard Sandiford <richard.sandiford@arm.com>
+
+ * c-typeck.c (build_conditional_expr): Use truth_type_for instead
+ of build_same_sized_truth_vector_type.
+ (build_vec_cmp): Likewise.
+
2019-11-14 Jakub Jelinek <jakub@redhat.com>
* c-parser.c (c_parser_omp_context_selector): Don't require score
tree elem_type = TREE_TYPE (vectype);
tree zero = build_int_cst (elem_type, 0);
tree zero_vec = build_vector_from_val (vectype, zero);
- tree cmp_type = build_same_sized_truth_vector_type (vectype);
+ tree cmp_type = truth_type_for (vectype);
ifexp = build2 (NE_EXPR, cmp_type, ifexp, zero_vec);
}
{
tree zero_vec = build_zero_cst (type);
tree minus_one_vec = build_minus_one_cst (type);
- tree cmp_type = build_same_sized_truth_vector_type (type);
+ tree cmp_type = truth_type_for (type);
tree cmp = build2 (code, cmp_type, arg0, arg1);
return build3 (VEC_COND_EXPR, type, cmp, minus_one_vec, zero_vec);
}
gimple_folder::convert_pred (gimple_seq &stmts, tree vectype,
unsigned int argno)
{
- tree predtype = build_same_sized_truth_vector_type (vectype);
+ tree predtype = truth_type_for (vectype);
tree pred = gimple_call_arg (call, argno);
return gimple_build (&stmts, VIEW_CONVERT_EXPR, predtype, pred);
}
fold_build_vec_cmp (tree_code code, tree type,
tree arg0, tree arg1)
{
- tree cmp_type = build_same_sized_truth_vector_type (type);
+ tree cmp_type = truth_type_for (type);
tree zero_vec = build_zero_cst (type);
tree minus_one_vec = build_minus_one_cst (type);
tree cmp = fold_build2 (code, cmp_type, arg0, arg1);
+2019-11-14 Richard Sandiford <richard.sandiford@arm.com>
+
+ * call.c (build_conditional_expr_1): Use truth_type_for instead
+ of build_same_sized_truth_vector_type.
+ * typeck.c (build_vec_cmp): Likewise.
+
2019-11-14 Jakub Jelinek <jakub@redhat.com>
* parser.c (cp_parser_omp_context_selector): Don't require score
if (!COMPARISON_CLASS_P (arg1))
{
- tree cmp_type = build_same_sized_truth_vector_type (arg1_type);
+ tree cmp_type = truth_type_for (arg1_type);
arg1 = build2 (NE_EXPR, cmp_type, arg1, build_zero_cst (arg1_type));
}
return build3_loc (loc, VEC_COND_EXPR, arg2_type, arg1, arg2, arg3);
{
tree zero_vec = build_zero_cst (type);
tree minus_one_vec = build_minus_one_cst (type);
- tree cmp_type = build_same_sized_truth_vector_type(type);
+ tree cmp_type = truth_type_for (type);
tree cmp = build2 (code, cmp_type, arg0, arg1);
return build3 (VEC_COND_EXPR, type, cmp, minus_one_vec, zero_vec);
}
+2019-11-14 Richard Sandiford <richard.sandiford@arm.com>
+
+ * d-codegen.cc (build_boolop): Use truth_type_for instead of
+ build_same_sized_truth_vector_type.
+
2019-11-13 Joseph Myers <joseph@codesourcery.com>
* d-target.cc (define_float_constants): Update call to
/* Build a vector comparison.
VEC_COND_EXPR <e1 op e2, { -1, -1, -1, -1 }, { 0, 0, 0, 0 }>; */
tree type = TREE_TYPE (arg0);
- tree cmptype = build_same_sized_truth_vector_type (type);
+ tree cmptype = truth_type_for (type);
tree cmp = fold_build2_loc (input_location, code, cmptype, arg0, arg1);
return fold_build3_loc (input_location, VEC_COND_EXPR, type, cmp,
tree zero, cst, cond, mask_type;
gimple *stmt;
- mask_type = build_same_sized_truth_vector_type (type);
+ mask_type = truth_type_for (type);
zero = build_zero_cst (type);
cond = build2 (LT_EXPR, mask_type, op0, zero);
tree_vector_builder vec (type, nunits, 1);
tree index_vec_type = TREE_TYPE (induction_index);
gcc_checking_assert (TYPE_UNSIGNED (index_vec_type));
tree index_scalar_type = TREE_TYPE (index_vec_type);
- tree index_vec_cmp_type = build_same_sized_truth_vector_type
- (index_vec_type);
+ tree index_vec_cmp_type = truth_type_for (index_vec_type);
/* Get an unsigned integer version of the type of the data vector. */
int scalar_precision
tree index = build_index_vector (vectype, 0, 1);
tree index_type = TREE_TYPE (index);
tree index_elt_type = TREE_TYPE (index_type);
- tree mask_type = build_same_sized_truth_vector_type (index_type);
+ tree mask_type = truth_type_for (index_type);
/* Create a vector that, for each element, identifies which of
the REDUC_GROUP_SIZE results should use it. */
if (rgm->max_nscalars_per_iter < nscalars_per_iter)
{
rgm->max_nscalars_per_iter = nscalars_per_iter;
- rgm->mask_type = build_same_sized_truth_vector_type (vectype);
+ rgm->mask_type = truth_type_for (vectype);
}
}
gcc_assert (multiple_p (TYPE_VECTOR_SUBPARTS (mask_type),
TYPE_VECTOR_SUBPARTS (vectype)));
gimple_seq seq = NULL;
- mask_type = build_same_sized_truth_vector_type (vectype);
+ mask_type = truth_type_for (vectype);
mask = gimple_build (&seq, VIEW_CONVERT_EXPR, mask_type, mask);
if (seq)
gsi_insert_seq_before (gsi, seq, GSI_SAME_STMT);
gimple *stmt;
tree masktype, tmp;
- masktype = build_same_sized_truth_vector_type (vectype);
+ masktype = truth_type_for (vectype);
tmp = vect_recog_temp_ssa_var (TREE_TYPE (masktype), NULL);
stmt = gimple_build_assign (tmp, CONVERT_EXPR, mask);
append_pattern_def_seq (stmt_vinfo, stmt, masktype);
tree stmt_vectype = STMT_VINFO_VECTYPE (stmt_vinfo);
if (VECT_SCALAR_BOOLEAN_TYPE_P (TREE_TYPE (op))
&& vect_mask_constant_operand_p (stmt_vinfo))
- vector_type
- = build_same_sized_truth_vector_type (stmt_vectype);
+ vector_type = truth_type_for (stmt_vectype);
else
vector_type = get_vectype_for_scalar_type (vinfo, TREE_TYPE (op));
vector_type = vectype;
else if (VECT_SCALAR_BOOLEAN_TYPE_P (TREE_TYPE (op))
&& VECTOR_BOOLEAN_TYPE_P (stmt_vectype))
- vector_type = build_same_sized_truth_vector_type (stmt_vectype);
+ vector_type = truth_type_for (stmt_vectype);
else
vector_type = get_vectype_for_scalar_type (loop_vinfo, TREE_TYPE (op));
|| TREE_CODE (masktype) == INTEGER_TYPE
|| types_compatible_p (srctype, masktype)));
if (mask && TREE_CODE (masktype) == INTEGER_TYPE)
- masktype = build_same_sized_truth_vector_type (srctype);
+ masktype = truth_type_for (srctype);
tree mask_halftype = masktype;
tree perm_mask = NULL_TREE;
mask_perm_mask = vect_gen_perm_mask_checked (masktype, indices);
}
else if (mask)
- mask_halftype
- = build_same_sized_truth_vector_type (gs_info->offset_vectype);
+ mask_halftype = truth_type_for (gs_info->offset_vectype);
}
else
gcc_unreachable ();
if (mask_opno >= 0 && !vectypes[mask_opno])
{
gcc_assert (modifier != WIDEN);
- vectypes[mask_opno]
- = build_same_sized_truth_vector_type (vectype_in);
+ vectypes[mask_opno] = truth_type_for (vectype_in);
}
for (i = 0; i < nargs; i++)
&& TREE_CODE (init) != REAL_CST)
|| !initializer_zerop (init))
{
- tree masktype = build_same_sized_truth_vector_type (vectype);
+ tree masktype = truth_type_for (vectype);
if (!expand_vec_cond_expr_p (vectype, masktype, VECTOR_CST))
return -1;
whole_vector_shift_kind = scan_store_kind_lshift_cond;
zero_vec = build_zero_cst (vectype);
if (masktype == NULL_TREE
&& use_whole_vector[i] == scan_store_kind_lshift_cond)
- masktype = build_same_sized_truth_vector_type (vectype);
+ masktype = truth_type_for (vectype);
perms[i] = vect_gen_perm_mask_any (vectype, indices);
}
else
ncopies *= 2;
if (mask)
- mask_halfvectype
- = build_same_sized_truth_vector_type (gs_info.offset_vectype);
+ mask_halfvectype = truth_type_for (gs_info.offset_vectype);
}
else
gcc_unreachable ();
return false;
masked = !COMPARISON_CLASS_P (cond_expr);
- vec_cmp_type = build_same_sized_truth_vector_type (comp_vectype);
+ vec_cmp_type = truth_type_for (comp_vectype);
if (vec_cmp_type == NULL_TREE)
return false;
if (!vectype)
return NULL;
- return build_truth_vector_type (TYPE_VECTOR_SUBPARTS (vectype),
- vinfo->vector_size);
+ return truth_type_for (vectype);
}
/* Function get_same_sized_vectype
get_same_sized_vectype (tree scalar_type, tree vector_type)
{
if (VECT_SCALAR_BOOLEAN_TYPE_P (scalar_type))
- return build_same_sized_truth_vector_type (vector_type);
+ return truth_type_for (vector_type);
return get_vectype_for_scalar_type_and_size
(scalar_type, GET_MODE_SIZE (TYPE_MODE (vector_type)));
&& !VECTOR_BOOLEAN_TYPE_P (mask_type)
&& gimple_code (stmt) == GIMPLE_ASSIGN
&& TREE_CODE_CLASS (gimple_assign_rhs_code (stmt)) == tcc_comparison)
- mask_type = build_same_sized_truth_vector_type (mask_type);
+ mask_type = truth_type_for (mask_type);
}
/* No mask_type should mean loop invariant predicate.
return make_vector_type (bool_type, nunits, mask_mode);
}
-/* Build truth vector with specified length and number of units. */
+/* Build a vector type that holds one boolean result for each element of
+ vector type VECTYPE. The public interface for this operation is
+ truth_type_for. */
-tree
-build_truth_vector_type (poly_uint64 nunits, poly_uint64 vector_size)
+static tree
+build_truth_vector_type_for (tree vectype)
{
+ poly_uint64 nunits = TYPE_VECTOR_SUBPARTS (vectype);
+ poly_uint64 vector_size = tree_to_poly_uint64 (TYPE_SIZE_UNIT (vectype));
+
machine_mode mask_mode;
if (targetm.vectorize.get_mask_mode (nunits,
vector_size).exists (&mask_mode))
return make_vector_type (bool_type, nunits, BLKmode);
}
-/* Returns a vector type corresponding to a comparison of VECTYPE. */
-
-tree
-build_same_sized_truth_vector_type (tree vectype)
-{
- if (VECTOR_BOOLEAN_TYPE_P (vectype))
- return vectype;
-
- poly_uint64 size = GET_MODE_SIZE (TYPE_MODE (vectype));
-
- if (known_eq (size, 0U))
- size = tree_to_uhwi (TYPE_SIZE_UNIT (vectype));
-
- return build_truth_vector_type (TYPE_VECTOR_SUBPARTS (vectype), size);
-}
-
/* Like build_vector_type, but builds a variant type with TYPE_VECTOR_OPAQUE
set. */
{
if (VECTOR_BOOLEAN_TYPE_P (type))
return type;
- return build_truth_vector_type (TYPE_VECTOR_SUBPARTS (type),
- GET_MODE_SIZE (TYPE_MODE (type)));
+ return build_truth_vector_type_for (type);
}
else
return boolean_type_node;
extern tree build_vector_type_for_mode (tree, machine_mode);
extern tree build_vector_type (tree, poly_int64);
extern tree build_truth_vector_type_for_mode (poly_uint64, machine_mode);
-extern tree build_truth_vector_type (poly_uint64, poly_uint64);
-extern tree build_same_sized_truth_vector_type (tree vectype);
extern tree build_opaque_vector_type (tree, poly_int64);
extern tree build_index_type (tree);
extern tree build_array_type (tree, tree, bool = false);