This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Add a vect_worthwhile_without_simd_p helper routine


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.

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,


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]