diff options
author | Richard Sandiford <richard.sandiford@linaro.org> | 2018-01-02 18:27:35 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2018-01-02 18:27:35 +0000 |
commit | b00cb3bfa50c5477347082a9450b4a63e4fee263 (patch) | |
tree | 963d6682878902655fb09b1a218b3b9537b7b594 | |
parent | d3867483044ae00bac6daaeac6274e95254fb991 (diff) | |
download | gcc-b00cb3bfa50c5477347082a9450b4a63e4fee263.zip gcc-b00cb3bfa50c5477347082a9450b4a63e4fee263.tar.gz gcc-b00cb3bfa50c5477347082a9450b4a63e4fee263.tar.bz2 |
Use ssizetype selectors for autovectorised VEC_PERM_EXPRs
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 sizetype elements instead,
so that indices don't get truncated for large or variable-length
vectors.
2018-01-02 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.
From-SVN: r256100
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/tree-cfg.c | 7 | ||||
-rw-r--r-- | gcc/tree-vect-stmts.c | 9 |
3 files changed, 18 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1dfb683..00effd0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,13 @@ 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 before testing each element individually. * tree-vect-generic.c (lower_vec_perm): Likewise. diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index bed4947..96b638f 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -4428,8 +4428,11 @@ verify_gimple_assign_ternary (gassign *stmt) } 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); diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c index 0f77567..8d1dc04 100644 --- a/gcc/tree-vect-stmts.c +++ b/gcc/tree-vect-stmts.c @@ -6535,11 +6535,12 @@ vectorizable_store (gimple *stmt, gimple_stmt_iterator *gsi, gimple **vec_stmt, 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); } |