Message ID | 87h8szlc89.fsf@linaro.org |
---|---|
State | New |
Headers | show |
Series | Make VEC_PERM_EXPR work for variable-length vectors | expand |
On Sun, Dec 10, 2017 at 12:20 AM, Richard Sandiford <richard.sandiford@linaro.org> wrote: > This patch adds a function for creating a VECTOR_CST from a > vec_perm_indices, operating directly on the encoding. Ok. > > 2017-12-09 Richard Sandiford <richard.sandiford@linaro.org> > > gcc/ > * vec-perm-indices.h (vec_perm_indices_to_tree): Declare. > * vec-perm-indices.c (vec_perm_indices_to_tree): New function. > * tree-ssa-forwprop.c (simplify_vector_constructor): Use it. > * tree-vect-slp.c (vect_transform_slp_perm_load): Likewise. > * tree-vect-stmts.c (vectorizable_bswap): Likewise. > (vect_gen_perm_mask_any): Likewise. > > Index: gcc/vec-perm-indices.h > =================================================================== > --- gcc/vec-perm-indices.h 2017-12-09 22:48:47.548825399 +0000 > +++ gcc/vec-perm-indices.h 2017-12-09 22:48:50.361942571 +0000 > @@ -73,6 +73,7 @@ typedef int_vector_builder<HOST_WIDE_INT > }; > > bool tree_to_vec_perm_builder (vec_perm_builder *, tree); > +tree vec_perm_indices_to_tree (tree, const vec_perm_indices &); > rtx vec_perm_indices_to_rtx (machine_mode, const vec_perm_indices &); > > inline > Index: gcc/vec-perm-indices.c > =================================================================== > --- gcc/vec-perm-indices.c 2017-12-09 22:48:47.548825399 +0000 > +++ gcc/vec-perm-indices.c 2017-12-09 22:48:50.360942531 +0000 > @@ -152,6 +152,20 @@ tree_to_vec_perm_builder (vec_perm_build > return true; > } > > +/* Return a VECTOR_CST of type TYPE for the permutation vector in INDICES. */ > + > +tree > +vec_perm_indices_to_tree (tree type, const vec_perm_indices &indices) > +{ > + gcc_assert (TYPE_VECTOR_SUBPARTS (type) == indices.length ()); > + tree_vector_builder sel (type, indices.encoding ().npatterns (), > + indices.encoding ().nelts_per_pattern ()); > + unsigned int encoded_nelts = sel.encoded_nelts (); > + for (unsigned int i = 0; i < encoded_nelts; i++) > + sel.quick_push (build_int_cst (TREE_TYPE (type), indices[i])); > + return sel.build (); > +} > + > /* Return a CONST_VECTOR of mode MODE that contains the elements of > INDICES. */ > > Index: gcc/tree-ssa-forwprop.c > =================================================================== > --- gcc/tree-ssa-forwprop.c 2017-12-09 22:48:47.546825312 +0000 > +++ gcc/tree-ssa-forwprop.c 2017-12-09 22:48:50.359942492 +0000 > @@ -2119,10 +2119,7 @@ simplify_vector_constructor (gimple_stmt > || GET_MODE_SIZE (TYPE_MODE (mask_type)) > != GET_MODE_SIZE (TYPE_MODE (type))) > return false; > - tree_vector_builder mask_elts (mask_type, nelts, 1); > - for (i = 0; i < nelts; i++) > - mask_elts.quick_push (build_int_cst (TREE_TYPE (mask_type), sel[i])); > - op2 = mask_elts.build (); > + op2 = vec_perm_indices_to_tree (mask_type, indices); > if (conv_code == ERROR_MARK) > gimple_assign_set_rhs_with_ops (gsi, VEC_PERM_EXPR, orig, orig, op2); > else > Index: gcc/tree-vect-slp.c > =================================================================== > --- gcc/tree-vect-slp.c 2017-12-09 22:48:47.547825355 +0000 > +++ gcc/tree-vect-slp.c 2017-12-09 22:48:50.359942492 +0000 > @@ -3675,13 +3675,7 @@ vect_transform_slp_perm_load (slp_tree n > tree mask_vec = NULL_TREE; > > if (! noop_p) > - { > - tree_vector_builder mask_elts (mask_type, nunits, 1); > - for (int l = 0; l < nunits; ++l) > - mask_elts.quick_push (build_int_cst (mask_element_type, > - mask[l])); > - mask_vec = mask_elts.build (); > - } > + mask_vec = vec_perm_indices_to_tree (mask_type, indices); > > if (second_vec_index == -1) > second_vec_index = first_vec_index; > Index: gcc/tree-vect-stmts.c > =================================================================== > --- gcc/tree-vect-stmts.c 2017-12-09 22:48:47.548825399 +0000 > +++ gcc/tree-vect-stmts.c 2017-12-09 22:48:50.360942531 +0000 > @@ -2529,10 +2529,7 @@ vectorizable_bswap (gimple *stmt, gimple > return true; > } > > - tree_vector_builder telts (char_vectype, num_bytes, 1); > - for (unsigned i = 0; i < num_bytes; ++i) > - telts.quick_push (build_int_cst (char_type_node, elts[i])); > - tree bswap_vconst = telts.build (); > + tree bswap_vconst = vec_perm_indices_to_tree (char_vectype, indices); > > /* Transform. */ > vec<tree> vec_oprnds = vNULL; > @@ -6521,17 +6518,10 @@ vect_gen_perm_mask_any (tree vectype, co > { > tree mask_elt_type, mask_type; > > - unsigned int nunits = sel.length (); > - gcc_checking_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); > - > - tree_vector_builder mask_elts (mask_type, nunits, 1); > - for (unsigned int i = 0; i < nunits; ++i) > - mask_elts.quick_push (build_int_cst (mask_elt_type, sel[i])); > - return mask_elts.build (); > + return vec_perm_indices_to_tree (mask_type, sel); > } > > /* Checked version of vect_gen_perm_mask_any. Asserts can_vec_perm_const_p,
Index: gcc/vec-perm-indices.h =================================================================== --- gcc/vec-perm-indices.h 2017-12-09 22:48:47.548825399 +0000 +++ gcc/vec-perm-indices.h 2017-12-09 22:48:50.361942571 +0000 @@ -73,6 +73,7 @@ typedef int_vector_builder<HOST_WIDE_INT }; bool tree_to_vec_perm_builder (vec_perm_builder *, tree); +tree vec_perm_indices_to_tree (tree, const vec_perm_indices &); rtx vec_perm_indices_to_rtx (machine_mode, const vec_perm_indices &); inline Index: gcc/vec-perm-indices.c =================================================================== --- gcc/vec-perm-indices.c 2017-12-09 22:48:47.548825399 +0000 +++ gcc/vec-perm-indices.c 2017-12-09 22:48:50.360942531 +0000 @@ -152,6 +152,20 @@ tree_to_vec_perm_builder (vec_perm_build return true; } +/* Return a VECTOR_CST of type TYPE for the permutation vector in INDICES. */ + +tree +vec_perm_indices_to_tree (tree type, const vec_perm_indices &indices) +{ + gcc_assert (TYPE_VECTOR_SUBPARTS (type) == indices.length ()); + tree_vector_builder sel (type, indices.encoding ().npatterns (), + indices.encoding ().nelts_per_pattern ()); + unsigned int encoded_nelts = sel.encoded_nelts (); + for (unsigned int i = 0; i < encoded_nelts; i++) + sel.quick_push (build_int_cst (TREE_TYPE (type), indices[i])); + return sel.build (); +} + /* Return a CONST_VECTOR of mode MODE that contains the elements of INDICES. */ Index: gcc/tree-ssa-forwprop.c =================================================================== --- gcc/tree-ssa-forwprop.c 2017-12-09 22:48:47.546825312 +0000 +++ gcc/tree-ssa-forwprop.c 2017-12-09 22:48:50.359942492 +0000 @@ -2119,10 +2119,7 @@ simplify_vector_constructor (gimple_stmt || GET_MODE_SIZE (TYPE_MODE (mask_type)) != GET_MODE_SIZE (TYPE_MODE (type))) return false; - tree_vector_builder mask_elts (mask_type, nelts, 1); - for (i = 0; i < nelts; i++) - mask_elts.quick_push (build_int_cst (TREE_TYPE (mask_type), sel[i])); - op2 = mask_elts.build (); + op2 = vec_perm_indices_to_tree (mask_type, indices); if (conv_code == ERROR_MARK) gimple_assign_set_rhs_with_ops (gsi, VEC_PERM_EXPR, orig, orig, op2); else Index: gcc/tree-vect-slp.c =================================================================== --- gcc/tree-vect-slp.c 2017-12-09 22:48:47.547825355 +0000 +++ gcc/tree-vect-slp.c 2017-12-09 22:48:50.359942492 +0000 @@ -3675,13 +3675,7 @@ vect_transform_slp_perm_load (slp_tree n tree mask_vec = NULL_TREE; if (! noop_p) - { - tree_vector_builder mask_elts (mask_type, nunits, 1); - for (int l = 0; l < nunits; ++l) - mask_elts.quick_push (build_int_cst (mask_element_type, - mask[l])); - mask_vec = mask_elts.build (); - } + mask_vec = vec_perm_indices_to_tree (mask_type, indices); if (second_vec_index == -1) second_vec_index = first_vec_index; Index: gcc/tree-vect-stmts.c =================================================================== --- gcc/tree-vect-stmts.c 2017-12-09 22:48:47.548825399 +0000 +++ gcc/tree-vect-stmts.c 2017-12-09 22:48:50.360942531 +0000 @@ -2529,10 +2529,7 @@ vectorizable_bswap (gimple *stmt, gimple return true; } - tree_vector_builder telts (char_vectype, num_bytes, 1); - for (unsigned i = 0; i < num_bytes; ++i) - telts.quick_push (build_int_cst (char_type_node, elts[i])); - tree bswap_vconst = telts.build (); + tree bswap_vconst = vec_perm_indices_to_tree (char_vectype, indices); /* Transform. */ vec<tree> vec_oprnds = vNULL; @@ -6521,17 +6518,10 @@ vect_gen_perm_mask_any (tree vectype, co { tree mask_elt_type, mask_type; - unsigned int nunits = sel.length (); - gcc_checking_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); - - tree_vector_builder mask_elts (mask_type, nunits, 1); - for (unsigned int i = 0; i < nunits; ++i) - mask_elts.quick_push (build_int_cst (mask_elt_type, sel[i])); - return mask_elts.build (); + return vec_perm_indices_to_tree (mask_type, sel); } /* Checked version of vect_gen_perm_mask_any. Asserts can_vec_perm_const_p,