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
This commit is contained in:
Abderrazek Zaafrani 2015-12-16 23:40:06 +00:00 committed by Sebastian Pop
parent 6cb6583c5f
commit 9625f2a27c
5 changed files with 85 additions and 5 deletions

View file

@ -1,3 +1,15 @@
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>
* ipa-visibility.c (can_replace_by_local_alias): Make static,

View file

@ -61,6 +61,9 @@ along with GCC; see the file COPYING3. If not see
#include <isl/union_map.h>
#include <isl/ast_build.h>
#include <isl/val_gmp.h>
#ifdef HAVE_ISL_OPTIONS_SET_SCHEDULE_SERIALIZE_SCCS
#include <isl/schedule_node.h>
#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;
}

View file

@ -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;
}

View file

@ -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);

View file

@ -23,6 +23,7 @@ along with GCC; see the file COPYING3. If not see
#define GCC_GRAPHITE_POLY_H
#include "sese.h"
#include <isl/schedule.h>
#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;
};