diff mbox

[GSoC] extend schedules

Message ID CABGF_gf5C41JRgibXButfn1TOhOQ+KDaadcYsbCG_s7Kja-==Q@mail.gmail.com
State New
Headers show

Commit Message

Roman Gareev July 22, 2014, 4 p.m. UTC
I've attached the patch, which adds the extension of all schedules to
the maximal number of schedule dimensions. It is necessary for the
proper work of the isl AST generator. Is it fine for trunk?

--
                                   Cheers, Roman Gareev.
2014-07-22  Roman Gareev  <gareevroman@gmail.com>

	gcc/
	* graphite-isl-ast-to-gimple.c:
	(get_max_schedule_dimensions): New function.
	(extend_schedule): Likewise.
	(generate_isl_schedule): Add calling of extend_schedule.

Comments

Tobias Grosser July 22, 2014, 4:32 p.m. UTC | #1
On 22/07/2014 18:00, Roman Gareev wrote:
> I've attached the patch, which adds the extension of all schedules to
> the maximal number of schedule dimensions. It is necessary for the
> proper work of the isl AST generator. Is it fine for trunk?
>
> --
>                                     Cheers, Roman Gareev.
>
>
> ChangeLog_entry.txt
>
>
> 2014-07-22  Roman Gareev<gareevroman@gmail.com>
>
> 	gcc/
> 	* graphite-isl-ast-to-gimple.c:
> 	(get_max_schedule_dimensions): New function.
> 	(extend_schedule): Likewise.
> 	(generate_isl_schedule): Add calling of extend_schedule.
>
>
> patch.txt
>
>
> Index: gcc/graphite-isl-ast-to-gimple.c
> ===================================================================
> --- gcc/graphite-isl-ast-to-gimple.c	(revision 212913)
> +++ gcc/graphite-isl-ast-to-gimple.c	(working copy)
> @@ -685,12 +685,57 @@
>     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 just randomly chooses an order.

                       and will just

Otherwise, LGTM.

Please commit.

Cheers,
Tobias
diff mbox

Patch

Index: gcc/graphite-isl-ast-to-gimple.c
===================================================================
--- gcc/graphite-isl-ast-to-gimple.c	(revision 212913)
+++ gcc/graphite-isl-ast-to-gimple.c	(working copy)
@@ -685,12 +685,57 @@ 
   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 just randomly chooses 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 @@ 
       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));