Convert the pre-existing unroll-and-jam path to use the
compute_jam_dependence_factors helper introduced for the reduction-jam
path; both paths now share one data-dep + adjust_unroll_factor walk
with a single set of correctness checks.

No functional change.

gcc/ChangeLog:

        * gimple-loop-jam.cc (tree_loop_unroll_and_jam): Replace the
        inline data-dep + adjust_unroll_factor walk with a call to
        compute_jam_dependence_factors.

Signed-off-by: Konstantinos Eleftheriou <[email protected]>
---

 gcc/gimple-loop-jam.cc | 100 ++++++-----------------------------------
 1 file changed, 13 insertions(+), 87 deletions(-)

diff --git a/gcc/gimple-loop-jam.cc b/gcc/gimple-loop-jam.cc
index 527f7c6cce35..493e4a0a3a0d 100644
--- a/gcc/gimple-loop-jam.cc
+++ b/gcc/gimple-loop-jam.cc
@@ -1442,97 +1442,27 @@ tree_loop_unroll_and_jam (void)
          continue;
        }
 
-      vec<data_reference_p> datarefs = vNULL;
-      vec<ddr_p> dependences = vNULL;
-      unsigned unroll_factor, profit_unroll, removed;
-      class tree_niter_desc desc;
-      bool unroll = false;
-
-      auto_vec<loop_p, 3> loop_nest;
-      if (!compute_data_dependences_for_loop (outer, true, &loop_nest,
-                                             &datarefs, &dependences))
-       {
-         if (dump_file && (dump_flags & TDF_DETAILS))
-           fprintf (dump_file, "Cannot analyze data dependencies\n");
-         free_data_refs (datarefs);
-         free_dependence_relations (dependences);
-         continue;
-       }
-      if (!datarefs.length ())
+      unsigned unroll_factor, profit_unroll, removed, num_datarefs;
+      if (!compute_jam_dependence_factors (outer, loop, &unroll_factor,
+                                          &profit_unroll, &removed,
+                                          &num_datarefs)
+         || num_datarefs == 0)
        continue;
 
-      if (dump_file && (dump_flags & TDF_DETAILS))
-       dump_data_dependence_relations (dump_file, dependences);
-
-      unroll_factor = (unsigned)-1;
-      profit_unroll = 1;
-      removed = 0;
-
-      /* Check all dependencies.  */
-      unsigned i;
-      struct data_dependence_relation *ddr;
-      FOR_EACH_VEC_ELT (dependences, i, ddr)
-       {
-         struct data_reference *dra, *drb;
-
-         /* If the refs are independent there's nothing to do.  */
-         if (DDR_ARE_DEPENDENT (ddr) == chrec_known)
-           continue;
-
-         dra = DDR_A (ddr);
-         drb = DDR_B (ddr);
-
-         /* Nothing interesting for the self dependencies, except for WAW if
-            the access function is not affine or constant because we may end
-            up reordering writes to the same location.  */
-         if (dra == drb)
-           {
-             if (DR_IS_WRITE (dra)
-                 && !DR_ACCESS_FNS (dra).is_empty ()
-                 && DDR_ARE_DEPENDENT (ddr) == chrec_dont_know)
-               {
-                 unroll_factor = 0;
-                 break;
-               }
-             else
-               continue;
-           }
-
-         /* Now check the distance vector, for determining a sensible
-            outer unroll factor, and for validity of merging the inner
-            loop copies.  */
-         if (!adjust_unroll_factor (loop, ddr, &unroll_factor, &profit_unroll,
-                                    &removed))
-           {
-             /* Couldn't get the distance vector.  For two reads that's
-                harmless (we assume we should unroll).  For at least
-                one write this means we can't check the dependence direction
-                and hence can't determine safety.  */
-
-             if (DR_IS_WRITE (dra) || DR_IS_WRITE (drb))
-               {
-                 unroll_factor = 0;
-                 break;
-               }
-           }
-       }
-
-      /* We regard a user-specified minimum percentage of zero as a request
-        to ignore all profitability concerns and apply the transformation
-        always.  */
+      /* min-percent of zero requests "ignore profitability".  */
       if (!param_unroll_jam_min_percent)
-       profit_unroll = MAX(2, profit_unroll);
-      else if (removed * 100 / datarefs.length ()
-         < (unsigned)param_unroll_jam_min_percent)
+       profit_unroll = MAX (2, profit_unroll);
+      else if (removed * 100 / num_datarefs
+              < (unsigned) param_unroll_jam_min_percent)
        profit_unroll = 1;
       if (unroll_factor > profit_unroll)
        unroll_factor = profit_unroll;
-      if (unroll_factor > (unsigned)param_unroll_jam_max_unroll)
+      if (unroll_factor > (unsigned) param_unroll_jam_max_unroll)
        unroll_factor = param_unroll_jam_max_unroll;
-      unroll = (unroll_factor > 1
-               && can_unroll_loop_p (outer, unroll_factor, &desc));
 
-      if (unroll)
+      class tree_niter_desc desc;
+      if (unroll_factor > 1
+         && can_unroll_loop_p (outer, unroll_factor, &desc))
        {
          if (dump_enabled_p ())
            dump_printf_loc (MSG_OPTIMIZED_LOCATIONS | TDF_DETAILS,
@@ -1549,10 +1479,6 @@ tree_loop_unroll_and_jam (void)
          bitmap_set_bit (exit_bbs, single_exit (outer)->dest->index);
          todo |= do_rpo_vn (cfun, loop_preheader_edge (outer), exit_bbs);
        }
-
-      loop_nest.release ();
-      free_dependence_relations (dependences);
-      free_data_refs (datarefs);
     }
 
   if (todo)
-- 
2.55.0

Reply via email to