Use ssizetype selectors for autovectorised VEC_PERM_EXPRs
authorRichard Sandiford <richard.sandiford@linaro.org>
Tue, 2 Jan 2018 18:27:35 +0000 (18:27 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Tue, 2 Jan 2018 18:27:35 +0000 (18:27 +0000)
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

gcc/ChangeLog
gcc/tree-cfg.c
gcc/tree-vect-stmts.c

index 1dfb6839d10bbc050faf9dd26c4f93b2959a071a..00effd0d15e600f4873cbced79c7bc466fcc5682 100644 (file)
@@ -1,3 +1,11 @@
+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
index bed49473d53bd7471058e78b72f03d64922d8e62..96b638f67543918c5b05a4c51dd6ef873ea3b80c 100644 (file)
@@ -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);
index 0f77567c9d918cd13b22d4616831a7e8a6809cac..8d1dc0425ccd639982448e82213b09ded23a8147 100644 (file)
@@ -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);
 }