Commit 9625f2a2 by Abderrazek Zaafrani Committed by Sebastian Pop

attach schedule tree to the scop

we used to translate the just computed schedule tree into a union_map,
and then in the code generation it would be translated back to a schedule tree
just before generating AST code.

From-SVN: r231725
parent 6cb6583c
2015-12-16 Abderrazek Zaafrani <a.zaafrani@samsung.com>
* 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 <nathan@acm.org> 2015-12-16 Nathan Sidwell <nathan@acm.org>
* ipa-visibility.c (can_replace_by_local_alias): Make static, * ipa-visibility.c (can_replace_by_local_alias): Make static,
...@@ -61,6 +61,9 @@ along with GCC; see the file COPYING3. If not see ...@@ -61,6 +61,9 @@ along with GCC; see the file COPYING3. If not see
#include <isl/union_map.h> #include <isl/union_map.h>
#include <isl/ast_build.h> #include <isl/ast_build.h>
#include <isl/val_gmp.h> #include <isl/val_gmp.h>
#ifdef HAVE_ISL_OPTIONS_SET_SCHEDULE_SERIALIZE_SCCS
#include <isl/schedule_node.h>
#endif
#include "graphite.h" #include "graphite.h"
...@@ -125,6 +128,29 @@ void ivs_params_clear (ivs_params &ip) ...@@ -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 class translate_isl_ast_to_gimple
{ {
public: public:
...@@ -290,6 +316,14 @@ class translate_isl_ast_to_gimple ...@@ -290,6 +316,14 @@ class translate_isl_ast_to_gimple
__isl_give isl_union_map *generate_isl_schedule (scop_p scop); __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. /* Set the separate option for all dimensions.
This helps to reduce control overhead. */ This helps to reduce control overhead. */
...@@ -3163,6 +3197,19 @@ ast_build_before_for (__isl_keep isl_ast_build *build, void *user) ...@@ -3163,6 +3197,19 @@ ast_build_before_for (__isl_keep isl_ast_build *build, void *user)
return id; 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. /* Set the separate option for all dimensions.
This helps to reduce control overhead. */ This helps to reduce control overhead. */
...@@ -3187,6 +3234,7 @@ translate_isl_ast_to_gimple::set_options (__isl_take isl_ast_build *control, ...@@ -3187,6 +3234,7 @@ translate_isl_ast_to_gimple::set_options (__isl_take isl_ast_build *control,
__isl_give isl_ast_node * __isl_give isl_ast_node *
translate_isl_ast_to_gimple::scop_to_isl_ast (scop_p scop, ivs_params &ip) 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 /* Generate loop upper bounds that consist of the current loop iterator, an
operator (< or <=) and an expression not involving the iterator. If this operator (< or <=) and an expression not involving the iterator. If this
option is not set, then the current loop iterator may appear several times 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) ...@@ -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, isl_ast_build_set_before_each_for (context_isl, ast_build_before_for,
dependence); 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); isl_ast_build_free (context_isl);
return ast_isl; return ast_isl;
} }
......
...@@ -420,6 +420,10 @@ optimize_isl (scop_p scop) ...@@ -420,6 +420,10 @@ optimize_isl (scop_p scop)
return false; 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 #ifdef HAVE_ISL_OPTIONS_SET_SCHEDULE_SERIALIZE_SCCS
/* isl 0.15 or later. */ /* isl 0.15 or later. */
isl_union_map *schedule_map = get_schedule_map_st (schedule); isl_union_map *schedule_map = get_schedule_map_st (schedule);
...@@ -428,7 +432,6 @@ optimize_isl (scop_p scop) ...@@ -428,7 +432,6 @@ optimize_isl (scop_p scop)
#endif #endif
apply_schedule_map_to_scop (scop, schedule_map); apply_schedule_map_to_scop (scop, schedule_map);
isl_schedule_free (schedule);
isl_union_map_free (schedule_map); isl_union_map_free (schedule_map);
return true; return true;
} }
......
...@@ -295,9 +295,9 @@ scop_p ...@@ -295,9 +295,9 @@ scop_p
new_scop (edge entry, edge exit) new_scop (edge entry, edge exit)
{ {
sese_info_p region = new_sese_info (entry, exit); sese_info_p region = new_sese_info (entry, exit);
scop_p s; scop_p s = XNEW (struct scop);
s = XNEW (struct scop);
s->schedule = NULL;
s->param_context = NULL; s->param_context = NULL;
scop_set_region (s, region); scop_set_region (s, region);
s->pbbs.create (3); s->pbbs.create (3);
......
...@@ -23,6 +23,7 @@ along with GCC; see the file COPYING3. If not see ...@@ -23,6 +23,7 @@ along with GCC; see the file COPYING3. If not see
#define GCC_GRAPHITE_POLY_H #define GCC_GRAPHITE_POLY_H
#include "sese.h" #include "sese.h"
#include <isl/schedule.h>
#ifndef HAVE_ISL_OPTIONS_SET_SCHEDULE_SERIALIZE_SCCS #ifndef HAVE_ISL_OPTIONS_SET_SCHEDULE_SERIALIZE_SCCS
/* isl 0.14. */ /* isl 0.14. */
...@@ -411,6 +412,9 @@ struct scop ...@@ -411,6 +412,9 @@ struct scop
/* The context used internally by ISL. */ /* The context used internally by ISL. */
isl_ctx *isl_context; isl_ctx *isl_context;
/* SCoP final schedule. */
isl_schedule *schedule;
/* The data dependence relation among the data references in this scop. */ /* The data dependence relation among the data references in this scop. */
isl_union_map *dependence; isl_union_map *dependence;
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment