Move code out of vect_slp_analyze_bb_1
authorRichard Sandiford <richard.sandiford@arm.com>
Sun, 20 Oct 2019 12:59:45 +0000 (12:59 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Sun, 20 Oct 2019 12:59:45 +0000 (12:59 +0000)
After the previous patch, it seems more natural to apply the
PARAM_SLP_MAX_INSNS_IN_BB threshold as soon as we know what
the region is, rather than delaying it to vect_slp_analyze_bb_1.
(But rather than carve out the biggest region possible and then
reject it, wouldn't it be better to stop when the region gets
too big, to at least give us a chance of vectorising something?)

It also seems more natural for vect_slp_bb_region to create the
bb_vec_info itself rather than (a) having to pass bits of data down
for the initialisation and (b) forcing vect_slp_analyze_bb_1 to free
on every failure return.

2019-10-20  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
* tree-vect-slp.c (vect_slp_analyze_bb_1): Take a bb_vec_info
and return a boolean success value.  Move the allocation and
initialization of the bb_vec_info to...
(vect_slp_bb_region): ...here.  Update call accordingly.
(vect_slp_bb): Apply PARAM_SLP_MAX_INSNS_IN_BB here rather
than in vect_slp_analyze_bb_1.

From-SVN: r277211

gcc/ChangeLog
gcc/tree-vect-slp.c

index 42cba4b99957936d5607d689e74a8bcf9ec642a3..f35cb40e2d64e395d590b8cf09014ac6a76a6dca 100644 (file)
@@ -1,3 +1,12 @@
+2019-10-20  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * tree-vect-slp.c (vect_slp_analyze_bb_1): Take a bb_vec_info
+       and return a boolean success value.  Move the allocation and
+       initialization of the bb_vec_info to...
+       (vect_slp_bb_region): ...here.  Update call accordingly.
+       (vect_slp_bb): Apply PARAM_SLP_MAX_INSNS_IN_BB here rather
+       than in vect_slp_analyze_bb_1.
+
 2019-10-20  Richard Sandiford  <richard.sandiford@arm.com>
 
        * tree-vect-slp.c (vect_slp_analyze_bb_1): Call save_datarefs
index d21d18f0cc255c9726a6830c7cd423550cf97336..5b4b37fab2b9dd9eb25b124f81b0cea54ea4d982 100644 (file)
@@ -2836,47 +2836,24 @@ vect_bb_vectorization_profitable_p (bb_vec_info bb_vinfo)
   return true;
 }
 
-/* Check if the basic block can be vectorized.  Returns a bb_vec_info
-   if so and sets fatal to true if failure is independent of
-   current_vector_size.  */
-
-static bb_vec_info
-vect_slp_analyze_bb_1 (gimple_stmt_iterator region_begin,
-                      gimple_stmt_iterator region_end,
-                      vec<data_reference_p> datarefs, int n_stmts,
-                      bool &fatal, vec_info_shared *shared)
+/* Check if the region described by BB_VINFO can be vectorized, returning
+   true if so.  When returning false, set FATAL to true if the same failure
+   would prevent vectorization at other vector sizes, false if it is still
+   worth trying other sizes.  N_STMTS is the number of statements in the
+   region.  */
+
+static bool
+vect_slp_analyze_bb_1 (bb_vec_info bb_vinfo, int n_stmts, bool &fatal)
 {
   DUMP_VECT_SCOPE ("vect_slp_analyze_bb");
 
-  bb_vec_info bb_vinfo;
   slp_instance instance;
   int i;
   poly_uint64 min_vf = 2;
-  bool first_time_p = shared->datarefs.is_empty ();
 
   /* The first group of checks is independent of the vector size.  */
   fatal = true;
 
-  if (n_stmts > PARAM_VALUE (PARAM_SLP_MAX_INSNS_IN_BB))
-    {
-      if (dump_enabled_p ())
-       dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
-                        "not vectorized: too many instructions in "
-                        "basic block.\n");
-      free_data_refs (datarefs);
-      return NULL;
-    }
-
-  bb_vinfo = new _bb_vec_info (region_begin, region_end, shared);
-  if (!bb_vinfo)
-    return NULL;
-
-  BB_VINFO_DATAREFS (bb_vinfo) = datarefs;
-  if (first_time_p)
-    bb_vinfo->shared->save_datarefs ();
-  else
-    bb_vinfo->shared->check_datarefs ();
-
   /* Analyze the data references.  */
 
   if (!vect_analyze_data_refs (bb_vinfo, &min_vf, NULL))
@@ -2885,9 +2862,7 @@ vect_slp_analyze_bb_1 (gimple_stmt_iterator region_begin,
         dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
                         "not vectorized: unhandled data-ref in basic "
                         "block.\n");
-
-      delete bb_vinfo;
-      return NULL;
+      return false;
     }
 
   if (BB_VINFO_DATAREFS (bb_vinfo).length () < 2)
@@ -2896,9 +2871,7 @@ vect_slp_analyze_bb_1 (gimple_stmt_iterator region_begin,
         dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
                         "not vectorized: not enough data-refs in "
                         "basic block.\n");
-
-      delete bb_vinfo;
-      return NULL;
+      return false;
     }
 
   if (!vect_analyze_data_ref_accesses (bb_vinfo))
@@ -2907,9 +2880,7 @@ vect_slp_analyze_bb_1 (gimple_stmt_iterator region_begin,
        dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
                        "not vectorized: unhandled data access in "
                        "basic block.\n");
-
-      delete bb_vinfo;
-      return NULL;
+      return false;
     }
 
   /* If there are no grouped stores in the region there is no need
@@ -2921,9 +2892,7 @@ vect_slp_analyze_bb_1 (gimple_stmt_iterator region_begin,
        dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
                         "not vectorized: no grouped stores in "
                         "basic block.\n");
-
-      delete bb_vinfo;
-      return NULL;
+      return false;
     }
 
   /* While the rest of the analysis below depends on it in some way.  */
@@ -2943,9 +2912,7 @@ vect_slp_analyze_bb_1 (gimple_stmt_iterator region_begin,
                           "not vectorized: failed to find SLP opportunities "
                           "in basic block.\n");
        }
-
-      delete bb_vinfo;
-      return NULL;
+      return false;
     }
 
   vect_record_base_alignments (bb_vinfo);
@@ -2976,19 +2943,14 @@ vect_slp_analyze_bb_1 (gimple_stmt_iterator region_begin,
       i++;
     }
   if (! BB_VINFO_SLP_INSTANCES (bb_vinfo).length ())
-    {
-      delete bb_vinfo;
-      return NULL;
-    }
+    return false;
 
   if (!vect_slp_analyze_operations (bb_vinfo))
     {
       if (dump_enabled_p ())
         dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
                         "not vectorized: bad operation in basic block.\n");
-
-      delete bb_vinfo;
-      return NULL;
+      return false;
     }
 
   /* Cost model: check if the vectorization is worthwhile.  */
@@ -2999,16 +2961,13 @@ vect_slp_analyze_bb_1 (gimple_stmt_iterator region_begin,
         dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
                         "not vectorized: vectorization is not "
                         "profitable.\n");
-
-      delete bb_vinfo;
-      return NULL;
+      return false;
     }
 
   if (dump_enabled_p ())
     dump_printf_loc (MSG_NOTE, vect_location,
                     "Basic block will be vectorized using SLP\n");
-
-  return bb_vinfo;
+  return true;
 }
 
 /* Subroutine of vect_slp_bb.  Try to vectorize the statements between
@@ -3037,9 +2996,16 @@ vect_slp_bb_region (gimple_stmt_iterator region_begin,
     {
       bool vectorized = false;
       bool fatal = false;
-      bb_vinfo = vect_slp_analyze_bb_1 (region_begin, region_end,
-                                       datarefs, n_stmts, fatal, &shared);
-      if (bb_vinfo
+      bb_vinfo = new _bb_vec_info (region_begin, region_end, &shared);
+
+      bool first_time_p = shared.datarefs.is_empty ();
+      BB_VINFO_DATAREFS (bb_vinfo) = datarefs;
+      if (first_time_p)
+       bb_vinfo->shared->save_datarefs ();
+      else
+       bb_vinfo->shared->check_datarefs ();
+
+      if (vect_slp_analyze_bb_1 (bb_vinfo, n_stmts, fatal)
          && dbg_cnt (vect_slp))
        {
          if (dump_enabled_p ())
@@ -3132,7 +3098,14 @@ vect_slp_bb (basic_block bb)
 
       gimple_stmt_iterator region_end = gsi;
 
-      if (vect_slp_bb_region (region_begin, region_end, datarefs, insns))
+      if (insns > PARAM_VALUE (PARAM_SLP_MAX_INSNS_IN_BB))
+       {
+         if (dump_enabled_p ())
+           dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
+                            "not vectorized: too many instructions in "
+                            "basic block.\n");
+       }
+      else if (vect_slp_bb_region (region_begin, region_end, datarefs, insns))
        any_vectorized = true;
 
       if (gsi_end_p (region_end))