Commit 557be5a8 by Alan Lawrence Committed by Alan Lawrence

[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
parent 1c5fd343
2014-11-13 Alan Lawrence <alan.lawrence@arm.com>
* 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.
2014-11-13 Felix Yang <felix.yang@huawei.com> 2014-11-13 Felix Yang <felix.yang@huawei.com>
* ipa-utils.h: Fix typo in comments. * ipa-utils.h: Fix typo in comments.
...@@ -4619,8 +4619,7 @@ vect_permute_store_chain (vec<tree> dr_chain, ...@@ -4619,8 +4619,7 @@ vect_permute_store_chain (vec<tree> dr_chain,
if (3 * i + nelt2 < nelt) if (3 * i + nelt2 < nelt)
sel[3 * i + nelt2] = 0; sel[3 * i + nelt2] = 0;
} }
perm3_mask_low = vect_gen_perm_mask (vectype, sel); perm3_mask_low = vect_gen_perm_mask_checked (vectype, sel);
gcc_assert (perm3_mask_low != NULL);
for (i = 0; i < nelt; i++) for (i = 0; i < nelt; i++)
{ {
...@@ -4631,8 +4630,7 @@ vect_permute_store_chain (vec<tree> dr_chain, ...@@ -4631,8 +4630,7 @@ vect_permute_store_chain (vec<tree> dr_chain,
if (3 * i + nelt2 < nelt) if (3 * i + nelt2 < nelt)
sel[3 * i + nelt2] = nelt + j2++; sel[3 * i + nelt2] = nelt + j2++;
} }
perm3_mask_high = vect_gen_perm_mask (vectype, sel); perm3_mask_high = vect_gen_perm_mask_checked (vectype, sel);
gcc_assert (perm3_mask_high != NULL);
vect1 = dr_chain[0]; vect1 = dr_chain[0];
vect2 = dr_chain[1]; vect2 = dr_chain[1];
...@@ -4671,13 +4669,11 @@ vect_permute_store_chain (vec<tree> dr_chain, ...@@ -4671,13 +4669,11 @@ vect_permute_store_chain (vec<tree> dr_chain,
sel[i * 2] = i; sel[i * 2] = i;
sel[i * 2 + 1] = i + nelt; sel[i * 2 + 1] = i + nelt;
} }
perm_mask_high = vect_gen_perm_mask (vectype, sel); perm_mask_high = vect_gen_perm_mask_checked (vectype, sel);
gcc_assert (perm_mask_high != NULL);
for (i = 0; i < nelt; i++) for (i = 0; i < nelt; i++)
sel[i] += nelt / 2; sel[i] += nelt / 2;
perm_mask_low = vect_gen_perm_mask (vectype, sel); perm_mask_low = vect_gen_perm_mask_checked (vectype, sel);
gcc_assert (perm_mask_low != NULL);
for (i = 0, n = log_length; i < n; i++) for (i = 0, n = log_length; i < n; i++)
{ {
...@@ -5180,8 +5176,7 @@ vect_permute_load_chain (vec<tree> dr_chain, ...@@ -5180,8 +5176,7 @@ vect_permute_load_chain (vec<tree> dr_chain,
sel[i] = 3 * i + k; sel[i] = 3 * i + k;
else else
sel[i] = 0; sel[i] = 0;
perm3_mask_low = vect_gen_perm_mask (vectype, sel); perm3_mask_low = vect_gen_perm_mask_checked (vectype, sel);
gcc_assert (perm3_mask_low != NULL);
for (i = 0, j = 0; i < nelt; i++) for (i = 0, j = 0; i < nelt; i++)
if (3 * i + k < 2 * nelt) if (3 * i + k < 2 * nelt)
...@@ -5189,8 +5184,7 @@ vect_permute_load_chain (vec<tree> dr_chain, ...@@ -5189,8 +5184,7 @@ vect_permute_load_chain (vec<tree> dr_chain,
else else
sel[i] = nelt + ((nelt + k) % 3) + 3 * (j++); sel[i] = nelt + ((nelt + k) % 3) + 3 * (j++);
perm3_mask_high = vect_gen_perm_mask (vectype, sel); perm3_mask_high = vect_gen_perm_mask_checked (vectype, sel);
gcc_assert (perm3_mask_high != NULL);
first_vect = dr_chain[0]; first_vect = dr_chain[0];
second_vect = dr_chain[1]; second_vect = dr_chain[1];
...@@ -5224,13 +5218,11 @@ vect_permute_load_chain (vec<tree> dr_chain, ...@@ -5224,13 +5218,11 @@ vect_permute_load_chain (vec<tree> dr_chain,
for (i = 0; i < nelt; ++i) for (i = 0; i < nelt; ++i)
sel[i] = i * 2; sel[i] = i * 2;
perm_mask_even = vect_gen_perm_mask (vectype, sel); perm_mask_even = vect_gen_perm_mask_checked (vectype, sel);
gcc_assert (perm_mask_even != NULL);
for (i = 0; i < nelt; ++i) for (i = 0; i < nelt; ++i)
sel[i] = i * 2 + 1; sel[i] = i * 2 + 1;
perm_mask_odd = vect_gen_perm_mask (vectype, sel); perm_mask_odd = vect_gen_perm_mask_checked (vectype, sel);
gcc_assert (perm_mask_odd != NULL);
for (i = 0; i < log_length; i++) for (i = 0; i < log_length; i++)
{ {
...@@ -5386,8 +5378,7 @@ vect_shift_permute_load_chain (vec<tree> dr_chain, ...@@ -5386,8 +5378,7 @@ vect_shift_permute_load_chain (vec<tree> dr_chain,
supported by target\n"); supported by target\n");
return false; return false;
} }
perm2_mask1 = vect_gen_perm_mask (vectype, sel); perm2_mask1 = vect_gen_perm_mask_checked (vectype, sel);
gcc_assert (perm2_mask1 != NULL);
for (i = 0; i < nelt / 2; ++i) for (i = 0; i < nelt / 2; ++i)
sel[i] = i * 2 + 1; sel[i] = i * 2 + 1;
...@@ -5401,8 +5392,7 @@ vect_shift_permute_load_chain (vec<tree> dr_chain, ...@@ -5401,8 +5392,7 @@ vect_shift_permute_load_chain (vec<tree> dr_chain,
supported by target\n"); supported by target\n");
return false; return false;
} }
perm2_mask2 = vect_gen_perm_mask (vectype, sel); perm2_mask2 = vect_gen_perm_mask_checked (vectype, sel);
gcc_assert (perm2_mask2 != NULL);
/* Generating permutation constant to shift all elements. /* Generating permutation constant to shift all elements.
For vector length 8 it is {4 5 6 7 8 9 10 11}. */ For vector length 8 it is {4 5 6 7 8 9 10 11}. */
...@@ -5415,8 +5405,7 @@ vect_shift_permute_load_chain (vec<tree> dr_chain, ...@@ -5415,8 +5405,7 @@ vect_shift_permute_load_chain (vec<tree> dr_chain,
"shift permutation is not supported by target\n"); "shift permutation is not supported by target\n");
return false; return false;
} }
shift1_mask = vect_gen_perm_mask (vectype, sel); shift1_mask = vect_gen_perm_mask_checked (vectype, sel);
gcc_assert (shift1_mask != NULL);
/* Generating permutation constant to select vector from 2. /* Generating permutation constant to select vector from 2.
For vector length 8 it is {0 1 2 3 12 13 14 15}. */ For vector length 8 it is {0 1 2 3 12 13 14 15}. */
...@@ -5431,8 +5420,7 @@ vect_shift_permute_load_chain (vec<tree> dr_chain, ...@@ -5431,8 +5420,7 @@ vect_shift_permute_load_chain (vec<tree> dr_chain,
"select is not supported by target\n"); "select is not supported by target\n");
return false; return false;
} }
select_mask = vect_gen_perm_mask (vectype, sel); select_mask = vect_gen_perm_mask_checked (vectype, sel);
gcc_assert (select_mask != NULL);
for (i = 0; i < log_length; i++) for (i = 0; i < log_length; i++)
{ {
...@@ -5498,8 +5486,7 @@ vect_shift_permute_load_chain (vec<tree> dr_chain, ...@@ -5498,8 +5486,7 @@ vect_shift_permute_load_chain (vec<tree> dr_chain,
supported by target\n"); supported by target\n");
return false; return false;
} }
perm3_mask = vect_gen_perm_mask (vectype, sel); perm3_mask = vect_gen_perm_mask_checked (vectype, sel);
gcc_assert (perm3_mask != NULL);
/* Generating permutation constant to shift all elements. /* Generating permutation constant to shift all elements.
For vector length 8 it is {6 7 8 9 10 11 12 13}. */ For vector length 8 it is {6 7 8 9 10 11 12 13}. */
...@@ -5512,8 +5499,7 @@ vect_shift_permute_load_chain (vec<tree> dr_chain, ...@@ -5512,8 +5499,7 @@ vect_shift_permute_load_chain (vec<tree> dr_chain,
"shift permutation is not supported by target\n"); "shift permutation is not supported by target\n");
return false; return false;
} }
shift1_mask = vect_gen_perm_mask (vectype, sel); shift1_mask = vect_gen_perm_mask_checked (vectype, sel);
gcc_assert (shift1_mask != NULL);
/* Generating permutation constant to shift all elements. /* Generating permutation constant to shift all elements.
For vector length 8 it is {5 6 7 8 9 10 11 12}. */ For vector length 8 it is {5 6 7 8 9 10 11 12}. */
...@@ -5526,8 +5512,7 @@ vect_shift_permute_load_chain (vec<tree> dr_chain, ...@@ -5526,8 +5512,7 @@ vect_shift_permute_load_chain (vec<tree> dr_chain,
"shift permutation is not supported by target\n"); "shift permutation is not supported by target\n");
return false; return false;
} }
shift2_mask = vect_gen_perm_mask (vectype, sel); shift2_mask = vect_gen_perm_mask_checked (vectype, sel);
gcc_assert (shift2_mask != NULL);
/* Generating permutation constant to shift all elements. /* Generating permutation constant to shift all elements.
For vector length 8 it is {3 4 5 6 7 8 9 10}. */ For vector length 8 it is {3 4 5 6 7 8 9 10}. */
...@@ -5540,8 +5525,7 @@ vect_shift_permute_load_chain (vec<tree> dr_chain, ...@@ -5540,8 +5525,7 @@ vect_shift_permute_load_chain (vec<tree> dr_chain,
"shift permutation is not supported by target\n"); "shift permutation is not supported by target\n");
return false; return false;
} }
shift3_mask = vect_gen_perm_mask (vectype, sel); shift3_mask = vect_gen_perm_mask_checked (vectype, sel);
gcc_assert (shift3_mask != NULL);
/* Generating permutation constant to shift all elements. /* Generating permutation constant to shift all elements.
For vector length 8 it is {5 6 7 8 9 10 11 12}. */ For vector length 8 it is {5 6 7 8 9 10 11 12}. */
...@@ -5554,8 +5538,7 @@ vect_shift_permute_load_chain (vec<tree> dr_chain, ...@@ -5554,8 +5538,7 @@ vect_shift_permute_load_chain (vec<tree> dr_chain,
"shift permutation is not supported by target\n"); "shift permutation is not supported by target\n");
return false; return false;
} }
shift4_mask = vect_gen_perm_mask (vectype, sel); shift4_mask = vect_gen_perm_mask_checked (vectype, sel);
gcc_assert (shift4_mask != NULL);
for (k = 0; k < 3; k++) for (k = 0; k < 3; k++)
{ {
......
...@@ -1917,8 +1917,7 @@ vectorizable_mask_load_store (gimple stmt, gimple_stmt_iterator *gsi, ...@@ -1917,8 +1917,7 @@ vectorizable_mask_load_store (gimple stmt, gimple_stmt_iterator *gsi,
for (i = 0; i < gather_off_nunits; ++i) for (i = 0; i < gather_off_nunits; ++i)
sel[i] = i | nunits; sel[i] = i | nunits;
perm_mask = vect_gen_perm_mask (gather_off_vectype, sel); perm_mask = vect_gen_perm_mask_checked (gather_off_vectype, sel);
gcc_assert (perm_mask != NULL_TREE);
} }
else if (nunits == gather_off_nunits * 2) else if (nunits == gather_off_nunits * 2)
{ {
...@@ -1929,13 +1928,11 @@ vectorizable_mask_load_store (gimple stmt, gimple_stmt_iterator *gsi, ...@@ -1929,13 +1928,11 @@ vectorizable_mask_load_store (gimple stmt, gimple_stmt_iterator *gsi,
sel[i] = i < gather_off_nunits sel[i] = i < gather_off_nunits
? i : i + nunits - gather_off_nunits; ? i : i + nunits - gather_off_nunits;
perm_mask = vect_gen_perm_mask (vectype, sel); perm_mask = vect_gen_perm_mask_checked (vectype, sel);
gcc_assert (perm_mask != NULL_TREE);
ncopies *= 2; ncopies *= 2;
for (i = 0; i < nunits; ++i) for (i = 0; i < nunits; ++i)
sel[i] = i | gather_off_nunits; sel[i] = i | gather_off_nunits;
mask_perm_mask = vect_gen_perm_mask (masktype, sel); mask_perm_mask = vect_gen_perm_mask_checked (masktype, sel);
gcc_assert (mask_perm_mask != NULL_TREE);
} }
else else
gcc_unreachable (); gcc_unreachable ();
...@@ -4940,7 +4937,9 @@ perm_mask_for_reverse (tree vectype) ...@@ -4940,7 +4937,9 @@ perm_mask_for_reverse (tree vectype)
for (i = 0; i < nunits; ++i) for (i = 0; i < nunits; ++i)
sel[i] = nunits - 1 - 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. /* Function vectorizable_store.
...@@ -5471,21 +5470,19 @@ vectorizable_store (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt, ...@@ -5471,21 +5470,19 @@ vectorizable_store (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt,
return true; return true;
} }
/* Given a vector type VECTYPE and permutation SEL returns /* Given a vector type VECTYPE, turns permutation SEL into the equivalent
the VECTOR_CST mask that implements the permutation of the VECTOR_CST mask. No checks are made that the target platform supports the
vector elements. If that is impossible to do, returns NULL. */ mask, so callers may wish to test can_vec_perm_p separately, or use
vect_gen_perm_mask_checked. */
tree 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; tree mask_elt_type, mask_type, mask_vec, *mask_elts;
int i, nunits; int i, nunits;
nunits = TYPE_VECTOR_SUBPARTS (vectype); 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 mask_elt_type = lang_hooks.types.type_for_mode
(int_mode_for_mode (TYPE_MODE (TREE_TYPE (vectype))), 1); (int_mode_for_mode (TYPE_MODE (TREE_TYPE (vectype))), 1);
mask_type = get_vectype_for_scalar_type (mask_elt_type); mask_type = get_vectype_for_scalar_type (mask_elt_type);
...@@ -5498,6 +5495,15 @@ vect_gen_perm_mask (tree vectype, unsigned char *sel) ...@@ -5498,6 +5495,15 @@ vect_gen_perm_mask (tree vectype, unsigned char *sel)
return mask_vec; 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 /* 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 STMT, generate instructions to permute the vector elements of X and Y
using permutation mask MASK_VEC, insert them at *GSI and return the 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, ...@@ -5853,8 +5859,7 @@ vectorizable_load (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt,
for (i = 0; i < gather_off_nunits; ++i) for (i = 0; i < gather_off_nunits; ++i)
sel[i] = i | nunits; sel[i] = i | nunits;
perm_mask = vect_gen_perm_mask (gather_off_vectype, sel); perm_mask = vect_gen_perm_mask_checked (gather_off_vectype, sel);
gcc_assert (perm_mask != NULL_TREE);
} }
else if (nunits == gather_off_nunits * 2) else if (nunits == gather_off_nunits * 2)
{ {
...@@ -5865,8 +5870,7 @@ vectorizable_load (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt, ...@@ -5865,8 +5870,7 @@ vectorizable_load (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt,
sel[i] = i < gather_off_nunits sel[i] = i < gather_off_nunits
? i : i + nunits - gather_off_nunits; ? i : i + nunits - gather_off_nunits;
perm_mask = vect_gen_perm_mask (vectype, sel); perm_mask = vect_gen_perm_mask_checked (vectype, sel);
gcc_assert (perm_mask != NULL_TREE);
ncopies *= 2; ncopies *= 2;
} }
else else
......
...@@ -1040,7 +1040,8 @@ extern void vect_get_store_cost (struct data_reference *, int, ...@@ -1040,7 +1040,8 @@ extern void vect_get_store_cost (struct data_reference *, int,
extern bool vect_supportable_shift (enum tree_code, tree); extern bool vect_supportable_shift (enum tree_code, tree);
extern void vect_get_vec_defs (tree, tree, gimple, vec<tree> *, extern void vect_get_vec_defs (tree, tree, gimple, vec<tree> *,
vec<tree> *, slp_tree, int); vec<tree> *, slp_tree, int);
extern tree vect_gen_perm_mask (tree, unsigned char *); extern tree vect_gen_perm_mask_any (tree, const unsigned char *);
extern tree vect_gen_perm_mask_checked (tree, const unsigned char *);
/* In tree-vect-data-refs.c. */ /* In tree-vect-data-refs.c. */
extern bool vect_can_force_dr_alignment_p (const_tree, unsigned int); extern bool vect_can_force_dr_alignment_p (const_tree, unsigned int);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment