+2018-01-02 Richard Sandiford <richard.sandiford@linaro.org>
+
+ * tree-cfg.c (verify_gimple_assign_ternary): Allow the size of
+ the selector elements to be different from the data elements
+ if the selector is a VECTOR_CST.
+ * tree-vect-stmts.c (vect_gen_perm_mask_any): Use a vector of
+ ssizetype for the selector.
+
2018-01-02 Richard Sandiford <richard.sandiford@linaro.org>
* optabs.c (shift_amt_for_vec_perm_mask): Try using series_p
}
if (TREE_CODE (TREE_TYPE (rhs3_type)) != INTEGER_TYPE
- || GET_MODE_BITSIZE (SCALAR_INT_TYPE_MODE (TREE_TYPE (rhs3_type)))
- != GET_MODE_BITSIZE (SCALAR_TYPE_MODE (TREE_TYPE (rhs1_type))))
+ || (TREE_CODE (rhs3) != VECTOR_CST
+ && (GET_MODE_BITSIZE (SCALAR_INT_TYPE_MODE
+ (TREE_TYPE (rhs3_type)))
+ != GET_MODE_BITSIZE (SCALAR_TYPE_MODE
+ (TREE_TYPE (rhs1_type))))))
{
error ("invalid mask type in vector permute expression");
debug_generic_expr (lhs_type);
tree
vect_gen_perm_mask_any (tree vectype, const vec_perm_indices &sel)
{
- tree mask_elt_type, mask_type;
+ tree mask_type;
+
+ unsigned int nunits = sel.length ();
+ gcc_assert (nunits == TYPE_VECTOR_SUBPARTS (vectype));
- mask_elt_type = lang_hooks.types.type_for_mode
- (int_mode_for_mode (TYPE_MODE (TREE_TYPE (vectype))).require (), 1);
- mask_type = get_vectype_for_scalar_type (mask_elt_type);
+ mask_type = build_vector_type (ssizetype, nunits);
return vec_perm_indices_to_tree (mask_type, sel);
}