This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [12/13] Use ssizetype selectors for autovectorised VEC_PERM_EXPRs
Ping
Richard Sandiford <richard.sandiford@linaro.org> writes:
> The previous patches mean that there's no reason that constant
> VEC_PERM_EXPRs need to have the same shape as the data inputs.
> This patch makes the autovectoriser use ssizetype elements instead,
> so that indices don't get truncated for large or variable-length vectors.
>
>
> 2017-12-09 Richard Sandiford <richard.sandiford@linaro.org>
>
> gcc/
> * 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.
>
> Index: gcc/tree-cfg.c
> ===================================================================
> --- gcc/tree-cfg.c 2017-12-09 22:47:07.103588314 +0000
> +++ gcc/tree-cfg.c 2017-12-09 22:48:58.259216407 +0000
> @@ -4300,8 +4300,11 @@ verify_gimple_assign_ternary (gassign *s
> }
>
> 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);
> Index: gcc/tree-vect-stmts.c
> ===================================================================
> --- gcc/tree-vect-stmts.c 2017-12-09 22:48:52.268015910 +0000
> +++ gcc/tree-vect-stmts.c 2017-12-09 22:48:58.259216407 +0000
> @@ -6518,11 +6518,12 @@ vectorizable_store (gimple *stmt, gimple
> tree
> vect_gen_perm_mask_any (tree vectype, const vec_perm_indices &sel)
> {
> - tree mask_elt_type, mask_type;
> + tree mask_type;
>
> - 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);
> + unsigned int nunits = sel.length ();
> + gcc_assert (nunits == TYPE_VECTOR_SUBPARTS (vectype));
> +
> + mask_type = build_vector_type (ssizetype, nunits);
> return vec_perm_indices_to_tree (mask_type, sel);
> }
>