The following refactors the now misleading slp_done_for_suggested_uf
and slp states kept during vectorizer loop analysis.

Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed.

        * tree-vect-loop.cc (vect_analyze_loop_2): Change
        slp_done_for_suggested_uf to a boolean
        single_lane_slp_done_for_suggested_uf.  Change slp
        to force_single_lane boolean.
        (vect_analyze_loop_1): Adjust similarly.
---
 gcc/tree-vect-loop.cc | 37 +++++++++++++++++++------------------
 1 file changed, 19 insertions(+), 18 deletions(-)

diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc
index 739439b1584..0c4a931cc26 100644
--- a/gcc/tree-vect-loop.cc
+++ b/gcc/tree-vect-loop.cc
@@ -2179,13 +2179,13 @@ vect_determine_partial_vectors_and_peeling 
(loop_vec_info loop_vinfo)
    indicates if some analysis meets fatal error.  If one non-NULL pointer
    SUGGESTED_UNROLL_FACTOR is provided, it's intent to be filled with one
    worked out suggested unroll factor, while one NULL pointer shows it's
-   going to apply the suggested unroll factor.  SLP_DONE_FOR_SUGGESTED_UF
-   is to hold the slp decision when the suggested unroll factor is worked
-   out.  */
+   going to apply the suggested unroll factor.
+   SINGLE_LANE_SLP_DONE_FOR_SUGGESTED_UF is to hold whether single-lane
+   slp was forced when the suggested unroll factor was worked out.  */
 static opt_result
 vect_analyze_loop_2 (loop_vec_info loop_vinfo, bool &fatal,
                     unsigned *suggested_unroll_factor,
-                    unsigned& slp_done_for_suggested_uf)
+                    bool& single_lane_slp_done_for_suggested_uf)
 {
   opt_result ok = opt_result::success ();
   int res;
@@ -2249,14 +2249,14 @@ vect_analyze_loop_2 (loop_vec_info loop_vinfo, bool 
&fatal,
   bool applying_suggested_uf = loop_vinfo->suggested_unroll_factor > 1;
   gcc_assert (!applying_suggested_uf || !suggested_unroll_factor);
 
-  /* If the slp decision is false when suggested unroll factor is worked
-     out, and we are applying suggested unroll factor, we can simply skip
-     all slp related analyses this time.  */
-  unsigned slp = !applying_suggested_uf ? 2 : slp_done_for_suggested_uf;
+  /* When single-lane SLP was forced and we are applying suggested unroll
+     factor, keep that decision here.  */
+  bool force_single_lane = (applying_suggested_uf
+                           && single_lane_slp_done_for_suggested_uf);
 
   /* Classify all cross-iteration scalar data-flow cycles.
      Cross-iteration cycles caused by virtual phis are analyzed separately.  */
-  vect_analyze_scalar_cycles (loop_vinfo, slp == 2);
+  vect_analyze_scalar_cycles (loop_vinfo, !force_single_lane);
 
   vect_pattern_recog (loop_vinfo);
 
@@ -2316,7 +2316,7 @@ start_over:
   /* Check the SLP opportunities in the loop, analyze and build
      SLP trees.  */
   ok = vect_analyze_slp (loop_vinfo, loop_vinfo->stmt_vec_infos.length (),
-                        slp == 1);
+                        force_single_lane);
   if (!ok)
     return ok;
 
@@ -2651,7 +2651,7 @@ start_over:
   gcc_assert (known_eq (vectorization_factor,
                        LOOP_VINFO_VECT_FACTOR (loop_vinfo)));
 
-  slp_done_for_suggested_uf = slp;
+  single_lane_slp_done_for_suggested_uf = force_single_lane;
 
   /* Ok to vectorize!  */
   LOOP_VINFO_VECTORIZABLE_P (loop_vinfo) = 1;
@@ -2662,7 +2662,7 @@ again:
   gcc_assert (!ok);
 
   /* Try again with single-lane SLP.  */
-  if (slp == 1)
+  if (force_single_lane)
     return ok;
 
   /* If we are applying suggested unroll factor, we don't need to
@@ -2715,7 +2715,7 @@ again:
     }
 
   /* Roll back state appropriately.  Force single-lane SLP this time.  */
-  slp = 1;
+  force_single_lane = true;
   if (dump_enabled_p ())
     dump_printf_loc (MSG_NOTE, vect_location,
                     "re-trying with single-lane SLP\n");
@@ -2872,12 +2872,12 @@ vect_analyze_loop_1 (class loop *loop, vec_info_shared 
*shared,
   if (masked_p != -1)
     loop_vinfo->can_use_partial_vectors_p = masked_p;
   unsigned int suggested_unroll_factor = 1;
-  unsigned slp_done_for_suggested_uf = 0;
+  bool single_lane_slp_done_for_suggested_uf = false;
 
   /* Run the main analysis.  */
   opt_result res = vect_analyze_loop_2 (loop_vinfo, fatal,
                                        &suggested_unroll_factor,
-                                       slp_done_for_suggested_uf);
+                                       single_lane_slp_done_for_suggested_uf);
   if (dump_enabled_p ())
     dump_printf_loc (MSG_NOTE, vect_location,
                     "***** Analysis %s with vector mode %s\n",
@@ -2909,16 +2909,17 @@ vect_analyze_loop_1 (class loop *loop, vec_info_shared 
*shared,
            if (dump_enabled_p ())
              dump_printf_loc (MSG_NOTE, vect_location,
                         "***** Re-trying analysis for unrolling"
-                        " with unroll factor %d and slp %s.\n",
+                        " with unroll factor %d and %s slp.\n",
                         suggested_unroll_factor,
-                        slp_done_for_suggested_uf ? "on" : "off");
+                        single_lane_slp_done_for_suggested_uf
+                        ? "single-lane" : "");
            loop_vec_info unroll_vinfo
                = vect_create_loop_vinfo (loop, shared, loop_form_info, NULL);
            unroll_vinfo->vector_mode = vector_mode;
            unroll_vinfo->suggested_unroll_factor = suggested_unroll_factor;
            opt_result new_res
                = vect_analyze_loop_2 (unroll_vinfo, fatal, NULL,
-                                      slp_done_for_suggested_uf);
+                                      single_lane_slp_done_for_suggested_uf);
            if (new_res)
              {
                delete loop_vinfo;
-- 
2.43.0

Reply via email to