diff mbox

add pbb->schedule

Message ID 1313161386-8621-1-git-send-email-sebpop@gmail.com
State New
Headers show

Commit Message

Sebastian Pop Aug. 12, 2011, 3:03 p.m. UTC
---
 gcc/graphite-poly.c         |    6 ++++
 gcc/graphite-sese-to-poly.c |   54 ++++++++++++++++++++++++++++++++++++++++--
 2 files changed, 57 insertions(+), 3 deletions(-)
diff mbox

Patch

diff --git a/gcc/graphite-poly.c b/gcc/graphite-poly.c
index 1828727..2835311 100644
--- a/gcc/graphite-poly.c
+++ b/gcc/graphite-poly.c
@@ -886,6 +886,9 @@  new_poly_bb (scop_p scop, void *black_box)
 
   PBB_DOMAIN (pbb) = NULL;
   pbb->domain = NULL;
+  pbb->schedule = NULL;
+  pbb->transformed = NULL;
+  pbb->saved = NULL;
   PBB_SCOP (pbb) = scop;
   pbb_set_black_box (pbb, black_box);
   PBB_TRANSFORMED (pbb) = NULL;
@@ -911,6 +914,9 @@  free_poly_bb (poly_bb_p pbb)
     ppl_delete_Pointset_Powerset_C_Polyhedron (PBB_DOMAIN (pbb));
 
   isl_set_free (pbb->domain);
+  isl_map_free (pbb->schedule);
+  isl_map_free (pbb->transformed);
+  isl_map_free (pbb->saved);
 
   if (PBB_TRANSFORMED (pbb))
     poly_scattering_free (PBB_TRANSFORMED (pbb));
diff --git a/gcc/graphite-sese-to-poly.c b/gcc/graphite-sese-to-poly.c
index 28c5d98..aec637b 100644
--- a/gcc/graphite-sese-to-poly.c
+++ b/gcc/graphite-sese-to-poly.c
@@ -407,6 +407,16 @@  build_scop_bbs (scop_p scop)
   sbitmap_free (visited);
 }
 
+/* Return an ISL identifier for the polyhedral basic block PBB.  */
+
+static isl_id *
+isl_id_for_pbb (scop_p s, poly_bb_p pbb)
+{
+  char name[50];
+  snprintf (name, sizeof (name), "S_%d", pbb_index (pbb));
+  return isl_id_alloc (s->ctx, name, pbb);
+}
+
 /* Converts the STATIC_SCHEDULE of PBB into a scattering polyhedron.
    We generate SCATTERING_DIMENSIONS scattering dimensions.
 
@@ -441,7 +451,8 @@  build_scop_bbs (scop_p scop)
    | 0   0   1   0   0   0   0   0  -5  = 0  */
 
 static void
-build_pbb_scattering_polyhedrons (ppl_Linear_Expression_t static_schedule,
+build_pbb_scattering_polyhedrons (isl_aff *static_sched,
+				  ppl_Linear_Expression_t static_schedule,
 				  poly_bb_p pbb, int scattering_dimensions)
 {
   int i;
@@ -452,9 +463,11 @@  build_pbb_scattering_polyhedrons (ppl_Linear_Expression_t static_schedule,
   ppl_Coefficient_t c;
   ppl_dimension_type dim = scattering_dimensions + nb_iterators + nb_params;
   mpz_t v;
+  isl_int val;
 
   gcc_assert (scattering_dimensions >= used_scattering_dimensions);
 
+  isl_int_init (val);
   mpz_init (v);
   ppl_new_Coefficient (&c);
   PBB_TRANSFORMED (pbb) = poly_scattering_new ();
@@ -463,6 +476,15 @@  build_pbb_scattering_polyhedrons (ppl_Linear_Expression_t static_schedule,
 
   PBB_NB_SCATTERING_TRANSFORM (pbb) = scattering_dimensions;
 
+  {
+    isl_dim *dc = isl_set_get_dim (scop->context);
+    isl_dim *dm = isl_dim_add (isl_dim_from_domain (dc),
+			       isl_dim_out, scattering_dimensions);
+    pbb->schedule = isl_map_universe (dm);
+    pbb->schedule = isl_map_set_tuple_id (pbb->schedule, isl_dim_out,
+					  isl_id_for_pbb (scop, pbb));
+  }
+
   for (i = 0; i < scattering_dimensions; i++)
     {
       ppl_Constraint_t cstr;
@@ -481,6 +503,20 @@  build_pbb_scattering_polyhedrons (ppl_Linear_Expression_t static_schedule,
 	  mpz_neg (v, v);
 	  ppl_assign_Coefficient_from_mpz_t (c, v);
 	  ppl_Linear_Expression_add_to_inhomogeneous (expr, c);
+
+	  {
+	    isl_constraint *c = isl_equality_alloc
+	      (isl_map_get_dim (pbb->schedule));
+
+	    if (0 != isl_aff_get_coefficient (static_sched, isl_dim_set,
+					      i / 2, &val))
+	      gcc_unreachable ();
+
+	    isl_int_neg (val, val);
+	    c = isl_constraint_set_constant (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.  */
@@ -492,6 +528,9 @@  build_pbb_scattering_polyhedrons (ppl_Linear_Expression_t static_schedule,
 	  ppl_assign_Coefficient_from_mpz_t (c, v);
 	  ppl_Linear_Expression_add_to_coefficient
 	    (expr, scattering_dimensions + loop, c);
+
+	  pbb->schedule = isl_map_equate (pbb->schedule, isl_dim_in, loop,
+					  isl_dim_out, i);
 	}
 
       ppl_new_Constraint (&cstr, expr, PPL_CONSTRAINT_TYPE_EQUAL);
@@ -500,10 +539,12 @@  build_pbb_scattering_polyhedrons (ppl_Linear_Expression_t static_schedule,
       ppl_delete_Constraint (cstr);
     }
 
+  isl_int_clear (val);
   mpz_clear (v);
   ppl_delete_Coefficient (c);
 
   PBB_ORIGINAL (pbb) = poly_scattering_copy (PBB_TRANSFORMED (pbb));
+  pbb->transformed = isl_map_copy (pbb->schedule);
 }
 
 /* Build for BB the static schedule.
@@ -551,6 +592,8 @@  build_scop_scattering (scop_p scop)
   ppl_Linear_Expression_t static_schedule;
   ppl_Coefficient_t c;
   mpz_t v;
+  isl_dim *dc = isl_set_get_dim (scop->context);
+  isl_aff *static_sched = isl_aff_zero (isl_local_space_from_dim (dc));
 
   mpz_init (v);
   ppl_new_Coefficient (&c);
@@ -564,6 +607,8 @@  build_scop_scattering (scop_p scop)
   ppl_assign_Coefficient_from_mpz_t (c, v);
   ppl_Linear_Expression_add_to_coefficient (static_schedule, 0, c);
 
+  static_sched = isl_aff_add_coefficient_si (static_sched, isl_dim_set, 0, -1);
+
   FOR_EACH_VEC_ELT (poly_bb_p, SCOP_BBS (scop), i, pbb)
     {
       gimple_bb_p gbb = PBB_BLACK_BOX (pbb);
@@ -587,11 +632,14 @@  build_scop_scattering (scop_p scop)
       ppl_assign_Linear_Expression_from_Linear_Expression (static_schedule,
 							   common);
 
-      build_pbb_scattering_polyhedrons (common, pbb, nb_scat_dims);
-
+      static_sched = isl_aff_add_coefficient_si (static_sched, isl_dim_set,
+						 prefix, 1);
+      build_pbb_scattering_polyhedrons (static_sched, common, pbb,
+					nb_scat_dims);
       ppl_delete_Linear_Expression (common);
     }
 
+  isl_aff_free (static_sched);
   mpz_clear (v);
   ppl_delete_Coefficient (c);
   ppl_delete_Linear_Expression (static_schedule);