[08/13] Add a vec_perm_indices_to_tree helper function

Message ID 87h8szlc89.fsf@linaro.org
State New
Headers show
Series
  • Make VEC_PERM_EXPR work for variable-length vectors
Related show

Commit Message

Richard Sandiford Dec. 9, 2017, 11:20 p.m.
This patch adds a function for creating a VECTOR_CST from a
vec_perm_indices, operating directly on the encoding.


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.

Comments

Richard Biener Dec. 18, 2017, 1:34 p.m. | #1
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,

Patch

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,