gcc/
authorRoman Gareev <gareevroman@gmail.com>
Wed, 23 Jul 2014 06:52:14 +0000 (06:52 +0000)
committerRoman Gareev <romangareev@gcc.gnu.org>
Wed, 23 Jul 2014 06:52:14 +0000 (06:52 +0000)
* graphite-isl-ast-to-gimple.c:
(get_max_schedule_dimensions): New function.
(extend_schedule): Likewise.
(generate_isl_schedule): Add calling of extend_schedule and
get_max_schedule_dimensions.

From-SVN: r212921

gcc/ChangeLog
gcc/graphite-isl-ast-to-gimple.c

index f40cfd95b00316b46ac5e0dd7f61f1096fba7200..4318cf85b545f733a706ffe4ad0123940f6e2d27 100644 (file)
@@ -1,3 +1,11 @@
+2014-07-23  Roman Gareev  <gareevroman@gmail.com>
+
+       * graphite-isl-ast-to-gimple.c:
+       (get_max_schedule_dimensions): New function.
+       (extend_schedule): Likewise.
+       (generate_isl_schedule): Add calling of extend_schedule and
+       get_max_schedule_dimensions.
+
 2014-07-22  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        * config/aarch64/aarch64.c (aarch64_rtx_costs): Handle CLRSB, CLZ.
index e567cc6756336e57fbec5bb1ac985d7938bab8bc..75cbfb575d4c06d4f0759b84aa2210383125668e 100644 (file)
@@ -685,12 +685,57 @@ generate_isl_context (scop_p scop)
   return isl_ast_build_from_context (context_isl);
 }
 
+/* Get the maximal number of schedule dimensions in the scop SCOP.  */
+
+static
+int get_max_schedule_dimensions (scop_p scop)
+{
+  int i;
+  poly_bb_p pbb;
+  int schedule_dims = 0;
+
+  FOR_EACH_VEC_ELT (SCOP_BBS (scop), i, pbb)
+    {
+      int pbb_schedule_dims = isl_map_dim (pbb->transformed, isl_dim_out);
+      if (pbb_schedule_dims > schedule_dims)
+       schedule_dims = pbb_schedule_dims;
+    }
+
+  return schedule_dims;
+}
+
+/* Extend the schedule to NB_SCHEDULE_DIMS schedule dimensions.
+
+   For schedules with different dimensionality, the isl AST generator can not
+   define an order and will just randomly choose an order. The solution to this
+   problem is to extend all schedules to the maximal number of schedule
+   dimensions (using '0's for the remaining values).  */
+
+static __isl_give isl_map *
+extend_schedule (__isl_take isl_map *schedule, int nb_schedule_dims)
+{
+  int tmp_dims = isl_map_dim (schedule, isl_dim_out);
+  schedule =
+    isl_map_add_dims (schedule, isl_dim_out, nb_schedule_dims - tmp_dims);
+  isl_val *zero =
+    isl_val_int_from_si (isl_map_get_ctx (schedule), 0);
+  int i;
+  for (i = tmp_dims; i < nb_schedule_dims; i++)
+    {
+      schedule =
+        isl_map_fix_val (schedule, isl_dim_out, i, isl_val_copy (zero));
+    }
+  isl_val_free (zero);
+  return schedule;
+}
+
 /* Generates a schedule, which specifies an order used to
    visit elements in a domain.  */
 
 static __isl_give isl_union_map *
 generate_isl_schedule (scop_p scop)
 {
+  int nb_schedule_dims = get_max_schedule_dimensions (scop);
   int i;
   poly_bb_p pbb;
   isl_union_map *schedule_isl =
@@ -706,6 +751,7 @@ generate_isl_schedule (scop_p scop)
       isl_map *bb_schedule = isl_map_copy (pbb->transformed);
       bb_schedule = isl_map_intersect_domain (bb_schedule,
                                              isl_set_copy (pbb->domain));
+      bb_schedule = extend_schedule (bb_schedule, nb_schedule_dims);
       schedule_isl =
         isl_union_map_union (schedule_isl,
                             isl_union_map_from_map (bb_schedule));