diff options
author | Richard Biener <rguenther@suse.de> | 2017-02-13 08:54:02 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2017-02-13 08:54:02 +0000 |
commit | f877b3adba2d9442752721d87c96f93beccd4c40 (patch) | |
tree | 4a2ee5ee6c3f117960b3f1a517bbaa4fb3747ef6 /gcc/graphite-optimize-isl.c | |
parent | c0d46793e8e05b2e68395512383f688eeea8dae2 (diff) |
isl.m4: Remove support for ISL 0.14.
2017-02-13 Richard Biener <rguenther@suse.de>
config/
* isl.m4: Remove support for ISL 0.14.
* configure: Re-generate.
gcc/
* configure.ac (HAVE_ISL_OPTIONS_SET_SCHEDULE_SERIALIZE_SCCS):
Remove.
* configure: Re-generate.
* config.in: Likewise.
* graphite-dependences.c: Simplify as if
HAVE_ISL_OPTIONS_SET_SCHEDULE_SERIALIZE_SCCS was defined.
* graphite-isl-ast-to-gimple.c: Likewise.
* graphite-optimize-isl.c: Likewise.
* graphite-poly.c: Likewise.
* graphite-sese-to-poly.c: Likewise.
* graphite.h: Likewise.
* toplev.c: Include isl/version.h and use isl_version () for
printing the ISL version.
* doc/install.texi: Update ISL requirement.
From-SVN: r245382
Diffstat (limited to 'gcc/graphite-optimize-isl.c')
-rw-r--r-- | gcc/graphite-optimize-isl.c | 320 |
1 files changed, 0 insertions, 320 deletions
diff --git a/gcc/graphite-optimize-isl.c b/gcc/graphite-optimize-isl.c index 5e7943c1a99..467503e1b62 100644 --- a/gcc/graphite-optimize-isl.c +++ b/gcc/graphite-optimize-isl.c @@ -39,8 +39,6 @@ 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. */ @@ -206,322 +204,4 @@ apply_poly_transforms (scop_p scop) return true; } -#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 (band_list); - return schedule_map; -} - -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) -{ - int i; - poly_bb_p pbb; - isl_space *space = isl_set_get_space (scop->param_context); - isl_union_set *res = isl_union_set_empty (space); - - FOR_EACH_VEC_ELT (scop->pbbs, i, pbb) - res = isl_union_set_add_set (res, isl_set_copy (pbb->domain)); - - return res; -} - -/* Compute the schedule for SCOP based on its parameters, domain and set of - constraints. Then apply the schedule to SCOP. */ - -static bool -optimize_isl (scop_p scop) -{ - int old_max_operations = isl_ctx_get_max_operations (scop->isl_context); - int max_operations = PARAM_VALUE (PARAM_MAX_ISL_OPERATIONS); - if (max_operations) - isl_ctx_set_max_operations (scop->isl_context, max_operations); - isl_options_set_on_error (scop->isl_context, ISL_ON_ERROR_CONTINUE); - - isl_union_set *domain = scop_get_domains (scop); - scop_get_dependences (scop); - scop->dependence - = isl_union_map_gist_domain (scop->dependence, isl_union_set_copy (domain)); - scop->dependence - = isl_union_map_gist_range (scop->dependence, isl_union_set_copy (domain)); - isl_union_map *validity = isl_union_map_copy (scop->dependence); - isl_union_map *proximity = isl_union_map_copy (validity); - - isl_options_set_schedule_fuse (scop->isl_context, ISL_SCHEDULE_FUSE_MIN); - isl_schedule *schedule - = isl_union_set_compute_schedule (domain, validity, proximity); - - isl_options_set_on_error (scop->isl_context, ISL_ON_ERROR_ABORT); - - isl_ctx_reset_operations (scop->isl_context); - isl_ctx_set_max_operations (scop->isl_context, old_max_operations); - if (!schedule || isl_ctx_last_error (scop->isl_context) == isl_error_quota) - { - if (dump_file && dump_flags) - { - if (!schedule) - fprintf (dump_file, "isl did not return any schedule.\n"); - else - fprintf (dump_file, "isl timed out --param max-isl-operations=%d\n", - max_operations); - } - - if (schedule) - isl_schedule_free (schedule); - return false; - } - - scop->schedule = schedule; - - isl_union_map *schedule_map = get_schedule_map (schedule); - apply_schedule_map_to_scop (scop, schedule_map); - isl_union_map_free (schedule_map); - - if (dump_file) - { - fprintf (dump_file, "isl end schedule:\n"); - print_isl_schedule (dump_file, scop->schedule); - } - - return true; -} - -/* Apply graphite transformations to all the basic blocks of SCOP. */ - -bool -apply_poly_transforms (scop_p scop) -{ - if (flag_loop_nest_optimize) - return optimize_isl (scop); - - 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. */ - return true; -} - -#endif /* HAVE_ISL_OPTIONS_SET_SCHEDULE_SERIALIZE_SCCS */ - #endif /* HAVE_isl */ |