aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vect-loop.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/tree-vect-loop.c')
-rw-r--r--gcc/tree-vect-loop.c24
1 files changed, 13 insertions, 11 deletions
diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c
index 3b4a71e..8135219 100644
--- a/gcc/tree-vect-loop.c
+++ b/gcc/tree-vect-loop.c
@@ -3698,15 +3698,15 @@ vect_estimate_min_profitable_iters (loop_vec_info loop_vinfo,
}
/* Writes into SEL a mask for a vec_perm, equivalent to a vec_shr by OFFSET
- vector elements (not bits) for a vector of mode MODE. */
+ vector elements (not bits) for a vector with NELT elements. */
static void
-calc_vec_perm_mask_for_shift (machine_mode mode, unsigned int offset,
- unsigned char *sel)
+calc_vec_perm_mask_for_shift (unsigned int offset, unsigned int nelt,
+ vec_perm_indices *sel)
{
- unsigned int i, nelt = GET_MODE_NUNITS (mode);
+ unsigned int i;
for (i = 0; i < nelt; i++)
- sel[i] = (i + offset) & (2*nelt - 1);
+ sel->quick_push ((i + offset) & (2 * nelt - 1));
}
/* Checks whether the target supports whole-vector shifts for vectors of mode
@@ -3722,12 +3722,13 @@ have_whole_vector_shift (machine_mode mode)
return false;
unsigned int i, nelt = GET_MODE_NUNITS (mode);
- unsigned char *sel = XALLOCAVEC (unsigned char, nelt);
+ auto_vec_perm_indices sel (nelt);
for (i = nelt/2; i >= 1; i/=2)
{
- calc_vec_perm_mask_for_shift (mode, i, sel);
- if (!can_vec_perm_p (mode, false, sel))
+ sel.truncate (0);
+ calc_vec_perm_mask_for_shift (i, nelt, &sel);
+ if (!can_vec_perm_p (mode, false, &sel))
return false;
}
return true;
@@ -5059,7 +5060,7 @@ vect_create_epilog_for_reduction (vec<tree> vect_defs, gimple *stmt,
if (reduce_with_shift && !slp_reduc)
{
int nelements = vec_size_in_bits / element_bitsize;
- unsigned char *sel = XALLOCAVEC (unsigned char, nelements);
+ auto_vec_perm_indices sel (nelements);
int elt_offset;
@@ -5083,8 +5084,9 @@ vect_create_epilog_for_reduction (vec<tree> vect_defs, gimple *stmt,
elt_offset >= 1;
elt_offset /= 2)
{
- calc_vec_perm_mask_for_shift (mode, elt_offset, sel);
- tree mask = vect_gen_perm_mask_any (vectype, sel);
+ sel.truncate (0);
+ calc_vec_perm_mask_for_shift (elt_offset, nelements, &sel);
+ tree mask = vect_gen_perm_mask_any (vectype, sel);
epilog_stmt = gimple_build_assign (vec_dest, VEC_PERM_EXPR,
new_temp, zero_vec, mask);
new_name = make_ssa_name (vec_dest, epilog_stmt);