diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 95e96561c2d..d0d4d677347 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2015-12-16 Abderrazek Zaafrani + + * graphite-isl-ast-to-gimple.c: Include isl/schedule_node.h. + (set_separate_option): New. + (translate_isl_ast_to_gimple::set_options_for_schedule_tree): New. + (translate_isl_ast_to_gimple::scop_to_isl_ast): Use scop->schedule. + * graphite-optimize-isl.c (optimize_isl): Set scop->schedule, do not + free the computed schedule tree. + * graphite-poly.c (new_scop): Initialize scop->schedule. + * graphite.h: Include isl/schedule.h. + (struct scop): Add field schedule. + 2015-12-16 Nathan Sidwell * ipa-visibility.c (can_replace_by_local_alias): Make static, diff --git a/gcc/graphite-isl-ast-to-gimple.c b/gcc/graphite-isl-ast-to-gimple.c index b392766a27f..0043bf44f34 100644 --- a/gcc/graphite-isl-ast-to-gimple.c +++ b/gcc/graphite-isl-ast-to-gimple.c @@ -61,6 +61,9 @@ along with GCC; see the file COPYING3. If not see #include #include #include +#ifdef HAVE_ISL_OPTIONS_SET_SCHEDULE_SERIALIZE_SCCS +#include +#endif #include "graphite.h" @@ -125,6 +128,29 @@ void ivs_params_clear (ivs_params &ip) } } +#ifdef HAVE_ISL_OPTIONS_SET_SCHEDULE_SERIALIZE_SCCS + +/* Set the "separate" option for the schedule node. */ + +static __isl_give isl_schedule_node * +set_separate_option (__isl_take isl_schedule_node *node, void *user) +{ + if (user) + return node; + + if (isl_schedule_node_get_type (node) != isl_schedule_node_band) + return node; + + /* Set the "separate" option unless it is set earlier to another option. */ + if (isl_schedule_node_band_member_get_ast_loop_type (node, 0) + == isl_ast_loop_default) + return isl_schedule_node_band_member_set_ast_loop_type + (node, 0, isl_ast_loop_separate); + + return node; +} +#endif + class translate_isl_ast_to_gimple { public: @@ -290,6 +316,14 @@ 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. */ @@ -3163,6 +3197,19 @@ 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. */ @@ -3187,6 +3234,7 @@ 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 @@ -3204,8 +3252,21 @@ 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); } - isl_ast_node *ast_isl = isl_ast_build_ast_from_schedule (context_isl, - schedule_isl); + +#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_build_free (context_isl); return ast_isl; } diff --git a/gcc/graphite-optimize-isl.c b/gcc/graphite-optimize-isl.c index f5cb5c45dcc..1d9449b5ca9 100644 --- a/gcc/graphite-optimize-isl.c +++ b/gcc/graphite-optimize-isl.c @@ -420,6 +420,10 @@ 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; + #ifdef HAVE_ISL_OPTIONS_SET_SCHEDULE_SERIALIZE_SCCS /* isl 0.15 or later. */ isl_union_map *schedule_map = get_schedule_map_st (schedule); @@ -428,7 +432,6 @@ optimize_isl (scop_p scop) #endif apply_schedule_map_to_scop (scop, schedule_map); - isl_schedule_free (schedule); isl_union_map_free (schedule_map); return true; } diff --git a/gcc/graphite-poly.c b/gcc/graphite-poly.c index 00d674cd7c9..1f50ff8c6c7 100644 --- a/gcc/graphite-poly.c +++ b/gcc/graphite-poly.c @@ -295,9 +295,9 @@ scop_p new_scop (edge entry, edge exit) { sese_info_p region = new_sese_info (entry, exit); - scop_p s; - s = XNEW (struct scop); + scop_p s = XNEW (struct scop); + s->schedule = NULL; s->param_context = NULL; scop_set_region (s, region); s->pbbs.create (3); diff --git a/gcc/graphite.h b/gcc/graphite.h index ba91dfa4d25..929c399d593 100644 --- a/gcc/graphite.h +++ b/gcc/graphite.h @@ -23,6 +23,7 @@ along with GCC; see the file COPYING3. If not see #define GCC_GRAPHITE_POLY_H #include "sese.h" +#include #ifndef HAVE_ISL_OPTIONS_SET_SCHEDULE_SERIALIZE_SCCS /* isl 0.14. */ @@ -411,6 +412,9 @@ struct scop /* The context used internally by ISL. */ isl_ctx *isl_context; + /* SCoP final schedule. */ + isl_schedule *schedule; + /* The data dependence relation among the data references in this scop. */ isl_union_map *dependence; };