aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vect-stmts.c
diff options
context:
space:
mode:
authorAlan Lawrence <alan.lawrence@arm.com>2014-11-13 16:20:13 +0000
committerAlan Lawrence <alalaw01@gcc.gnu.org>2014-11-13 16:20:13 +0000
commit557be5a8767902f204e8afa04551a387eac33a26 (patch)
treeeec657cc746f77494e987ad6b044c2a73effafa8 /gcc/tree-vect-stmts.c
parent1c5fd343ded2f26d6bf1e6459d6d7b80cb8564e6 (diff)
downloadgcc-557be5a8767902f204e8afa04551a387eac33a26.zip
gcc-557be5a8767902f204e8afa04551a387eac33a26.tar.gz
gcc-557be5a8767902f204e8afa04551a387eac33a26.tar.bz2
[Vectorizer] Split vect_gen_perm_mask into _checked and _any variants
* tree-vectorizer.h (vect_gen_perm_mask): Remove. (vect_gen_perm_mask_checked, vect_gen_perm_mask_any): New. tree_vec_data_refs.c (vect_permute_load_chain, vec_permute_store_chain, vec_shift_permute_load_chain): Replace vect_gen_perm_mask & assert with vect_gen_perm_mask_checked. * tree-vect-stmts.c (vectorizable_mask_load_store, vectorizable_load): Likewise. (vect_gen_perm_mask_checked): New. (vect_gen_perm_mask): Remove can_vec_perm_p check, rename to... (vect_gen_perm_mask_any): ...this. (perm_mask_for_reverse): Call can_vec_perm_p and vect_gen_perm_mask_checked. From-SVN: r217508
Diffstat (limited to 'gcc/tree-vect-stmts.c')
-rw-r--r--gcc/tree-vect-stmts.c40
1 files changed, 22 insertions, 18 deletions
diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c
index 2a5f23c..3d40f0f 100644
--- a/gcc/tree-vect-stmts.c
+++ b/gcc/tree-vect-stmts.c
@@ -1917,8 +1917,7 @@ vectorizable_mask_load_store (gimple stmt, gimple_stmt_iterator *gsi,
for (i = 0; i < gather_off_nunits; ++i)
sel[i] = i | nunits;
- perm_mask = vect_gen_perm_mask (gather_off_vectype, sel);
- gcc_assert (perm_mask != NULL_TREE);
+ perm_mask = vect_gen_perm_mask_checked (gather_off_vectype, sel);
}
else if (nunits == gather_off_nunits * 2)
{
@@ -1929,13 +1928,11 @@ vectorizable_mask_load_store (gimple stmt, gimple_stmt_iterator *gsi,
sel[i] = i < gather_off_nunits
? i : i + nunits - gather_off_nunits;
- perm_mask = vect_gen_perm_mask (vectype, sel);
- gcc_assert (perm_mask != NULL_TREE);
+ perm_mask = vect_gen_perm_mask_checked (vectype, sel);
ncopies *= 2;
for (i = 0; i < nunits; ++i)
sel[i] = i | gather_off_nunits;
- mask_perm_mask = vect_gen_perm_mask (masktype, sel);
- gcc_assert (mask_perm_mask != NULL_TREE);
+ mask_perm_mask = vect_gen_perm_mask_checked (masktype, sel);
}
else
gcc_unreachable ();
@@ -4940,7 +4937,9 @@ perm_mask_for_reverse (tree vectype)
for (i = 0; i < nunits; ++i)
sel[i] = nunits - 1 - i;
- return vect_gen_perm_mask (vectype, sel);
+ if (!can_vec_perm_p (TYPE_MODE (vectype), false, sel))
+ return NULL_TREE;
+ return vect_gen_perm_mask_checked (vectype, sel);
}
/* Function vectorizable_store.
@@ -5471,21 +5470,19 @@ vectorizable_store (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt,
return true;
}
-/* Given a vector type VECTYPE and permutation SEL returns
- the VECTOR_CST mask that implements the permutation of the
- vector elements. If that is impossible to do, returns NULL. */
+/* Given a vector type VECTYPE, turns permutation SEL into the equivalent
+ VECTOR_CST mask. No checks are made that the target platform supports the
+ mask, so callers may wish to test can_vec_perm_p separately, or use
+ vect_gen_perm_mask_checked. */
tree
-vect_gen_perm_mask (tree vectype, unsigned char *sel)
+vect_gen_perm_mask_any (tree vectype, const unsigned char *sel)
{
tree mask_elt_type, mask_type, mask_vec, *mask_elts;
int i, nunits;
nunits = TYPE_VECTOR_SUBPARTS (vectype);
- if (!can_vec_perm_p (TYPE_MODE (vectype), false, sel))
- return NULL;
-
mask_elt_type = lang_hooks.types.type_for_mode
(int_mode_for_mode (TYPE_MODE (TREE_TYPE (vectype))), 1);
mask_type = get_vectype_for_scalar_type (mask_elt_type);
@@ -5498,6 +5495,15 @@ vect_gen_perm_mask (tree vectype, unsigned char *sel)
return mask_vec;
}
+/* Checked version of vect_gen_perm_mask_any. Asserts can_vec_perm_p. */
+
+tree
+vect_gen_perm_mask_checked (tree vectype, const unsigned char *sel)
+{
+ gcc_assert (can_vec_perm_p (TYPE_MODE (vectype), false, sel));
+ return vect_gen_perm_mask_any (vectype, sel);
+}
+
/* Given a vector variable X and Y, that was generated for the scalar
STMT, generate instructions to permute the vector elements of X and Y
using permutation mask MASK_VEC, insert them at *GSI and return the
@@ -5853,8 +5859,7 @@ vectorizable_load (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt,
for (i = 0; i < gather_off_nunits; ++i)
sel[i] = i | nunits;
- perm_mask = vect_gen_perm_mask (gather_off_vectype, sel);
- gcc_assert (perm_mask != NULL_TREE);
+ perm_mask = vect_gen_perm_mask_checked (gather_off_vectype, sel);
}
else if (nunits == gather_off_nunits * 2)
{
@@ -5865,8 +5870,7 @@ vectorizable_load (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt,
sel[i] = i < gather_off_nunits
? i : i + nunits - gather_off_nunits;
- perm_mask = vect_gen_perm_mask (vectype, sel);
- gcc_assert (perm_mask != NULL_TREE);
+ perm_mask = vect_gen_perm_mask_checked (vectype, sel);
ncopies *= 2;
}
else