diff options
author | Alan Lawrence <alan.lawrence@arm.com> | 2014-11-13 16:20:13 +0000 |
---|---|---|
committer | Alan Lawrence <alalaw01@gcc.gnu.org> | 2014-11-13 16:20:13 +0000 |
commit | 557be5a8767902f204e8afa04551a387eac33a26 (patch) | |
tree | eec657cc746f77494e987ad6b044c2a73effafa8 /gcc/tree-vect-stmts.c | |
parent | 1c5fd343ded2f26d6bf1e6459d6d7b80cb8564e6 (diff) | |
download | gcc-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.c | 40 |
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 |