aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@linaro.org>2018-01-02 18:27:35 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2018-01-02 18:27:35 +0000
commitb00cb3bfa50c5477347082a9450b4a63e4fee263 (patch)
tree963d6682878902655fb09b1a218b3b9537b7b594 /gcc
parentd3867483044ae00bac6daaeac6274e95254fb991 (diff)
downloadgcc-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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/tree-cfg.c7
-rw-r--r--gcc/tree-vect-stmts.c9
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);
}