fix PR68314: revert all patches touching the construction of the original schedule
authorAditya Kumar <aditya.k7@samsung.com>
Mon, 23 Nov 2015 23:28:42 +0000 (23:28 +0000)
committerSebastian Pop <spop@gcc.gnu.org>
Mon, 23 Nov 2015 23:28:42 +0000 (23:28 +0000)
Co-Authored-By: Sebastian Pop <s.pop@samsung.com>
From-SVN: r230778

gcc/ChangeLog
gcc/graphite-optimize-isl.c
gcc/graphite-poly.c
gcc/graphite-poly.h
gcc/graphite-sese-to-poly.c

index 27f4d792820e074440543ce3c0351d5ad003b529..13c213b6a7bb0211086565266b4afc30e0bc0b4f 100644 (file)
@@ -1,3 +1,18 @@
+2015-11-23  Aditya Kumar  <aditya.k7@samsung.com>
+           Sebastian Pop  <s.pop@samsung.com>
+
+       PR tree-optimization/68314
+       * graphite-optimize-isl.c (optimize_isl): Do not call isl_union_map_is_equal.
+       * graphite-poly.c (new_scop): Remove original_schedule.
+       (free_scop): Same.
+       * graphite-poly.h (struct scop): Same.
+       * graphite-sese-to-poly.c (build_pbb_minimal_scattering_polyhedrons): Remove.
+       (build_pbb_scattering_polyhedrons): Add back.
+       (build_scop_minimal_scattering): Remove.
+       (build_scop_scattering): Add back.
+       (build_scop_original_schedule): Remove.
+       (build_poly_scop): Revert to only call build_scop_scattering.
+
 2015-11-23  Aditya Kumar  <aditya.k7@samsung.com>
            Sebastian Pop  <s.pop@samsung.com>
 
index 6ae224fd53a835c47e26f80fa76c21472183ded5..559afc481b2d977e0e86e43a332771379035a827 100644 (file)
@@ -442,23 +442,11 @@ optimize_isl (scop_p scop)
 #else
   isl_union_map *schedule_map = get_schedule_map (schedule);
 #endif
+  apply_schedule_map_to_scop (scop, schedule_map);
 
-  if (isl_union_map_is_equal (scop->original_schedule, schedule_map))
-    {
-      if (dump_file && dump_flags)
-       fprintf (dump_file, "\nISL schedule same as original schedule\n");
-
-      isl_schedule_free (schedule);
-      isl_union_map_free (schedule_map);
-      return false;
-    }
-  else
-    {
-      apply_schedule_map_to_scop (scop, schedule_map);
-      isl_schedule_free (schedule);
-      isl_union_map_free (schedule_map);
-      return true;
-    }
+  isl_schedule_free (schedule);
+  isl_union_map_free (schedule_map);
+  return true;
 }
 
 #endif /* HAVE_isl */
index 187a3fa2bd490a4795fdcac7c8160fbb549d93e9..c783fc31e02cc87bdc00a7628621e0263e6df6f0 100644 (file)
@@ -306,7 +306,6 @@ new_scop (edge entry, edge exit)
   scop->must_waw_no_source = NULL;
   scop->may_waw_no_source = NULL;
   scop_set_region (scop, region);
-  scop->original_schedule = NULL;
   scop->pbbs.create (3);
   scop->drs.create (3);
 
@@ -343,7 +342,6 @@ free_scop (scop_p scop)
   isl_union_map_free (scop->may_waw);
   isl_union_map_free (scop->must_waw_no_source);
   isl_union_map_free (scop->may_waw_no_source);
-  isl_union_map_free (scop->original_schedule);
   XDELETE (scop);
 }
 
index dec7fd6df8b86fcacf0f73f41d1d4574c729fdbf..d396d3f7d64668edd8681a2184524e07557230c8 100644 (file)
@@ -417,9 +417,6 @@ struct scop
   isl_union_map *must_raw, *may_raw, *must_raw_no_source, *may_raw_no_source,
     *must_war, *may_war, *must_war_no_source, *may_war_no_source,
     *must_waw, *may_waw, *must_waw_no_source, *may_waw_no_source;
-
-  /* Original schedule of the SCoP.  */
-  isl_union_map *original_schedule;
 };
 
 extern scop_p new_scop (edge, edge);
index 65ff4e6111bae4cf8a672357923d02d7350090e0..ec7248b4417eb3e28502c4254605a97d52e040aa 100644 (file)
@@ -113,78 +113,51 @@ isl_id_for_pbb (scop_p s, poly_bb_p pbb)
    | 0   0   1   0   0   0   0   0  -5  = 0  */
 
 static void
-build_pbb_minimal_scattering_polyhedrons (isl_aff *static_sched, poly_bb_p pbb,
-                                         int *sequence_dims,
-                                         int nb_sequence_dim)
+build_pbb_scattering_polyhedrons (isl_aff *static_sched,
+                                 poly_bb_p pbb)
 {
-  int local_dim = isl_set_dim (pbb->domain, isl_dim_set);
-
-  /* Remove a sequence dimension if irrelevant to domain of current pbb.  */
-  int actual_nb_dim = 0;
-  for (int i = 0; i < nb_sequence_dim; i++)
-    if (sequence_dims[i] <= local_dim)
-      actual_nb_dim++;
-
-  /* Build an array that combines sequence dimensions and loops dimensions info.
-     This is used later to compute the static scattering polyhedrons.  */
-  bool *sequence_and_loop_dims = NULL;
-  if (local_dim + actual_nb_dim > 0)
-    {
-      sequence_and_loop_dims = XNEWVEC (bool, local_dim + actual_nb_dim);
+  isl_val *val;
 
-      int i = 0, j = 0;
-      for (; i < local_dim; i++)
-       {
-         if (sequence_dims && sequence_dims[j] == i)
-           {
-             /* True for sequence dimension.  */
-             sequence_and_loop_dims[i + j] = true;
-             j++;
-           }
-         /* False for loop dimension.  */
-         sequence_and_loop_dims[i + j] = false;
-       }
-      /* Fake loops make things shifted by one.  */
-      if (sequence_dims && sequence_dims[j] == i)
-       sequence_and_loop_dims[i + j] = true;
-    }
+  int scattering_dimensions = isl_set_dim (pbb->domain, isl_dim_set) * 2 + 1;
 
-  int scattering_dimensions = local_dim + actual_nb_dim;
   isl_space *dc = isl_set_get_space (pbb->domain);
-  isl_space *dm = isl_space_add_dims (isl_space_from_domain (dc), isl_dim_out,
-                                     scattering_dimensions);
+  isl_space *dm = isl_space_add_dims (isl_space_from_domain (dc),
+                                     isl_dim_out, scattering_dimensions);
   pbb->schedule = isl_map_universe (dm);
 
-  int k = 0;
   for (int i = 0; i < scattering_dimensions; i++)
     {
-      if (!sequence_and_loop_dims[i])
+      /* Textual order inside this loop.  */
+      if ((i % 2) == 0)
        {
-         /* Iterations of this loop - loop dimension.  */
-         pbb->schedule = isl_map_equate (pbb->schedule, isl_dim_in, k,
-                                         isl_dim_out, i);
-         k++;
-         continue;
+         isl_constraint *c = isl_equality_alloc
+             (isl_local_space_from_space (isl_map_get_space (pbb->schedule)));
+
+         val = isl_aff_get_coefficient_val (static_sched, isl_dim_in, i / 2);
+         gcc_assert (val && isl_val_is_int (val));
+
+         val = isl_val_neg (val);
+         c = isl_constraint_set_constant_val (c, val);
+         c = isl_constraint_set_coefficient_si (c, isl_dim_out, i, 1);
+         pbb->schedule = isl_map_add_constraint (pbb->schedule, c);
        }
 
-      /* Textual order inside this loop - sequence dimension.  */
-      isl_space *s = isl_map_get_space (pbb->schedule);
-      isl_local_space *ls = isl_local_space_from_space (s);
-      isl_constraint *c = isl_equality_alloc (ls);
-      isl_val *val = isl_aff_get_coefficient_val (static_sched, isl_dim_in, k);
-      gcc_assert (val && isl_val_is_int (val));
-      val = isl_val_neg (val);
-      c = isl_constraint_set_constant_val (c, val);
-      c = isl_constraint_set_coefficient_si (c, isl_dim_out, i, 1);
-      pbb->schedule = isl_map_add_constraint (pbb->schedule, c);
+      /* Iterations of this loop.  */
+      else /* if ((i % 2) == 1) */
+       {
+         int loop = (i - 1) / 2;
+         pbb->schedule = isl_map_equate (pbb->schedule, isl_dim_in, loop,
+                                         isl_dim_out, i);
+       }
     }
 
-  XDELETEVEC (sequence_and_loop_dims);
   pbb->transformed = isl_map_copy (pbb->schedule);
 }
 
-/* Build the static schedule for BB.  This function minimizes the number of
-   dimensions used for pbb sequences.
+/* Build for BB the static schedule.
+
+   The static schedule is a Dewey numbering of the abstract syntax
+   tree: http://en.wikipedia.org/wiki/Dewey_Decimal_Classification
 
    The following example informally defines the static schedule:
 
@@ -192,94 +165,40 @@ build_pbb_minimal_scattering_polyhedrons (isl_aff *static_sched, poly_bb_p pbb,
    for (i: ...)
      {
        for (j: ...)
-       {
-         B
-         C
-       }
-     }
-   for (i: ...)
-     {
+         {
+           B
+           C
+         }
+
        for (k: ...)
-       {
-         D
-         E
-       }
+         {
+           D
+           E
+         }
      }
    F
 
    Static schedules for A to F:
 
-   A (0)
-   B (1 i0 i1 0)
-   C (1 i0 i1 1)
-   D (2 i0 i1 2)
-   E (2 i0 i1 3)
-   F (3)
+     DEPTH
+     0 1 2
+   A 0
+   B 1 0 0
+   C 1 0 1
+   D 1 1 0
+   E 1 1 1
+   F 2
 */
 
 static void
-build_scop_minimal_scattering (scop_p scop)
+build_scop_scattering (scop_p scop)
 {
   gimple_poly_bb_p previous_gbb = NULL;
-  int *temp_for_sequence_dims = NULL;
-  int i;
-  poly_bb_p pbb;
-
-  /* Go through the pbbs to determine the minimum number of dimensions needed to
-     build the static schedule.  */
-  int nb_dims = 0;
-  FOR_EACH_VEC_ELT (scop->pbbs, i, pbb)
-    {
-      int dim = isl_set_dim (pbb->domain, isl_dim_set);
-      if (dim > nb_dims)
-       nb_dims = dim;
-    }
-
-  /* One extra dimension for the outer fake loop.  */
-  nb_dims++;
-  temp_for_sequence_dims = XCNEWVEC (int, nb_dims);
-
-  /* Record the number of common loops for each dimension.  */
-  FOR_EACH_VEC_ELT (scop->pbbs, i, pbb)
-    {
-      gimple_poly_bb_p gbb = PBB_BLACK_BOX (pbb);
-      int prefix = 0;
-
-      if (previous_gbb)
-       {
-         prefix = nb_common_loops (scop->scop_info->region, previous_gbb, gbb);
-         temp_for_sequence_dims[prefix] += 1;
-       }
-      previous_gbb = gbb;
-    }
-
-  /* Analyze the info in temp_for_sequence_dim and determine the minimal number
-     of sequence dimensions.  A dimension that did not appear as common
-     dimension should not be considered as a sequence dimension.  */
-  int nb_sequence_params = 0;
-  for (i = 0; i < nb_dims; i++)
-    if (temp_for_sequence_dims[i] > 0)
-      nb_sequence_params++;
-
-  int *sequence_dims = NULL;
-  if (nb_sequence_params > 0)
-    {
-      int j = 0;
-      sequence_dims = XNEWVEC (int, nb_sequence_params);
-      for (i = 0; i < nb_dims; i++)
-       if (temp_for_sequence_dims[i] > 0)
-         {
-           sequence_dims[j] = i;
-           j++;
-         }
-    }
-
-  XDELETEVEC (temp_for_sequence_dims);
-
   isl_space *dc = isl_set_get_space (scop->param_context);
+  isl_aff *static_sched;
+
   dc = isl_space_add_dims (dc, isl_dim_set, number_of_loops (cfun));
-  isl_local_space *local_space = isl_local_space_from_space (dc);
-  isl_aff *static_sched = isl_aff_zero_on_domain (local_space);
+  static_sched = isl_aff_zero_on_domain (isl_local_space_from_space (dc));
 
   /* We have to start schedules at 0 on the first component and
      because we cannot compare_prefix_loops against a previous loop,
@@ -287,7 +206,8 @@ build_scop_minimal_scattering (scop_p scop)
      incremented before copying.  */
   static_sched = isl_aff_add_coefficient_si (static_sched, isl_dim_in, 0, -1);
 
-  previous_gbb = NULL;
+  int i;
+  poly_bb_p pbb;
   FOR_EACH_VEC_ELT (scop->pbbs, i, pbb)
     {
       gimple_poly_bb_p gbb = PBB_BLACK_BOX (pbb);
@@ -300,58 +220,12 @@ build_scop_minimal_scattering (scop_p scop)
 
       static_sched = isl_aff_add_coefficient_si (static_sched, isl_dim_in,
                                                 prefix, 1);
-      build_pbb_minimal_scattering_polyhedrons (static_sched, pbb,
-                                               sequence_dims, nb_sequence_params);
+      build_pbb_scattering_polyhedrons (static_sched, pbb);
     }
 
-  XDELETEVEC (sequence_dims);
   isl_aff_free (static_sched);
 }
 
-/* Build the original schedule showing the orginal order of execution
-   of statement instances.
-
-   The following example shows the original schedule:
-
-   for (i: ...)
-     {
-       for (j: ...)
-         {
-           A
-         }
-       B
-     }
-   C
-   for (i: ...)
-     {
-       D
-     }
-
-   Static schedules for A to D expressed in a union map:
-   {
-     S_A[i0, i1] -> [0, i0, 0, i1];
-     S_B[i0]     -> [0, i0, 1];
-     S_C[]       -> [1];
-     S_D[i0]     -> [2, i0, 0]
-   }
-*/
-
-static void
-build_scop_original_schedule (scop_p scop)
-{
-  int i;
-  poly_bb_p pbb;
-
-  isl_space *space = isl_set_get_space (scop->param_context);
-  isl_union_map *res = isl_union_map_empty (space);
-
-  FOR_EACH_VEC_ELT (scop->pbbs, i, pbb)
-    res = isl_union_map_add_map (res, isl_map_copy (pbb->schedule));
-
-  scop->original_schedule = res;
-}
-
-
 static isl_pw_aff *extract_affine (scop_p, tree, __isl_take isl_space *space);
 
 /* Extract an affine expression from the chain of recurrence E.  */
@@ -1244,8 +1118,7 @@ build_poly_scop (scop_p scop)
     return false;
 
   build_scop_drs (scop);
-  build_scop_minimal_scattering (scop);
-  build_scop_original_schedule (scop);
+  build_scop_scattering (scop);
   return true;
 }
 #endif  /* HAVE_isl */