diff mbox series

Add a vect_worthwhile_without_simd_p helper routine

Message ID 87shfpwmm3.fsf@linaro.org
State Accepted
Commit ca09abcb399bcb8cddbda68c75e702cc8989a6ca
Headers show
Series Add a vect_worthwhile_without_simd_p helper routine | expand

Commit Message

Richard Sandiford Sept. 14, 2017, 11:22 a.m. UTC
The vectoriser sometimes considers lowering "vector" operations into N
scalar word operations.  This N needs to be fixed at compile time, so
the condition guarding it needs to change when variable-lengh vectors
are added.  This patch puts the condition into a helper routine so that
there's only one place to update.

Tested on aarch64-linux-gnu, x86_64-linux-gnu and powerpc64le-linux-gnu.
OK to install?

Richard


2017-09-14  Richard Sandiford  <richard.sandiford@linaro.org>
	    Alan Hayward  <alan.hayward@arm.com>
	    David Sherwood  <david.sherwood@arm.com>

gcc/
	* tree-vectorizer.h (vect_min_worthwhile_factor): Delete.
	(vect_worthwhile_without_simd_p): Declare.
	* tree-vect-loop.c (vect_worthwhile_without_simd_p): New function.
	(vectorizable_reduction): Use it.
	* tree-vect-stmts.c (vectorizable_shift): Likewise.
	(vectorizable_operation): Likewise.

Comments

Richard Biener Sept. 14, 2017, 1:38 p.m. UTC | #1
On Thu, Sep 14, 2017 at 1:22 PM, Richard Sandiford
<richard.sandiford@linaro.org> wrote:
> The vectoriser sometimes considers lowering "vector" operations into N

> scalar word operations.  This N needs to be fixed at compile time, so

> the condition guarding it needs to change when variable-lengh vectors

> are added.  This patch puts the condition into a helper routine so that

> there's only one place to update.

>

> Tested on aarch64-linux-gnu, x86_64-linux-gnu and powerpc64le-linux-gnu.

> OK to install?


Ok.

Richard.

> Richard

>

>

> 2017-09-14  Richard Sandiford  <richard.sandiford@linaro.org>

>             Alan Hayward  <alan.hayward@arm.com>

>             David Sherwood  <david.sherwood@arm.com>

>

> gcc/

>         * tree-vectorizer.h (vect_min_worthwhile_factor): Delete.

>         (vect_worthwhile_without_simd_p): Declare.

>         * tree-vect-loop.c (vect_worthwhile_without_simd_p): New function.

>         (vectorizable_reduction): Use it.

>         * tree-vect-stmts.c (vectorizable_shift): Likewise.

>         (vectorizable_operation): Likewise.

>

> Index: gcc/tree-vectorizer.h

> ===================================================================

> --- gcc/tree-vectorizer.h       2017-09-14 11:27:50.352072753 +0100

> +++ gcc/tree-vectorizer.h       2017-09-14 11:28:27.080519923 +0100

> @@ -1230,7 +1230,7 @@ extern bool vectorizable_reduction (gimp

>  extern bool vectorizable_induction (gimple *, gimple_stmt_iterator *,

>                                     gimple **, slp_tree);

>  extern tree get_initial_def_for_reduction (gimple *, tree, tree *);

> -extern int vect_min_worthwhile_factor (enum tree_code);

> +extern bool vect_worthwhile_without_simd_p (vec_info *, tree_code);

>  extern int vect_get_known_peeling_cost (loop_vec_info, int, int *,

>                                         stmt_vector_for_cost *,

>                                         stmt_vector_for_cost *,

> Index: gcc/tree-vect-loop.c

> ===================================================================

> --- gcc/tree-vect-loop.c        2017-09-14 11:27:50.351164919 +0100

> +++ gcc/tree-vect-loop.c        2017-09-14 11:28:27.079519923 +0100

> @@ -6030,8 +6030,7 @@ vectorizable_reduction (gimple *stmt, gi

>              dump_printf (MSG_NOTE, "op not supported by target.\n");

>

>            if (GET_MODE_SIZE (vec_mode) != UNITS_PER_WORD

> -              || LOOP_VINFO_VECT_FACTOR (loop_vinfo)

> -                 < vect_min_worthwhile_factor (code))

> +             || !vect_worthwhile_without_simd_p (loop_vinfo, code))

>              return false;

>

>            if (dump_enabled_p ())

> @@ -6040,8 +6039,7 @@ vectorizable_reduction (gimple *stmt, gi

>

>        /* Worthwhile without SIMD support?  */

>        if (!VECTOR_MODE_P (TYPE_MODE (vectype_in))

> -          && LOOP_VINFO_VECT_FACTOR (loop_vinfo)

> -            < vect_min_worthwhile_factor (code))

> +         && !vect_worthwhile_without_simd_p (loop_vinfo, code))

>          {

>            if (dump_enabled_p ())

>             dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,

> @@ -6492,6 +6490,18 @@ vect_min_worthwhile_factor (enum tree_co

>      }

>  }

>

> +/* Return true if VINFO indicates we are doing loop vectorization and if

> +   it is worth decomposing CODE operations into scalar operations for

> +   that loop's vectorization factor.  */

> +

> +bool

> +vect_worthwhile_without_simd_p (vec_info *vinfo, tree_code code)

> +{

> +  loop_vec_info loop_vinfo = dyn_cast <loop_vec_info> (vinfo);

> +  return (loop_vinfo

> +         && (LOOP_VINFO_VECT_FACTOR (loop_vinfo)

> +             >= vect_min_worthwhile_factor (code)));

> +}

>

>  /* Function vectorizable_induction

>

> Index: gcc/tree-vect-stmts.c

> ===================================================================

> --- gcc/tree-vect-stmts.c       2017-09-14 11:27:50.352072753 +0100

> +++ gcc/tree-vect-stmts.c       2017-09-14 11:28:27.080519923 +0100

> @@ -4869,7 +4869,6 @@ vectorizable_shift (gimple *stmt, gimple

>    bool scalar_shift_arg = true;

>    bb_vec_info bb_vinfo = STMT_VINFO_BB_VINFO (stmt_info);

>    vec_info *vinfo = stmt_info->vinfo;

> -  int vf;

>

>    if (!STMT_VINFO_RELEVANT_P (stmt_info) && !bb_vinfo)

>      return false;

> @@ -4937,11 +4936,6 @@ vectorizable_shift (gimple *stmt, gimple

>        return false;

>      }

>

> -  if (loop_vinfo)

> -    vf = LOOP_VINFO_VECT_FACTOR (loop_vinfo);

> -  else

> -    vf = 1;

> -

>    /* Multiple types in SLP are handled by creating the appropriate number of

>       vectorized stmts for each SLP node.  Hence, NCOPIES is always 1 in

>       case of SLP.  */

> @@ -5086,8 +5080,8 @@ vectorizable_shift (gimple *stmt, gimple

>                           "op not supported by target.\n");

>        /* Check only during analysis.  */

>        if (GET_MODE_SIZE (vec_mode) != UNITS_PER_WORD

> -          || (vf < vect_min_worthwhile_factor (code)

> -              && !vec_stmt))

> +         || (!vec_stmt

> +             && !vect_worthwhile_without_simd_p (vinfo, code)))

>          return false;

>        if (dump_enabled_p ())

>          dump_printf_loc (MSG_NOTE, vect_location,

> @@ -5095,9 +5089,9 @@ vectorizable_shift (gimple *stmt, gimple

>      }

>

>    /* Worthwhile without SIMD support?  Check only during analysis.  */

> -  if (!VECTOR_MODE_P (TYPE_MODE (vectype))

> -      && vf < vect_min_worthwhile_factor (code)

> -      && !vec_stmt)

> +  if (!vec_stmt

> +      && !VECTOR_MODE_P (TYPE_MODE (vectype))

> +      && !vect_worthwhile_without_simd_p (vinfo, code))

>      {

>        if (dump_enabled_p ())

>          dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,

> @@ -5241,7 +5235,6 @@ vectorizable_operation (gimple *stmt, gi

>    tree vop0, vop1, vop2;

>    bb_vec_info bb_vinfo = STMT_VINFO_BB_VINFO (stmt_info);

>    vec_info *vinfo = stmt_info->vinfo;

> -  int vf;

>

>    if (!STMT_VINFO_RELEVANT_P (stmt_info) && !bb_vinfo)

>      return false;

> @@ -5368,11 +5361,6 @@ vectorizable_operation (gimple *stmt, gi

>         }

>      }

>

> -  if (loop_vinfo)

> -    vf = LOOP_VINFO_VECT_FACTOR (loop_vinfo);

> -  else

> -    vf = 1;

> -

>    /* Multiple types in SLP are handled by creating the appropriate number of

>       vectorized stmts for each SLP node.  Hence, NCOPIES is always 1 in

>       case of SLP.  */

> @@ -5414,7 +5402,7 @@ vectorizable_operation (gimple *stmt, gi

>                           "op not supported by target.\n");

>        /* Check only during analysis.  */

>        if (GET_MODE_SIZE (vec_mode) != UNITS_PER_WORD

> -         || (!vec_stmt && vf < vect_min_worthwhile_factor (code)))

> +         || (!vec_stmt && !vect_worthwhile_without_simd_p (vinfo, code)))

>          return false;

>        if (dump_enabled_p ())

>         dump_printf_loc (MSG_NOTE, vect_location,

> @@ -5424,7 +5412,7 @@ vectorizable_operation (gimple *stmt, gi

>    /* Worthwhile without SIMD support?  Check only during analysis.  */

>    if (!VECTOR_MODE_P (vec_mode)

>        && !vec_stmt

> -      && vf < vect_min_worthwhile_factor (code))

> +      && !vect_worthwhile_without_simd_p (vinfo, code))

>      {

>        if (dump_enabled_p ())

>          dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
diff mbox series

Patch

Index: gcc/tree-vectorizer.h
===================================================================
--- gcc/tree-vectorizer.h	2017-09-14 11:27:50.352072753 +0100
+++ gcc/tree-vectorizer.h	2017-09-14 11:28:27.080519923 +0100
@@ -1230,7 +1230,7 @@  extern bool vectorizable_reduction (gimp
 extern bool vectorizable_induction (gimple *, gimple_stmt_iterator *,
 				    gimple **, slp_tree);
 extern tree get_initial_def_for_reduction (gimple *, tree, tree *);
-extern int vect_min_worthwhile_factor (enum tree_code);
+extern bool vect_worthwhile_without_simd_p (vec_info *, tree_code);
 extern int vect_get_known_peeling_cost (loop_vec_info, int, int *,
 					stmt_vector_for_cost *,
 					stmt_vector_for_cost *,
Index: gcc/tree-vect-loop.c
===================================================================
--- gcc/tree-vect-loop.c	2017-09-14 11:27:50.351164919 +0100
+++ gcc/tree-vect-loop.c	2017-09-14 11:28:27.079519923 +0100
@@ -6030,8 +6030,7 @@  vectorizable_reduction (gimple *stmt, gi
             dump_printf (MSG_NOTE, "op not supported by target.\n");
 
           if (GET_MODE_SIZE (vec_mode) != UNITS_PER_WORD
-              || LOOP_VINFO_VECT_FACTOR (loop_vinfo)
-	          < vect_min_worthwhile_factor (code))
+	      || !vect_worthwhile_without_simd_p (loop_vinfo, code))
             return false;
 
           if (dump_enabled_p ())
@@ -6040,8 +6039,7 @@  vectorizable_reduction (gimple *stmt, gi
 
       /* Worthwhile without SIMD support?  */
       if (!VECTOR_MODE_P (TYPE_MODE (vectype_in))
-          && LOOP_VINFO_VECT_FACTOR (loop_vinfo)
-   	     < vect_min_worthwhile_factor (code))
+	  && !vect_worthwhile_without_simd_p (loop_vinfo, code))
         {
           if (dump_enabled_p ())
 	    dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
@@ -6492,6 +6490,18 @@  vect_min_worthwhile_factor (enum tree_co
     }
 }
 
+/* Return true if VINFO indicates we are doing loop vectorization and if
+   it is worth decomposing CODE operations into scalar operations for
+   that loop's vectorization factor.  */
+
+bool
+vect_worthwhile_without_simd_p (vec_info *vinfo, tree_code code)
+{
+  loop_vec_info loop_vinfo = dyn_cast <loop_vec_info> (vinfo);
+  return (loop_vinfo
+	  && (LOOP_VINFO_VECT_FACTOR (loop_vinfo)
+	      >= vect_min_worthwhile_factor (code)));
+}
 
 /* Function vectorizable_induction
 
Index: gcc/tree-vect-stmts.c
===================================================================
--- gcc/tree-vect-stmts.c	2017-09-14 11:27:50.352072753 +0100
+++ gcc/tree-vect-stmts.c	2017-09-14 11:28:27.080519923 +0100
@@ -4869,7 +4869,6 @@  vectorizable_shift (gimple *stmt, gimple
   bool scalar_shift_arg = true;
   bb_vec_info bb_vinfo = STMT_VINFO_BB_VINFO (stmt_info);
   vec_info *vinfo = stmt_info->vinfo;
-  int vf;
 
   if (!STMT_VINFO_RELEVANT_P (stmt_info) && !bb_vinfo)
     return false;
@@ -4937,11 +4936,6 @@  vectorizable_shift (gimple *stmt, gimple
       return false;
     }
 
-  if (loop_vinfo)
-    vf = LOOP_VINFO_VECT_FACTOR (loop_vinfo);
-  else
-    vf = 1;
-
   /* Multiple types in SLP are handled by creating the appropriate number of
      vectorized stmts for each SLP node.  Hence, NCOPIES is always 1 in
      case of SLP.  */
@@ -5086,8 +5080,8 @@  vectorizable_shift (gimple *stmt, gimple
                          "op not supported by target.\n");
       /* Check only during analysis.  */
       if (GET_MODE_SIZE (vec_mode) != UNITS_PER_WORD
-          || (vf < vect_min_worthwhile_factor (code)
-              && !vec_stmt))
+	  || (!vec_stmt
+	      && !vect_worthwhile_without_simd_p (vinfo, code)))
         return false;
       if (dump_enabled_p ())
         dump_printf_loc (MSG_NOTE, vect_location,
@@ -5095,9 +5089,9 @@  vectorizable_shift (gimple *stmt, gimple
     }
 
   /* Worthwhile without SIMD support?  Check only during analysis.  */
-  if (!VECTOR_MODE_P (TYPE_MODE (vectype))
-      && vf < vect_min_worthwhile_factor (code)
-      && !vec_stmt)
+  if (!vec_stmt
+      && !VECTOR_MODE_P (TYPE_MODE (vectype))
+      && !vect_worthwhile_without_simd_p (vinfo, code))
     {
       if (dump_enabled_p ())
         dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
@@ -5241,7 +5235,6 @@  vectorizable_operation (gimple *stmt, gi
   tree vop0, vop1, vop2;
   bb_vec_info bb_vinfo = STMT_VINFO_BB_VINFO (stmt_info);
   vec_info *vinfo = stmt_info->vinfo;
-  int vf;
 
   if (!STMT_VINFO_RELEVANT_P (stmt_info) && !bb_vinfo)
     return false;
@@ -5368,11 +5361,6 @@  vectorizable_operation (gimple *stmt, gi
 	}
     }
 
-  if (loop_vinfo)
-    vf = LOOP_VINFO_VECT_FACTOR (loop_vinfo);
-  else
-    vf = 1;
-
   /* Multiple types in SLP are handled by creating the appropriate number of
      vectorized stmts for each SLP node.  Hence, NCOPIES is always 1 in
      case of SLP.  */
@@ -5414,7 +5402,7 @@  vectorizable_operation (gimple *stmt, gi
                          "op not supported by target.\n");
       /* Check only during analysis.  */
       if (GET_MODE_SIZE (vec_mode) != UNITS_PER_WORD
-	  || (!vec_stmt && vf < vect_min_worthwhile_factor (code)))
+	  || (!vec_stmt && !vect_worthwhile_without_simd_p (vinfo, code)))
         return false;
       if (dump_enabled_p ())
 	dump_printf_loc (MSG_NOTE, vect_location,
@@ -5424,7 +5412,7 @@  vectorizable_operation (gimple *stmt, gi
   /* Worthwhile without SIMD support?  Check only during analysis.  */
   if (!VECTOR_MODE_P (vec_mode)
       && !vec_stmt
-      && vf < vect_min_worthwhile_factor (code))
+      && !vect_worthwhile_without_simd_p (vinfo, code))
     {
       if (dump_enabled_p ())
         dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,