This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [08/13] Add a vec_perm_indices_to_tree helper function
- From: Richard Biener <richard dot guenther at gmail dot com>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>, Richard Sandiford <richard dot sandiford at linaro dot org>
- Date: Mon, 18 Dec 2017 14:34:41 +0100
- Subject: Re: [08/13] Add a vec_perm_indices_to_tree helper function
- Authentication-results: sourceware.org; auth=none
- References: <87indfmrgt.fsf@linaro.org> <87h8szlc89.fsf@linaro.org>
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,