* [PATCH 4/4] [graphite] add missing ast node for isl 0.15
2015-12-18 17:42 [PATCH 1/4] [graphite] add more coalescing to simplify constraints Sebastian Pop
2015-12-18 17:42 ` [PATCH 2/4] [graphite] remove isl scheduler optimizations for deprecated isl 0.14 Sebastian Pop
@ 2015-12-18 17:42 ` Sebastian Pop
2015-12-18 17:42 ` [PATCH 3/4] [graphite] add tiling on schedule trees Sebastian Pop
2 siblings, 0 replies; 4+ messages in thread
From: Sebastian Pop @ 2015-12-18 17:42 UTC (permalink / raw)
To: sebpop; +Cc: richard.guenther, gcc-patches, hiraditya, Sebastian Pop
---
gcc/graphite-isl-ast-to-gimple.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/gcc/graphite-isl-ast-to-gimple.c b/gcc/graphite-isl-ast-to-gimple.c
index 64183c4..7e00b17 100644
--- a/gcc/graphite-isl-ast-to-gimple.c
+++ b/gcc/graphite-isl-ast-to-gimple.c
@@ -1245,6 +1245,15 @@ translate_isl_ast_to_gimple::translate_isl_ast (loop_p context_loop,
case isl_ast_node_block:
return translate_isl_ast_node_block (context_loop, node,
next_e, ip);
+#ifdef HAVE_ISL_OPTIONS_SET_SCHEDULE_SERIALIZE_SCCS
+ case isl_ast_node_mark:
+ {
+ isl_ast_node *n = isl_ast_node_mark_get_node (node);
+ edge e = translate_isl_ast (context_loop, n, next_e, ip);
+ isl_ast_node_free (n);
+ return e;
+ }
+#endif
default:
gcc_unreachable ();
--
1.9.1
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 1/4] [graphite] add more coalescing to simplify constraints
@ 2015-12-18 17:42 Sebastian Pop
2015-12-18 17:42 ` [PATCH 2/4] [graphite] remove isl scheduler optimizations for deprecated isl 0.14 Sebastian Pop
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Sebastian Pop @ 2015-12-18 17:42 UTC (permalink / raw)
To: sebpop; +Cc: richard.guenther, gcc-patches, hiraditya, Sebastian Pop
---
gcc/graphite-dependences.c | 63 ++++++++++++++++++----------------------
gcc/graphite-isl-ast-to-gimple.c | 2 ++
gcc/graphite-optimize-isl.c | 12 ++++----
gcc/graphite-sese-to-poly.c | 28 ++++++++++++------
4 files changed, 56 insertions(+), 49 deletions(-)
diff --git a/gcc/graphite-dependences.c b/gcc/graphite-dependences.c
index 46869d7..ae08059 100644
--- a/gcc/graphite-dependences.c
+++ b/gcc/graphite-dependences.c
@@ -49,7 +49,7 @@ constrain_domain (isl_map *map, isl_set *s)
s = isl_set_set_tuple_id (s, id);
isl_space_free (d);
- return isl_map_intersect_domain (map, s);
+ return isl_map_coalesce (isl_map_intersect_domain (map, s));
}
/* Constrain pdr->accesses with pdr->subscript_sizes and pbb->domain. */
@@ -59,8 +59,8 @@ add_pdr_constraints (poly_dr_p pdr, poly_bb_p pbb)
{
isl_map *x = isl_map_intersect_range (isl_map_copy (pdr->accesses),
isl_set_copy (pdr->subscript_sizes));
- x = constrain_domain (x, isl_set_copy (pbb->domain));
- return x;
+ x = isl_map_coalesce (x);
+ return constrain_domain (x, isl_set_copy (pbb->domain));
}
/* Returns all the memory reads in SCOP. */
@@ -93,7 +93,7 @@ scop_get_reads (scop_p scop, vec<poly_bb_p> pbbs)
}
}
- return res;
+ return isl_union_map_coalesce (res);
}
/* Returns all the memory must writes in SCOP. */
@@ -126,7 +126,7 @@ scop_get_must_writes (scop_p scop, vec<poly_bb_p> pbbs)
}
}
- return res;
+ return isl_union_map_coalesce (res);
}
/* Returns all the memory may writes in SCOP. */
@@ -159,7 +159,7 @@ scop_get_may_writes (scop_p scop, vec<poly_bb_p> pbbs)
}
}
- return res;
+ return isl_union_map_coalesce (res);
}
/* Returns all the original schedules in SCOP. */
@@ -179,7 +179,7 @@ scop_get_original_schedule (scop_p scop, vec<poly_bb_p> pbbs)
isl_set_copy (pbb->domain)));
}
- return res;
+ return isl_union_map_coalesce (res);
}
/* Helper function used on each MAP of a isl_union_map. Computes the
@@ -242,7 +242,7 @@ extend_schedule (__isl_take isl_union_map *x)
str.umap = isl_union_map_empty (isl_union_map_get_space (x));
isl_union_map_foreach_map (x, extend_schedule_1, (void *) &str);
isl_union_map_free (x);
- return str.umap;
+ return isl_union_map_coalesce (str.umap);
}
/* Applies SCHEDULE to the in and out dimensions of the dependences
@@ -252,22 +252,17 @@ static isl_map *
apply_schedule_on_deps (__isl_keep isl_union_map *schedule,
__isl_keep isl_union_map *deps)
{
- isl_map *x;
- isl_union_map *ux, *trans;
-
- trans = isl_union_map_copy (schedule);
- trans = extend_schedule (trans);
- ux = isl_union_map_copy (deps);
+ isl_union_map *trans = extend_schedule (isl_union_map_copy (schedule));
+ isl_union_map *ux = isl_union_map_copy (deps);
ux = isl_union_map_apply_domain (ux, isl_union_map_copy (trans));
ux = isl_union_map_apply_range (ux, trans);
- if (isl_union_map_is_empty (ux))
- {
- isl_union_map_free (ux);
- return NULL;
- }
- x = isl_map_from_union_map (ux);
+ ux = isl_union_map_coalesce (ux);
+
+ if (!isl_union_map_is_empty (ux))
+ return isl_map_from_union_map (ux);
- return x;
+ isl_union_map_free (ux);
+ return NULL;
}
/* Return true when DEPS is non empty and the intersection of LEX with
@@ -280,25 +275,19 @@ carries_deps (__isl_keep isl_union_map *schedule,
__isl_keep isl_union_map *deps,
int depth)
{
- bool res;
- int i;
- isl_space *space;
- isl_map *lex, *x;
- isl_constraint *ineq;
-
if (isl_union_map_is_empty (deps))
return false;
- x = apply_schedule_on_deps (schedule, deps);
+ isl_map *x = apply_schedule_on_deps (schedule, deps);
if (x == NULL)
return false;
- space = isl_map_get_space (x);
- space = isl_space_range (space);
- lex = isl_map_lex_le (space);
- space = isl_map_get_space (x);
- ineq = isl_inequality_alloc (isl_local_space_from_space (space));
- for (i = 0; i < depth - 1; i++)
+ isl_space *space = isl_map_get_space (x);
+ isl_map *lex = isl_map_lex_le (isl_space_range (space));
+ isl_constraint *ineq = isl_inequality_alloc
+ (isl_local_space_from_space (isl_map_get_space (x)));
+
+ for (int i = 0; i < depth - 1; i++)
lex = isl_map_equate (lex, isl_dim_in, i, isl_dim_out, i);
/* in + 1 <= out */
@@ -306,8 +295,9 @@ carries_deps (__isl_keep isl_union_map *schedule,
ineq = isl_constraint_set_coefficient_si (ineq, isl_dim_in, depth - 1, -1);
ineq = isl_constraint_set_constant_si (ineq, -1);
lex = isl_map_add_constraint (lex, ineq);
+ lex = isl_map_coalesce (lex);
x = isl_map_intersect (x, lex);
- res = !isl_map_is_empty (x);
+ bool res = !isl_map_is_empty (x);
isl_map_free (x);
return res;
@@ -336,6 +326,8 @@ compute_deps (scop_p scop, vec<poly_bb_p> pbbs,
isl_union_map *may_writes = scop_get_may_writes (scop, pbbs);
isl_union_map *all_writes = isl_union_map_union
(isl_union_map_copy (must_writes), isl_union_map_copy (may_writes));
+ all_writes = isl_union_map_coalesce (all_writes);
+
isl_space *space = isl_union_map_get_space (all_writes);
isl_union_map *empty = isl_union_map_empty (space);
isl_union_map *original = scop_get_original_schedule (scop, pbbs);
@@ -416,6 +408,7 @@ scop_get_dependences (scop_p scop)
dependences = isl_union_map_union (dependences, may_raw);
dependences = isl_union_map_union (dependences, may_war);
dependences = isl_union_map_union (dependences, may_waw);
+ dependences = isl_union_map_coalesce (dependences);
if (dump_file)
{
diff --git a/gcc/graphite-isl-ast-to-gimple.c b/gcc/graphite-isl-ast-to-gimple.c
index 795232a..aaca9e9 100644
--- a/gcc/graphite-isl-ast-to-gimple.c
+++ b/gcc/graphite-isl-ast-to-gimple.c
@@ -3160,9 +3160,11 @@ translate_isl_ast_to_gimple::generate_isl_schedule (scop_p scop)
bb_schedule = isl_map_intersect_domain (bb_schedule,
isl_set_copy (pbb->domain));
bb_schedule = extend_schedule (bb_schedule, nb_schedule_dims);
+ bb_schedule = isl_map_coalesce (bb_schedule);
schedule_isl
= isl_union_map_union (schedule_isl,
isl_union_map_from_map (bb_schedule));
+ schedule_isl = isl_union_map_coalesce (schedule_isl);
}
return schedule_isl;
}
diff --git a/gcc/graphite-optimize-isl.c b/gcc/graphite-optimize-isl.c
index 9626e96..15dd5b0 100644
--- a/gcc/graphite-optimize-isl.c
+++ b/gcc/graphite-optimize-isl.c
@@ -241,6 +241,7 @@ get_schedule_for_band (isl_band *band, int *dimensions)
PARAM_VALUE (PARAM_LOOP_BLOCK_TILE_SIZE));
tile_umap = isl_union_map_from_map (isl_map_from_basic_map (tile_map));
tile_umap = isl_union_map_align_params (tile_umap, space);
+ tile_umap = isl_union_map_coalesce (tile_umap);
*dimensions = 2 * *dimensions;
return isl_union_map_apply_range (partial_schedule, tile_umap);
@@ -292,14 +293,14 @@ get_schedule_for_band_list (isl_band_list *band_list)
isl_space_free (space);
}
- return schedule;
+ return isl_union_map_coalesce (schedule);
}
static isl_union_map *
get_schedule_map (isl_schedule *schedule)
{
- isl_band_list *bandList = isl_schedule_get_band_forest (schedule);
- isl_union_map *schedule_map = get_schedule_for_band_list (bandList);
+ isl_band_list *band_list = isl_schedule_get_band_forest (schedule);
+ isl_union_map *schedule_map = get_schedule_for_band_list (band_list);
isl_band_list_free (bandList);
return schedule_map;
}
@@ -327,15 +328,16 @@ apply_schedule_map_to_scop (scop_p scop, isl_union_map *schedule_map)
isl_union_map *stmt_band
= isl_union_map_intersect_domain (isl_union_map_copy (schedule_map),
isl_union_set_from_set (domain));
+ stmt_band = isl_union_map_coalesce (stmt_band);
isl_union_map_foreach_map (stmt_band, get_single_map, &stmt_schedule);
isl_map_free (pbb->transformed);
- pbb->transformed = stmt_schedule;
+ pbb->transformed = isl_map_coalesce (stmt_schedule);
isl_union_map_free (stmt_band);
}
}
static isl_union_set *
-scop_get_domains (scop_p scop ATTRIBUTE_UNUSED)
+scop_get_domains (scop_p scop)
{
int i;
poly_bb_p pbb;
diff --git a/gcc/graphite-sese-to-poly.c b/gcc/graphite-sese-to-poly.c
index 7992c28..6421e4e 100644
--- a/gcc/graphite-sese-to-poly.c
+++ b/gcc/graphite-sese-to-poly.c
@@ -143,6 +143,10 @@ build_pbb_scattering_polyhedrons (isl_aff *static_sched,
}
}
+ /* Simplify the original schedule. */
+ pbb->schedule = isl_map_coalesce (pbb->schedule);
+
+ /* At the beginning, set the transformed schedule to the original. */
pbb->transformed = isl_map_copy (pbb->schedule);
}
@@ -482,7 +486,7 @@ build_loop_iteration_domains (scop_p scop, struct loop *loop,
isl_constraint *c = isl_inequality_alloc
(isl_local_space_from_space (isl_space_copy (space)));
c = isl_constraint_set_coefficient_si (c, isl_dim_set, pos, 1);
- inner = isl_set_add_constraint (inner, c);
+ inner = isl_set_coalesce (isl_set_add_constraint (inner, c));
/* loop_i <= cst_nb_iters */
if (TREE_CODE (nb_iters) == INTEGER_CST)
@@ -513,7 +517,8 @@ build_loop_iteration_domains (scop_p scop, struct loop *loop,
isl_set_dim (valid, isl_dim_set));
if (valid)
- scop->param_context = isl_set_intersect (scop->param_context, valid);
+ scop->param_context = isl_set_coalesce
+ (isl_set_intersect (scop->param_context, valid));
isl_local_space *ls = isl_local_space_from_space (isl_space_copy (space));
isl_aff *al = isl_aff_set_coefficient_si (isl_aff_zero_on_domain (ls),
@@ -541,7 +546,8 @@ build_loop_iteration_domains (scop_p scop, struct loop *loop,
isl_set *x = isl_pw_aff_ge_set (approx, aff);
x = isl_set_project_out (x, isl_dim_set, 0,
isl_set_dim (x, isl_dim_set));
- scop->param_context = isl_set_intersect (scop->param_context, x);
+ scop->param_context = isl_set_coalesce
+ (isl_set_intersect (scop->param_context, x));
isl_constraint *c = isl_inequality_alloc
(isl_local_space_from_space (isl_space_copy (space)));
@@ -557,6 +563,7 @@ build_loop_iteration_domains (scop_p scop, struct loop *loop,
else
gcc_unreachable ();
+ inner = isl_set_coalesce (inner);
if (loop->inner
&& !build_loop_iteration_domains (scop, loop->inner, nb + 1,
isl_set_copy (inner), doms))
@@ -648,7 +655,7 @@ add_condition_to_pbb (poly_bb_p pbb, gcond *stmt, enum tree_code code)
cond = isl_set_coalesce (cond);
cond = isl_set_set_tuple_id (cond, isl_set_get_tuple_id (pbb->domain));
- pbb->domain = isl_set_intersect (pbb->domain, cond);
+ pbb->domain = isl_set_coalesce (isl_set_intersect (pbb->domain, cond));
return true;
}
@@ -749,7 +756,8 @@ add_param_constraints (scop_p scop, graphite_dim_t p)
c = isl_constraint_set_constant_val (c, v);
c = isl_constraint_set_coefficient_si (c, isl_dim_param, p, 1);
- scop->param_context = isl_set_add_constraint (scop->param_context, c);
+ scop->param_context = isl_set_coalesce
+ (isl_set_add_constraint (scop->param_context, c));
}
if (ub)
@@ -768,7 +776,8 @@ add_param_constraints (scop_p scop, graphite_dim_t p)
c = isl_constraint_set_constant_val (c, v);
c = isl_constraint_set_coefficient_si (c, isl_dim_param, p, -1);
- scop->param_context = isl_set_add_constraint (scop->param_context, c);
+ scop->param_context = isl_set_coalesce
+ (isl_set_add_constraint (scop->param_context, c));
}
}
@@ -911,7 +920,7 @@ pdr_add_memory_accesses (isl_map *acc, dr_info &dri)
acc = set_index (acc, i + 1, aff);
}
- return acc;
+ return isl_map_coalesce (acc);
}
/* Return true when the LOW and HIGH bounds of an array reference REF are valid
@@ -972,7 +981,8 @@ pdr_add_data_dimensions (isl_set *subscript_sizes, scop_p scop,
isl_set *valid = isl_pw_aff_nonneg_set (isl_pw_aff_copy (ub));
valid = isl_set_project_out (valid, isl_dim_set, 0,
isl_set_dim (valid, isl_dim_set));
- scop->param_context = isl_set_intersect (scop->param_context, valid);
+ scop->param_context = isl_set_coalesce
+ (isl_set_intersect (scop->param_context, valid));
isl_aff *aff
= isl_aff_zero_on_domain (isl_local_space_from_space (space));
@@ -992,7 +1002,7 @@ pdr_add_data_dimensions (isl_set *subscript_sizes, scop_p scop,
subscript_sizes = isl_set_intersect (subscript_sizes, ubs);
}
- return subscript_sizes;
+ return isl_set_coalesce (subscript_sizes);
}
/* Build data accesses for DRI. */
--
1.9.1
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 3/4] [graphite] add tiling on schedule trees
2015-12-18 17:42 [PATCH 1/4] [graphite] add more coalescing to simplify constraints Sebastian Pop
2015-12-18 17:42 ` [PATCH 2/4] [graphite] remove isl scheduler optimizations for deprecated isl 0.14 Sebastian Pop
2015-12-18 17:42 ` [PATCH 4/4] [graphite] add missing ast node for isl 0.15 Sebastian Pop
@ 2015-12-18 17:42 ` Sebastian Pop
2 siblings, 0 replies; 4+ messages in thread
From: Sebastian Pop @ 2015-12-18 17:42 UTC (permalink / raw)
To: sebpop; +Cc: richard.guenther, gcc-patches, hiraditya, Sebastian Pop
---
gcc/graphite-optimize-isl.c | 96 ++++++++++++++++++++++++++++++++++++++++-----
gcc/graphite-poly.c | 19 +++++++++
gcc/graphite.h | 2 +
gcc/params.def | 2 +-
4 files changed, 108 insertions(+), 11 deletions(-)
diff --git a/gcc/graphite-optimize-isl.c b/gcc/graphite-optimize-isl.c
index 7c3bfcf..9d185c6 100644
--- a/gcc/graphite-optimize-isl.c
+++ b/gcc/graphite-optimize-isl.c
@@ -48,6 +48,71 @@ optimize_isl (scop_p scop ATTRIBUTE_UNUSED)
}
#else
+static isl_schedule_node *
+tile_node (__isl_take isl_schedule_node *node)
+{
+ isl_ctx *ctx = isl_schedule_node_get_ctx (node);
+ isl_space *space = isl_schedule_node_band_get_space (node);
+ unsigned dims = isl_space_dim (space, isl_dim_set);
+ isl_multi_val *sizes = isl_multi_val_zero (space);
+
+ for (unsigned i = 0; i < dims; i++)
+ {
+ isl_val *tile_size = isl_val_int_from_si
+ (ctx, PARAM_VALUE (PARAM_LOOP_BLOCK_TILE_SIZE));
+ sizes = isl_multi_val_set_val (sizes, i, tile_size);
+ }
+
+ isl_id *id1 = isl_id_alloc (ctx, "tile", NULL);
+ node = isl_schedule_node_insert_mark
+ (node, id1);
+ node = isl_schedule_node_child (node, 0);
+ node = isl_schedule_node_band_tile (node, sizes);
+ node = isl_schedule_node_child (node, 0);
+ isl_id *id2 = isl_id_alloc (ctx, "point", NULL);
+ node = isl_schedule_node_insert_mark
+ (node, id2);
+
+ return isl_schedule_node_child (node, 0);
+}
+
+static bool is_tileable_node (__isl_keep isl_schedule_node *node)
+{
+ if (isl_schedule_node_get_type (node) != isl_schedule_node_band)
+ return false;
+
+ if (isl_schedule_node_n_children (node) != 1)
+ return false;
+
+ if (!isl_schedule_node_band_get_permutable (node))
+ return false;
+
+ isl_space *space = isl_schedule_node_band_get_space (node);
+ unsigned dims = isl_space_dim (space, isl_dim_set);
+ isl_space_free (space);
+
+ if (dims <= 1)
+ return false;
+
+ isl_schedule_node *child = isl_schedule_node_get_child (node, 0);
+ enum isl_schedule_node_type type = isl_schedule_node_get_type (child);
+ isl_schedule_node_free (child);
+
+ if (type != isl_schedule_node_leaf)
+ return false;
+
+ return true;
+}
+
+static isl_schedule_node *
+optimize_node (__isl_take isl_schedule_node *node, void *user ATTRIBUTE_UNUSED)
+{
+ if (is_tileable_node (node))
+ return tile_node (node);
+
+ return node;
+}
+
static isl_union_set *
scop_get_domains (scop_p scop)
{
@@ -62,8 +127,6 @@ scop_get_domains (scop_p scop)
return res;
}
-static const int CONSTANT_BOUND = 20;
-
/* Compute the schedule for SCOP based on its parameters, domain and set of
constraints. Then apply the schedule to SCOP. */
@@ -85,15 +148,13 @@ optimize_isl (scop_p scop)
isl_union_map *validity = isl_union_map_copy (scop->dependence);
isl_union_map *proximity = isl_union_map_copy (validity);
- isl_options_set_schedule_max_constant_term (scop->isl_context, CONSTANT_BOUND);
- isl_options_set_schedule_maximize_band_depth (scop->isl_context, 1);
- isl_options_set_schedule_serialize_sccs (scop->isl_context, 0);
+ isl_options_set_schedule_serialize_sccs (scop->isl_context, 1);
isl_options_set_schedule_maximize_band_depth (scop->isl_context, 1);
isl_options_set_schedule_max_constant_term (scop->isl_context, 20);
isl_options_set_schedule_max_coefficient (scop->isl_context, 20);
isl_options_set_tile_scale_tile_loops (scop->isl_context, 0);
- isl_options_set_coalesce_bounded_wrapping (scop->isl_context, 1);
- isl_options_set_ast_build_exploit_nested_bounds (scop->isl_context, 1);
+ //isl_options_set_coalesce_bounded_wrapping (scop->isl_context, 1);
+ //isl_options_set_ast_build_exploit_nested_bounds (scop->isl_context, 1);
isl_options_set_ast_build_atomic_upper_bound (scop->isl_context, 1);
/* FIXME: the use of isl_union_set_compute_schedule is discouraged in isl
@@ -114,9 +175,24 @@ optimize_isl (scop_p scop)
return false;
}
- /* Attach the schedule to scop so that it can be used in code generation.
- schedule freeing will occur in code generation. */
- scop->schedule = schedule;
+ if (dump_file)
+ {
+ fprintf (dump_file, "schedule before tiling:\n");
+ print_isl_schedule (dump_file, schedule);
+ }
+
+ isl_schedule_node *root = isl_schedule_get_root (schedule);
+ root = isl_schedule_node_map_descendant_bottom_up (root, optimize_node, NULL);
+ scop->schedule = isl_schedule_node_get_schedule (root);
+
+ if (dump_file)
+ {
+ fprintf (dump_file, "schedule after tiling:\n");
+ print_isl_schedule (dump_file, scop->schedule);
+ }
+
+ isl_schedule_free (schedule);
+ isl_schedule_node_free (root);
return true;
}
#endif /* HAVE_ISL_OPTIONS_SET_SCHEDULE_SERIALIZE_SCCS */
diff --git a/gcc/graphite-poly.c b/gcc/graphite-poly.c
index ff451b8..73356f2 100644
--- a/gcc/graphite-poly.c
+++ b/gcc/graphite-poly.c
@@ -541,6 +541,7 @@ void
print_isl_set (FILE *f, isl_set *set)
{
isl_printer *p = isl_printer_to_file (the_isl_ctx, f);
+ p = isl_printer_set_yaml_style (p, ISL_YAML_STYLE_BLOCK);
p = isl_printer_print_set (p, set);
p = isl_printer_print_str (p, "\n");
isl_printer_free (p);
@@ -556,6 +557,7 @@ void
print_isl_map (FILE *f, isl_map *map)
{
isl_printer *p = isl_printer_to_file (the_isl_ctx, f);
+ p = isl_printer_set_yaml_style (p, ISL_YAML_STYLE_BLOCK);
p = isl_printer_print_map (p, map);
p = isl_printer_print_str (p, "\n");
isl_printer_free (p);
@@ -571,6 +573,7 @@ void
print_isl_union_map (FILE *f, isl_union_map *map)
{
isl_printer *p = isl_printer_to_file (the_isl_ctx, f);
+ p = isl_printer_set_yaml_style (p, ISL_YAML_STYLE_BLOCK);
p = isl_printer_print_union_map (p, map);
p = isl_printer_print_str (p, "\n");
isl_printer_free (p);
@@ -613,6 +616,22 @@ debug_isl_constraint (isl_constraint *c)
print_isl_constraint (stderr, c);
}
+void
+print_isl_schedule (FILE *f, isl_schedule *s)
+{
+ isl_printer *p = isl_printer_to_file (the_isl_ctx, f);
+ p = isl_printer_set_yaml_style (p, ISL_YAML_STYLE_BLOCK);
+ p = isl_printer_print_schedule (p, s);
+ p = isl_printer_print_str (p, "\n");
+ isl_printer_free (p);
+}
+
+DEBUG_FUNCTION void
+debug_isl_schedule (isl_schedule *s)
+{
+ print_isl_schedule (stderr, s);
+}
+
/* Returns the number of iterations RES of the loop around PBB at
time(scattering) dimension TIME_DEPTH. */
diff --git a/gcc/graphite.h b/gcc/graphite.h
index 83f8191..2e07a89 100644
--- a/gcc/graphite.h
+++ b/gcc/graphite.h
@@ -317,6 +317,8 @@ extern void print_isl_map (FILE *, isl_map *);
extern void print_isl_union_map (FILE *, isl_union_map *);
extern void print_isl_aff (FILE *, isl_aff *);
extern void print_isl_constraint (FILE *, isl_constraint *);
+extern void print_isl_schedule (FILE *, isl_schedule *);
+extern void debug_isl_schedule (isl_schedule *);
extern void debug_isl_set (isl_set *);
extern void debug_isl_map (isl_map *);
extern void debug_isl_union_map (isl_union_map *);
diff --git a/gcc/params.def b/gcc/params.def
index 9b82164..98081b9 100644
--- a/gcc/params.def
+++ b/gcc/params.def
@@ -833,7 +833,7 @@ DEFPARAM (PARAM_SWITCH_CONVERSION_BRANCH_RATIO,
DEFPARAM (PARAM_LOOP_BLOCK_TILE_SIZE,
"loop-block-tile-size",
"size of tiles for loop blocking.",
- 51, 0, 0)
+ 32, 0, 0)
/* Maximal number of parameters that we allow in a SCoP. */
--
1.9.1
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 2/4] [graphite] remove isl scheduler optimizations for deprecated isl 0.14
2015-12-18 17:42 [PATCH 1/4] [graphite] add more coalescing to simplify constraints Sebastian Pop
@ 2015-12-18 17:42 ` Sebastian Pop
2015-12-18 17:42 ` [PATCH 4/4] [graphite] add missing ast node for isl 0.15 Sebastian Pop
2015-12-18 17:42 ` [PATCH 3/4] [graphite] add tiling on schedule trees Sebastian Pop
2 siblings, 0 replies; 4+ messages in thread
From: Sebastian Pop @ 2015-12-18 17:42 UTC (permalink / raw)
To: sebpop; +Cc: richard.guenther, gcc-patches, hiraditya, Sebastian Pop
---
gcc/graphite-isl-ast-to-gimple.c | 56 +++----
gcc/graphite-optimize-isl.c | 317 +--------------------------------------
gcc/graphite-poly.c | 24 +--
3 files changed, 40 insertions(+), 357 deletions(-)
diff --git a/gcc/graphite-isl-ast-to-gimple.c b/gcc/graphite-isl-ast-to-gimple.c
index aaca9e9..64183c4 100644
--- a/gcc/graphite-isl-ast-to-gimple.c
+++ b/gcc/graphite-isl-ast-to-gimple.c
@@ -303,14 +303,6 @@ class translate_isl_ast_to_gimple
__isl_give isl_union_map *generate_isl_schedule (scop_p scop);
-#ifdef HAVE_ISL_OPTIONS_SET_SCHEDULE_SERIALIZE_SCCS
- /* Set the "separate" option for all schedules. This helps reducing control
- overhead. */
-
- __isl_give isl_schedule *
- set_options_for_schedule_tree (__isl_take isl_schedule *schedule);
-#endif
-
/* Set the separate option for all dimensions.
This helps to reduce control overhead. */
@@ -3186,19 +3178,6 @@ ast_build_before_for (__isl_keep isl_ast_build *build, void *user)
return id;
}
-#ifdef HAVE_ISL_OPTIONS_SET_SCHEDULE_SERIALIZE_SCCS
-/* Set the separate option for all schedules. This helps reducing control
- overhead. */
-
-__isl_give isl_schedule *
-translate_isl_ast_to_gimple::set_options_for_schedule_tree
-(__isl_take isl_schedule *schedule)
-{
- return isl_schedule_map_schedule_node_bottom_up
- (schedule, set_separate_option, NULL);
-}
-#endif
-
/* Set the separate option for all dimensions.
This helps to reduce control overhead. */
@@ -3223,7 +3202,6 @@ translate_isl_ast_to_gimple::set_options (__isl_take isl_ast_build *control,
__isl_give isl_ast_node *
translate_isl_ast_to_gimple::scop_to_isl_ast (scop_p scop, ivs_params &ip)
{
- isl_ast_node *ast_isl = NULL;
/* Generate loop upper bounds that consist of the current loop iterator, an
operator (< or <=) and an expression not involving the iterator. If this
option is not set, then the current loop iterator may appear several times
@@ -3231,6 +3209,23 @@ translate_isl_ast_to_gimple::scop_to_isl_ast (scop_p scop, ivs_params &ip)
isl_options_set_ast_build_atomic_upper_bound (scop->isl_context, true);
add_parameters_to_ivs_params (scop, ip);
+
+#ifdef HAVE_ISL_OPTIONS_SET_SCHEDULE_SERIALIZE_SCCS
+ /* isl 0.15 and isl scheduler has a new schedule. */
+ if (scop->schedule)
+ {
+ /* Set the separate option to reduce control flow overhead. */
+ isl_schedule *schedule = isl_schedule_map_schedule_node_bottom_up
+ (scop->schedule, set_separate_option, NULL);
+ isl_ast_build *context_isl = generate_isl_context (scop);
+ isl_ast_node *ast_isl = isl_ast_build_node_from_schedule
+ (context_isl, schedule);
+ isl_ast_build_free (context_isl);
+ return ast_isl;
+ }
+#endif
+
+ /* isl 0.14, graphite-identity, or parallelize. */
isl_union_map *schedule_isl = generate_isl_schedule (scop);
isl_ast_build *context_isl = generate_isl_context (scop);
context_isl = set_options (context_isl, schedule_isl);
@@ -3241,21 +3236,8 @@ translate_isl_ast_to_gimple::scop_to_isl_ast (scop_p scop, ivs_params &ip)
isl_ast_build_set_before_each_for (context_isl, ast_build_before_for,
dependence);
}
-
-#ifdef HAVE_ISL_OPTIONS_SET_SCHEDULE_SERIALIZE_SCCS
- if (scop->schedule)
- {
- scop->schedule = set_options_for_schedule_tree (scop->schedule);
- ast_isl = isl_ast_build_node_from_schedule (context_isl, scop->schedule);
- isl_union_map_free(schedule_isl);
- }
- else
- ast_isl = isl_ast_build_ast_from_schedule (context_isl, schedule_isl);
-#else
- ast_isl = isl_ast_build_ast_from_schedule (context_isl, schedule_isl);
- isl_schedule_free (scop->schedule);
-#endif
-
+ isl_ast_node *ast_isl = isl_ast_build_ast_from_schedule
+ (context_isl, schedule_isl);
isl_ast_build_free (context_isl);
return ast_isl;
}
diff --git a/gcc/graphite-optimize-isl.c b/gcc/graphite-optimize-isl.c
index 15dd5b0..7c3bfcf 100644
--- a/gcc/graphite-optimize-isl.c
+++ b/gcc/graphite-optimize-isl.c
@@ -39,303 +39,15 @@ along with GCC; see the file COPYING3. If not see
#include "dumpfile.h"
#include "graphite.h"
-#ifdef HAVE_ISL_OPTIONS_SET_SCHEDULE_SERIALIZE_SCCS
-/* isl 0.15 or later. */
-
-/* get_schedule_for_node_st - Improve schedule for the schedule node.
- Only Simple loop tiling is considered. */
-
-static __isl_give isl_schedule_node *
-get_schedule_for_node_st (__isl_take isl_schedule_node *node, void *user)
-{
- if (user)
- return node;
-
- if (isl_schedule_node_get_type (node) != isl_schedule_node_band
- || isl_schedule_node_n_children (node) != 1)
- return node;
-
- isl_space *space = isl_schedule_node_band_get_space (node);
- unsigned dims = isl_space_dim (space, isl_dim_set);
- isl_schedule_node *child = isl_schedule_node_get_child (node, 0);
- isl_schedule_node_type type = isl_schedule_node_get_type (child);
- isl_space_free (space);
- isl_schedule_node_free (child);
-
- if (type != isl_schedule_node_leaf)
- return node;
-
- if (dims <= 1 || !isl_schedule_node_band_get_permutable (node))
- {
- if (dump_file && dump_flags)
- fprintf (dump_file, "not tiled\n");
- return node;
- }
-
- /* Tile loops. */
- space = isl_schedule_node_band_get_space (node);
- isl_multi_val *sizes = isl_multi_val_zero (space);
- long tile_size = PARAM_VALUE (PARAM_LOOP_BLOCK_TILE_SIZE);
- isl_ctx *ctx = isl_schedule_node_get_ctx (node);
-
- for (unsigned i = 0; i < dims; i++)
- {
- sizes = isl_multi_val_set_val (sizes, i,
- isl_val_int_from_si (ctx, tile_size));
- if (dump_file && dump_flags)
- fprintf (dump_file, "tiled by %ld\n", tile_size);
- }
-
- node = isl_schedule_node_band_tile (node, sizes);
- node = isl_schedule_node_child (node, 0);
-
- return node;
-}
-
-/* get_schedule_map_st - Improve the schedule by performing other loop
- optimizations. _st ending is for schedule tree version of this
- function (see get_schedule_map below for the band forest version).
-
- Do a depth-first post-order traversal of the nodes in a schedule
- tree and apply get_schedule_for_node_st on them to improve the schedule.
- */
-
-static __isl_give isl_union_map *
-get_schedule_map_st (__isl_keep isl_schedule *schedule)
+#ifndef HAVE_ISL_OPTIONS_SET_SCHEDULE_SERIALIZE_SCCS
+/* isl 0.14 */
+bool
+optimize_isl (scop_p scop ATTRIBUTE_UNUSED)
{
-
- schedule = isl_schedule_map_schedule_node_bottom_up (schedule,
- get_schedule_for_node_st,
- NULL);
- isl_union_map *schedule_map = isl_schedule_get_map (schedule);
- return schedule_map;
+ return false;
}
#else
-/* get_tile_map - Create a map that describes a n-dimensonal tiling.
-
- get_tile_map creates a map from a n-dimensional scattering space into an
- 2*n-dimensional scattering space. The map describes a rectangular tiling.
-
- Example:
- SCHEDULE_DIMENSIONS = 2, PARAMETER_DIMENSIONS = 1, TILE_SIZE = 32
-
- tile_map := [p0] -> {[s0, s1] -> [t0, t1, s0, s1]:
- t0 % 32 = 0 and t0 <= s0 < t0 + 32 and
- t1 % 32 = 0 and t1 <= s1 < t1 + 32}
-
- Before tiling:
-
- for (i = 0; i < N; i++)
- for (j = 0; j < M; j++)
- S(i,j)
-
- After tiling:
-
- for (t_i = 0; t_i < N; i+=32)
- for (t_j = 0; t_j < M; j+=32)
- for (i = t_i; i < min(t_i + 32, N); i++) | Unknown that N % 32 = 0
- for (j = t_j; j < t_j + 32; j++) | Known that M % 32 = 0
- S(i,j)
- */
-
-static isl_basic_map *
-get_tile_map (isl_ctx *ctx, int schedule_dimensions, int tile_size)
-{
- /* We construct
-
- tile_map := [p0] -> {[s0, s1] -> [t0, t1, p0, p1, a0, a1]:
- s0 = a0 * 32 and s0 = p0 and t0 <= p0 < t0 + 32 and
- s1 = a1 * 32 and s1 = p1 and t1 <= p1 < t1 + 32}
-
- and project out the auxilary dimensions a0 and a1. */
- isl_space *space
- = isl_space_alloc (ctx, 0, schedule_dimensions, schedule_dimensions * 3);
- isl_basic_map *tile_map = isl_basic_map_universe (isl_space_copy (space));
-
- isl_local_space *local_space = isl_local_space_from_space (space);
-
- for (int x = 0; x < schedule_dimensions; x++)
- {
- int sX = x;
- int tX = x;
- int pX = schedule_dimensions + x;
- int aX = 2 * schedule_dimensions + x;
-
- isl_constraint *c;
-
- /* sX = aX * tile_size; */
- c = isl_equality_alloc (isl_local_space_copy (local_space));
- isl_constraint_set_coefficient_si (c, isl_dim_out, sX, 1);
- isl_constraint_set_coefficient_si (c, isl_dim_out, aX, -tile_size);
- tile_map = isl_basic_map_add_constraint (tile_map, c);
-
- /* pX = sX; */
- c = isl_equality_alloc (isl_local_space_copy (local_space));
- isl_constraint_set_coefficient_si (c, isl_dim_out, pX, 1);
- isl_constraint_set_coefficient_si (c, isl_dim_in, sX, -1);
- tile_map = isl_basic_map_add_constraint (tile_map, c);
-
- /* tX <= pX */
- c = isl_inequality_alloc (isl_local_space_copy (local_space));
- isl_constraint_set_coefficient_si (c, isl_dim_out, pX, 1);
- isl_constraint_set_coefficient_si (c, isl_dim_out, tX, -1);
- tile_map = isl_basic_map_add_constraint (tile_map, c);
-
- /* pX <= tX + (tile_size - 1) */
- c = isl_inequality_alloc (isl_local_space_copy (local_space));
- isl_constraint_set_coefficient_si (c, isl_dim_out, tX, 1);
- isl_constraint_set_coefficient_si (c, isl_dim_out, pX, -1);
- isl_constraint_set_constant_si (c, tile_size - 1);
- tile_map = isl_basic_map_add_constraint (tile_map, c);
- }
-
- /* Project out auxiliary dimensions.
-
- The auxiliary dimensions are transformed into existentially quantified
- ones.
- This reduces the number of visible scattering dimensions and allows isl
- to produces better code. */
- tile_map =
- isl_basic_map_project_out (tile_map, isl_dim_out,
- 2 * schedule_dimensions, schedule_dimensions);
- isl_local_space_free (local_space);
- return tile_map;
-}
-
-/* get_schedule_for_band - Get the schedule for this BAND.
-
- Polly applies transformations like tiling on top of the isl calculated
- value.
- This can influence the number of scheduling dimension. The number of
- schedule dimensions is returned in DIMENSIONS. */
-
-static isl_union_map *
-get_schedule_for_band (isl_band *band, int *dimensions)
-{
- isl_union_map *partial_schedule;
- isl_ctx *ctx;
- isl_space *space;
- isl_basic_map *tile_map;
- isl_union_map *tile_umap;
-
- partial_schedule = isl_band_get_partial_schedule (band);
- *dimensions = isl_band_n_member (band);
-
- /* It does not make any sense to tile a band with just one dimension. */
- if (*dimensions == 1)
- {
- if (dump_file && dump_flags)
- fprintf (dump_file, "not tiled\n");
- return partial_schedule;
- }
-
- if (dump_file && dump_flags)
- fprintf (dump_file, "tiled by %d\n",
- PARAM_VALUE (PARAM_LOOP_BLOCK_TILE_SIZE));
-
- ctx = isl_union_map_get_ctx (partial_schedule);
- space = isl_union_map_get_space (partial_schedule);
-
- tile_map = get_tile_map (ctx, *dimensions,
- PARAM_VALUE (PARAM_LOOP_BLOCK_TILE_SIZE));
- tile_umap = isl_union_map_from_map (isl_map_from_basic_map (tile_map));
- tile_umap = isl_union_map_align_params (tile_umap, space);
- tile_umap = isl_union_map_coalesce (tile_umap);
- *dimensions = 2 * *dimensions;
-
- return isl_union_map_apply_range (partial_schedule, tile_umap);
-}
-
-
-/* get_schedule_for_band_list - Get the scheduling map for a list of bands.
-
- We walk recursively the forest of bands to combine the schedules of the
- individual bands to the overall schedule. In case tiling is requested,
- the individual bands are tiled. */
-
-static isl_union_map *
-get_schedule_for_band_list (isl_band_list *band_list)
-{
- int num_bands, i;
- isl_union_map *schedule;
- isl_ctx *ctx;
-
- ctx = isl_band_list_get_ctx (band_list);
- num_bands = isl_band_list_n_band (band_list);
- schedule = isl_union_map_empty (isl_space_params_alloc (ctx, 0));
-
- for (i = 0; i < num_bands; i++)
- {
- isl_band *band;
- isl_union_map *partial_schedule;
- int schedule_dimensions;
- isl_space *space;
-
- band = isl_band_list_get_band (band_list, i);
- partial_schedule = get_schedule_for_band (band, &schedule_dimensions);
- space = isl_union_map_get_space (partial_schedule);
-
- if (isl_band_has_children (band))
- {
- isl_band_list *children = isl_band_get_children (band);
- isl_union_map *suffixSchedule
- = get_schedule_for_band_list (children);
- partial_schedule
- = isl_union_map_flat_range_product (partial_schedule,
- suffixSchedule);
- isl_band_list_free (children);
- }
-
- schedule = isl_union_map_union (schedule, partial_schedule);
-
- isl_band_free (band);
- isl_space_free (space);
- }
-
- return isl_union_map_coalesce (schedule);
-}
-
-static isl_union_map *
-get_schedule_map (isl_schedule *schedule)
-{
- isl_band_list *band_list = isl_schedule_get_band_forest (schedule);
- isl_union_map *schedule_map = get_schedule_for_band_list (band_list);
- isl_band_list_free (bandList);
- return schedule_map;
-}
-#endif
-
-static isl_stat
-get_single_map (__isl_take isl_map *map, void *user)
-{
- isl_map **single_map = (isl_map **)user;
- *single_map = map;
- return isl_stat_ok;
-}
-
-static void
-apply_schedule_map_to_scop (scop_p scop, isl_union_map *schedule_map)
-{
- int i;
- poly_bb_p pbb;
-
- FOR_EACH_VEC_ELT (scop->pbbs, i, pbb)
- {
- isl_set *domain = isl_set_copy (pbb->domain);
- isl_map *stmt_schedule;
-
- isl_union_map *stmt_band
- = isl_union_map_intersect_domain (isl_union_map_copy (schedule_map),
- isl_union_set_from_set (domain));
- stmt_band = isl_union_map_coalesce (stmt_band);
- isl_union_map_foreach_map (stmt_band, get_single_map, &stmt_schedule);
- isl_map_free (pbb->transformed);
- pbb->transformed = isl_map_coalesce (stmt_schedule);
- isl_union_map_free (stmt_band);
- }
-}
-
static isl_union_set *
scop_get_domains (scop_p scop)
{
@@ -375,8 +87,6 @@ optimize_isl (scop_p scop)
isl_options_set_schedule_max_constant_term (scop->isl_context, CONSTANT_BOUND);
isl_options_set_schedule_maximize_band_depth (scop->isl_context, 1);
-#ifdef HAVE_ISL_OPTIONS_SET_SCHEDULE_SERIALIZE_SCCS
- /* isl 0.15 or later. */
isl_options_set_schedule_serialize_sccs (scop->isl_context, 0);
isl_options_set_schedule_maximize_band_depth (scop->isl_context, 1);
isl_options_set_schedule_max_constant_term (scop->isl_context, 20);
@@ -385,10 +95,9 @@ optimize_isl (scop_p scop)
isl_options_set_coalesce_bounded_wrapping (scop->isl_context, 1);
isl_options_set_ast_build_exploit_nested_bounds (scop->isl_context, 1);
isl_options_set_ast_build_atomic_upper_bound (scop->isl_context, 1);
-#else
- isl_options_set_schedule_fuse (scop->isl_context, ISL_SCHEDULE_FUSE_MIN);
-#endif
+ /* FIXME: the use of isl_union_set_compute_schedule is discouraged in isl
+ 0.15. Instead, we need the original schedule tree. */
isl_schedule *schedule
= isl_union_set_compute_schedule (domain, validity, proximity);
isl_options_set_on_error (scop->isl_context, ISL_ON_ERROR_ABORT);
@@ -408,17 +117,7 @@ optimize_isl (scop_p scop)
/* Attach the schedule to scop so that it can be used in code generation.
schedule freeing will occur in code generation. */
scop->schedule = schedule;
-
-#ifdef HAVE_ISL_OPTIONS_SET_SCHEDULE_SERIALIZE_SCCS
- /* isl 0.15 or later. */
- isl_union_map *schedule_map = get_schedule_map_st (schedule);
-#else
- isl_union_map *schedule_map = get_schedule_map (schedule);
-#endif
- apply_schedule_map_to_scop (scop, schedule_map);
-
- isl_union_map_free (schedule_map);
return true;
}
-
+#endif /* HAVE_ISL_OPTIONS_SET_SCHEDULE_SERIALIZE_SCCS */
#endif /* HAVE_isl */
diff --git a/gcc/graphite-poly.c b/gcc/graphite-poly.c
index d188341..ff451b8 100644
--- a/gcc/graphite-poly.c
+++ b/gcc/graphite-poly.c
@@ -91,21 +91,23 @@ debug_iteration_domains (scop_p scop)
bool
apply_poly_transforms (scop_p scop)
{
- bool transform_done = false;
+#ifdef HAVE_ISL_OPTIONS_SET_SCHEDULE_SERIALIZE_SCCS
+ /* isl 0.15 or later. */
+ if (flag_loop_nest_optimize)
+ return optimize_isl (scop);
+#else
+ /* Loop optimizations are not supported for deprecated isl version 0.14. */
+ if (flag_loop_nest_optimize)
+ return false;
+#endif
+
+ if (!flag_graphite_identity && !flag_loop_parallelize_all)
+ return false;
/* Generate code even if we did not apply any real transformation.
This also allows to check the performance for the identity
transformation: GIMPLE -> GRAPHITE -> GIMPLE. */
- if (flag_graphite_identity)
- transform_done = true;
-
- if (flag_loop_parallelize_all)
- transform_done = true;
-
- if (flag_loop_nest_optimize)
- transform_done |= optimize_isl (scop);
-
- return transform_done;
+ return true;
}
/* Create a new polyhedral data reference and add it to PBB. It is
--
1.9.1
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2015-12-18 17:42 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-12-18 17:42 [PATCH 1/4] [graphite] add more coalescing to simplify constraints Sebastian Pop
2015-12-18 17:42 ` [PATCH 2/4] [graphite] remove isl scheduler optimizations for deprecated isl 0.14 Sebastian Pop
2015-12-18 17:42 ` [PATCH 4/4] [graphite] add missing ast node for isl 0.15 Sebastian Pop
2015-12-18 17:42 ` [PATCH 3/4] [graphite] add tiling on schedule trees Sebastian Pop
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).