[3/5] Make vect_get_mask_type_for_stmt take a group size
diff mbox series

Message ID mpteexryopl.fsf@arm.com
State New
Headers show
Series
  • Don't defer vector type choice for bools (PR 92596)
Related show

Commit Message

Richard Sandiford Nov. 29, 2019, 10:13 a.m. UTC
This patch makes vect_get_mask_type_for_stmt and
get_mask_type_for_scalar_type take a group size instead of
the SLP node, so that later patches can call it before an
SLP node has been built.


2019-11-29  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
	* tree-vectorizer.h (get_mask_type_for_scalar_type): Replace
	the slp_tree parameter with a group size parameter.
	(vect_get_mask_type_for_stmt): Likewise.
	* tree-vect-stmts.c (get_mask_type_for_scalar_type): Likewise.
	(vect_get_mask_type_for_stmt): Likewise.
	* tree-vect-slp.c (vect_slp_analyze_node_operations_1): Update
	call accordingly.

Comments

Richard Biener Nov. 29, 2019, 10:26 a.m. UTC | #1
On Fri, Nov 29, 2019 at 11:14 AM Richard Sandiford
<richard.sandiford@arm.com> wrote:
>
> This patch makes vect_get_mask_type_for_stmt and
> get_mask_type_for_scalar_type take a group size instead of
> the SLP node, so that later patches can call it before an
> SLP node has been built.

OK.

>
> 2019-11-29  Richard Sandiford  <richard.sandiford@arm.com>
>
> gcc/
>         * tree-vectorizer.h (get_mask_type_for_scalar_type): Replace
>         the slp_tree parameter with a group size parameter.
>         (vect_get_mask_type_for_stmt): Likewise.
>         * tree-vect-stmts.c (get_mask_type_for_scalar_type): Likewise.
>         (vect_get_mask_type_for_stmt): Likewise.
>         * tree-vect-slp.c (vect_slp_analyze_node_operations_1): Update
>         call accordingly.
>
> Index: gcc/tree-vectorizer.h
> ===================================================================
> --- gcc/tree-vectorizer.h       2019-11-16 10:40:08.422638677 +0000
> +++ gcc/tree-vectorizer.h       2019-11-29 09:11:27.781086362 +0000
> @@ -1640,7 +1640,7 @@ extern tree get_related_vectype_for_scal
>                                                  poly_uint64 = 0);
>  extern tree get_vectype_for_scalar_type (vec_info *, tree, unsigned int = 0);
>  extern tree get_vectype_for_scalar_type (vec_info *, tree, slp_tree);
> -extern tree get_mask_type_for_scalar_type (vec_info *, tree, slp_tree = 0);
> +extern tree get_mask_type_for_scalar_type (vec_info *, tree, unsigned int = 0);
>  extern tree get_same_sized_vectype (tree, tree);
>  extern bool vect_chooses_same_modes_p (vec_info *, machine_mode);
>  extern bool vect_get_loop_mask_type (loop_vec_info);
> @@ -1693,7 +1693,7 @@ extern gcall *vect_gen_while (tree, tree
>  extern tree vect_gen_while_not (gimple_seq *, tree, tree, tree);
>  extern opt_result vect_get_vector_types_for_stmt (stmt_vec_info, tree *,
>                                                   tree *, unsigned int = 0);
> -extern opt_tree vect_get_mask_type_for_stmt (stmt_vec_info, slp_tree = 0);
> +extern opt_tree vect_get_mask_type_for_stmt (stmt_vec_info, unsigned int = 0);
>
>  /* In tree-vect-data-refs.c.  */
>  extern bool vect_can_force_dr_alignment_p (const_tree, poly_uint64);
> Index: gcc/tree-vect-stmts.c
> ===================================================================
> --- gcc/tree-vect-stmts.c       2019-11-29 09:11:24.553108756 +0000
> +++ gcc/tree-vect-stmts.c       2019-11-29 09:11:27.781086362 +0000
> @@ -11362,14 +11362,15 @@ get_vectype_for_scalar_type (vec_info *v
>
>     Returns the mask type corresponding to a result of comparison
>     of vectors of specified SCALAR_TYPE as supported by target.
> -   NODE, if nonnull, is the SLP tree node that will use the returned
> -   vector type.  */
> +   If GROUP_SIZE is nonzero and we're performing BB vectorization,
> +   make sure that the number of elements in the vector is no bigger
> +   than GROUP_SIZE.  */
>
>  tree
>  get_mask_type_for_scalar_type (vec_info *vinfo, tree scalar_type,
> -                              slp_tree node)
> +                              unsigned int group_size)
>  {
> -  tree vectype = get_vectype_for_scalar_type (vinfo, scalar_type, node);
> +  tree vectype = get_vectype_for_scalar_type (vinfo, scalar_type, group_size);
>
>    if (!vectype)
>      return NULL;
> @@ -12229,11 +12230,12 @@ vect_get_vector_types_for_stmt (stmt_vec
>
>  /* Try to determine the correct vector type for STMT_INFO, which is a
>     statement that produces a scalar boolean result.  Return the vector
> -   type on success, otherwise return NULL_TREE.  NODE, if nonnull,
> -   is the SLP tree node that will use the returned vector type.  */
> +   type on success, otherwise return NULL_TREE.  If GROUP_SIZE is nonzero
> +   and we're performing BB vectorization, make sure that the number of
> +   elements in the vector is no bigger than GROUP_SIZE.  */
>
>  opt_tree
> -vect_get_mask_type_for_stmt (stmt_vec_info stmt_info, slp_tree node)
> +vect_get_mask_type_for_stmt (stmt_vec_info stmt_info, unsigned int group_size)
>  {
>    vec_info *vinfo = stmt_info->vinfo;
>    gimple *stmt = stmt_info->stmt;
> @@ -12245,7 +12247,8 @@ vect_get_mask_type_for_stmt (stmt_vec_in
>        && !VECT_SCALAR_BOOLEAN_TYPE_P (TREE_TYPE (gimple_assign_rhs1 (stmt))))
>      {
>        scalar_type = TREE_TYPE (gimple_assign_rhs1 (stmt));
> -      mask_type = get_mask_type_for_scalar_type (vinfo, scalar_type, node);
> +      mask_type = get_mask_type_for_scalar_type (vinfo, scalar_type,
> +                                                group_size);
>
>        if (!mask_type)
>         return opt_tree::failure_at (stmt,
> Index: gcc/tree-vect-slp.c
> ===================================================================
> --- gcc/tree-vect-slp.c 2019-11-26 22:04:58.099362339 +0000
> +++ gcc/tree-vect-slp.c 2019-11-29 09:11:27.777086392 +0000
> @@ -2757,7 +2757,8 @@ vect_slp_analyze_node_operations_1 (vec_
>    bb_vec_info bb_vinfo = STMT_VINFO_BB_VINFO (stmt_info);
>    if (bb_vinfo && STMT_VINFO_VECTYPE (stmt_info) == boolean_type_node)
>      {
> -      tree vectype = vect_get_mask_type_for_stmt (stmt_info, node);
> +      unsigned int group_size = SLP_TREE_SCALAR_STMTS (node).length ();
> +      tree vectype = vect_get_mask_type_for_stmt (stmt_info, group_size);
>        if (!vectype)
>         /* vect_get_mask_type_for_stmt has already explained the
>            failure.  */

Patch
diff mbox series

Index: gcc/tree-vectorizer.h
===================================================================
--- gcc/tree-vectorizer.h	2019-11-16 10:40:08.422638677 +0000
+++ gcc/tree-vectorizer.h	2019-11-29 09:11:27.781086362 +0000
@@ -1640,7 +1640,7 @@  extern tree get_related_vectype_for_scal
 						 poly_uint64 = 0);
 extern tree get_vectype_for_scalar_type (vec_info *, tree, unsigned int = 0);
 extern tree get_vectype_for_scalar_type (vec_info *, tree, slp_tree);
-extern tree get_mask_type_for_scalar_type (vec_info *, tree, slp_tree = 0);
+extern tree get_mask_type_for_scalar_type (vec_info *, tree, unsigned int = 0);
 extern tree get_same_sized_vectype (tree, tree);
 extern bool vect_chooses_same_modes_p (vec_info *, machine_mode);
 extern bool vect_get_loop_mask_type (loop_vec_info);
@@ -1693,7 +1693,7 @@  extern gcall *vect_gen_while (tree, tree
 extern tree vect_gen_while_not (gimple_seq *, tree, tree, tree);
 extern opt_result vect_get_vector_types_for_stmt (stmt_vec_info, tree *,
 						  tree *, unsigned int = 0);
-extern opt_tree vect_get_mask_type_for_stmt (stmt_vec_info, slp_tree = 0);
+extern opt_tree vect_get_mask_type_for_stmt (stmt_vec_info, unsigned int = 0);
 
 /* In tree-vect-data-refs.c.  */
 extern bool vect_can_force_dr_alignment_p (const_tree, poly_uint64);
Index: gcc/tree-vect-stmts.c
===================================================================
--- gcc/tree-vect-stmts.c	2019-11-29 09:11:24.553108756 +0000
+++ gcc/tree-vect-stmts.c	2019-11-29 09:11:27.781086362 +0000
@@ -11362,14 +11362,15 @@  get_vectype_for_scalar_type (vec_info *v
 
    Returns the mask type corresponding to a result of comparison
    of vectors of specified SCALAR_TYPE as supported by target.
-   NODE, if nonnull, is the SLP tree node that will use the returned
-   vector type.  */
+   If GROUP_SIZE is nonzero and we're performing BB vectorization,
+   make sure that the number of elements in the vector is no bigger
+   than GROUP_SIZE.  */
 
 tree
 get_mask_type_for_scalar_type (vec_info *vinfo, tree scalar_type,
-			       slp_tree node)
+			       unsigned int group_size)
 {
-  tree vectype = get_vectype_for_scalar_type (vinfo, scalar_type, node);
+  tree vectype = get_vectype_for_scalar_type (vinfo, scalar_type, group_size);
 
   if (!vectype)
     return NULL;
@@ -12229,11 +12230,12 @@  vect_get_vector_types_for_stmt (stmt_vec
 
 /* Try to determine the correct vector type for STMT_INFO, which is a
    statement that produces a scalar boolean result.  Return the vector
-   type on success, otherwise return NULL_TREE.  NODE, if nonnull,
-   is the SLP tree node that will use the returned vector type.  */
+   type on success, otherwise return NULL_TREE.  If GROUP_SIZE is nonzero
+   and we're performing BB vectorization, make sure that the number of
+   elements in the vector is no bigger than GROUP_SIZE.  */
 
 opt_tree
-vect_get_mask_type_for_stmt (stmt_vec_info stmt_info, slp_tree node)
+vect_get_mask_type_for_stmt (stmt_vec_info stmt_info, unsigned int group_size)
 {
   vec_info *vinfo = stmt_info->vinfo;
   gimple *stmt = stmt_info->stmt;
@@ -12245,7 +12247,8 @@  vect_get_mask_type_for_stmt (stmt_vec_in
       && !VECT_SCALAR_BOOLEAN_TYPE_P (TREE_TYPE (gimple_assign_rhs1 (stmt))))
     {
       scalar_type = TREE_TYPE (gimple_assign_rhs1 (stmt));
-      mask_type = get_mask_type_for_scalar_type (vinfo, scalar_type, node);
+      mask_type = get_mask_type_for_scalar_type (vinfo, scalar_type,
+						 group_size);
 
       if (!mask_type)
 	return opt_tree::failure_at (stmt,
Index: gcc/tree-vect-slp.c
===================================================================
--- gcc/tree-vect-slp.c	2019-11-26 22:04:58.099362339 +0000
+++ gcc/tree-vect-slp.c	2019-11-29 09:11:27.777086392 +0000
@@ -2757,7 +2757,8 @@  vect_slp_analyze_node_operations_1 (vec_
   bb_vec_info bb_vinfo = STMT_VINFO_BB_VINFO (stmt_info);
   if (bb_vinfo && STMT_VINFO_VECTYPE (stmt_info) == boolean_type_node)
     {
-      tree vectype = vect_get_mask_type_for_stmt (stmt_info, node);
+      unsigned int group_size = SLP_TREE_SCALAR_STMTS (node).length ();
+      tree vectype = vect_get_mask_type_for_stmt (stmt_info, group_size);
       if (!vectype)
 	/* vect_get_mask_type_for_stmt has already explained the
 	   failure.  */