From: Sebastian Pop Date: Thu, 27 Aug 2015 19:07:04 +0000 (+0000) Subject: remove -floop-* flags X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=d6bb5ccfebfc29ea2a583fa3fb0d0ffd48e0e226;p=gcc.git remove -floop-* flags 2015-08-27 Sebastian Pop * Makefile.in (OBJS): Remove graphite-blocking.o and graphite-interchange.o. * common.opt (floop-strip-mine, floop-interchange, floop-block): Alias of floop-nest-optimize. * doc/invoke.texi (floop-strip-mine, floop-interchange, floop-block): Document as alias of -floop-nest-optimize. * graphite-blocking.c: Remove. * graphite-interchange.c: Remove. * graphite-optimize-isl.c: Include dumpfile.h. (getScheduleForBand): Add dump for tiled loops. Use PARAM_LOOP_BLOCK_TILE_SIZE instead of hard coded constant. * graphite-poly.c (scop_max_loop_depth): Remove. (print_scattering_function_1): Remove. (print_scattering_function): Remove. (print_scattering_functions): Remove. (debug_scattering_function): Remove. (debug_scattering_functions): Remove. (apply_poly_transforms): Remove use of flag_loop_block, flag_loop_strip_mine, and flag_loop_interchange. (new_poly_bb): Remove use of PBB_TRANSFORMED, PBB_SAVED, and PBB_ORIGINAL. (print_pdr_access_layout): Remove. (print_pdr): Print ISL representation. (new_scop): Remove use of SCOP_ORIGINAL_SCHEDULE, SCOP_TRANSFORMED_SCHEDULE, and SCOP_SAVED_SCHEDULE. (free_scop): Same. (openscop_print_pbb_domain): Remove. (print_pbb): Remove call to print_scattering_function. (openscop_print_scop_context): Remove. (print_scop_context): Do not print matrices anymore. (print_scop): Do not print SCOP_ORIGINAL_SCHEDULE and SCOP_TRANSFORMED_SCHEDULE. (print_isl_set): Add printing of a new line. (print_isl_map): Same. (print_isl_aff): Same. (print_isl_constraint): Same. (loop_to_lst): Remove. (scop_to_lst): Remove. (lst_indent_to): Remove. (print_lst): Remove. (debug_lst): Remove. (dot_lst_1): Remove. (dot_lst): Remove. (reverse_loop_at_level): Remove. (reverse_loop_for_pbbs): Remove. * graphite-poly.h (pdr_dim_iter_domain): Remove. (pdr_nb_params): Remove. (pdr_alias_set_dim): Remove. (pdr_subscript_dim): Remove. (pdr_iterator_dim): Remove. (pdr_parameter_dim): Remove. (same_pdr_p): Remove. (struct poly_scattering): Remove. (struct poly_bb): Remove _original, _transformed, _saved. (PBB_DOMAIN, PBB_ORIGINAL, PBB_ORIGINAL_SCATTERING): Remove. (PBB_TRANSFORMED, PBB_TRANSFORMED_SCATTERING, PBB_SAVED): Remove. (PBB_NB_LOCAL_VARIABLES): Remove. (PBB_NB_SCATTERING_TRANSFORM): Remove. (schedule_to_scattering): Remove. (number_of_write_pdrs): Remove. (pbb_dim_iter_domain): Remove. (pbb_nb_params): Remove. (pbb_nb_scattering_orig): Remove. (pbb_nb_scattering_transform): Remove. (pbb_nb_dynamic_scattering_transform): Remove. (pbb_nb_local_vars): Remove. (pbb_iterator_dim): Remove. (pbb_parameter_dim): Remove. (psco_scattering_dim): Remove. (psct_scattering_dim): Remove. (psct_local_var_dim): Remove. (psco_iterator_dim): Remove. (psct_iterator_dim): Remove. (psco_parameter_dim): Remove. (psct_parameter_dim): Remove. (psct_dynamic_dim): Remove. (psct_static_dim): Remove. (psct_add_local_variable): Remove. (new_lst_loop): Remove. (new_lst_stmt): Remove. (free_lst): Remove. (copy_lst): Remove. (lst_add_loop_under_loop): Remove. (lst_depth): Remove. (lst_dewey_number): Remove. (lst_dewey_number_at_depth): Remove. (lst_pred): Remove. (lst_succ): Remove. (lst_find_pbb): Remove. (find_lst_loop): Remove. (lst_find_first_pbb): Remove. (lst_empty_p): Remove. (lst_find_last_pbb): Remove. (lst_contains_p): Remove. (lst_contains_pbb): Remove. (lst_create_nest): Remove. (lst_remove_from_sequence): Remove. (lst_remove_loop_and_inline_stmts_in_loop_father): Remove. (lst_niter_for_loop): Remove. (pbb_update_scattering): Remove. (lst_update_scattering_under): Remove. (lst_update_scattering): Remove. (lst_insert_in_sequence): Remove. (lst_replace): Remove. (lst_substitute_3): Remove. (lst_distribute_lst): Remove. (lst_remove_all_before_including_pbb): Remove. (lst_remove_all_before_excluding_pbb): Remove. (struct scop): Remove original_schedule, transformed_schedule, and saved_schedule. (SCOP_ORIGINAL_SCHEDULE, SCOP_TRANSFORMED_SCHEDULE): Remove. (SCOP_SAVED_SCHEDULE): Remove. (poly_scattering_new): Remove. (poly_scattering_free): Remove. (poly_scattering_copy): Remove. (store_scattering_pbb): Remove. (store_lst_schedule): Remove. (restore_lst_schedule): Remove. (store_scattering): Remove. (restore_scattering_pbb): Remove. (restore_scattering): Remove. * graphite-sese-to-poly.c (build_pbb_scattering_polyhedrons): Remove scattering_dimensions. Do not use pbb_dim_iter_domain: compute the scattering polyhedron dimension from the dimension of pbb->domain. (build_scop_scattering): Update call to build_pbb_scattering_polyhedrons. (build_poly_scop): Remove call to scop_to_lst. * graphite.c (graphite_transform_loops): Add call to print_scop. (gate_graphite_transforms): Remove use of flag_loop_block, flag_loop_interchange, and flag_loop_strip_mine. testsuite/ * gcc.dg/graphite/graphite.exp (interchange_files, block_files): Replaced by opt_files, compile with -floop-nest-optimize. * g++.dg/graphite/graphite.exp: Same. * gfortran.dg/graphite/graphite.exp: Same. * gcc.dg/graphite/block-0.c: Adjust pattern. * gcc.dg/graphite/block-1.c: Same. * gcc.dg/graphite/block-3.c: Same. * gcc.dg/graphite/block-4.c: Same. * gcc.dg/graphite/block-5.c: Same. * gcc.dg/graphite/block-6.c: Same. * gcc.dg/graphite/block-7.c: Same. * gcc.dg/graphite/block-8.c: Same. * gcc.dg/graphite/block-pr47654.c: Same. * gcc.dg/graphite/interchange-0.c: Same. * gcc.dg/graphite/interchange-1.c: Same. * gcc.dg/graphite/interchange-10.c: Same. * gcc.dg/graphite/interchange-11.c: Same. * gcc.dg/graphite/interchange-12.c: Same. * gcc.dg/graphite/interchange-13.c: Same. * gcc.dg/graphite/interchange-14.c: Same. * gcc.dg/graphite/interchange-15.c: Same. * gcc.dg/graphite/interchange-3.c: Same. * gcc.dg/graphite/interchange-4.c: Same. * gcc.dg/graphite/interchange-5.c: Same. * gcc.dg/graphite/interchange-6.c: Same. * gcc.dg/graphite/interchange-7.c: Same. * gcc.dg/graphite/interchange-8.c: Same. * gcc.dg/graphite/interchange-9.c: Same. * gcc.dg/graphite/interchange-mvt.c: Same. * gcc.dg/graphite/pr37485.c: Same. * gcc.dg/graphite/uns-block-1.c: Same. * gcc.dg/graphite/uns-interchange-12.c: Same. * gcc.dg/graphite/uns-interchange-14.c: Same. * gcc.dg/graphite/uns-interchange-15.c: Same. * gcc.dg/graphite/uns-interchange-9.c: Same. * gcc.dg/graphite/uns-interchange-mvt.c: Same. * gfortran.dg/graphite/interchange-3.f90: Same. From-SVN: r227277 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e776c16d5b7..189234a3a34 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,137 @@ +2015-08-27 Sebastian Pop + + * Makefile.in (OBJS): Remove graphite-blocking.o and + graphite-interchange.o. + * common.opt (floop-strip-mine, floop-interchange, floop-block): + Alias of floop-nest-optimize. + * doc/invoke.texi (floop-strip-mine, floop-interchange, floop-block): + Document as alias of -floop-nest-optimize. + * graphite-blocking.c: Remove. + * graphite-interchange.c: Remove. + * graphite-optimize-isl.c: Include dumpfile.h. + (getScheduleForBand): Add dump for tiled loops. Use + PARAM_LOOP_BLOCK_TILE_SIZE instead of hard coded constant. + * graphite-poly.c (scop_max_loop_depth): Remove. + (print_scattering_function_1): Remove. + (print_scattering_function): Remove. + (print_scattering_functions): Remove. + (debug_scattering_function): Remove. + (debug_scattering_functions): Remove. + (apply_poly_transforms): Remove use of flag_loop_block, + flag_loop_strip_mine, and flag_loop_interchange. + (new_poly_bb): Remove use of PBB_TRANSFORMED, PBB_SAVED, and + PBB_ORIGINAL. + (print_pdr_access_layout): Remove. + (print_pdr): Print ISL representation. + (new_scop): Remove use of SCOP_ORIGINAL_SCHEDULE, + SCOP_TRANSFORMED_SCHEDULE, and SCOP_SAVED_SCHEDULE. + (free_scop): Same. + (openscop_print_pbb_domain): Remove. + (print_pbb): Remove call to print_scattering_function. + (openscop_print_scop_context): Remove. + (print_scop_context): Do not print matrices anymore. + (print_scop): Do not print SCOP_ORIGINAL_SCHEDULE and + SCOP_TRANSFORMED_SCHEDULE. + (print_isl_set): Add printing of a new line. + (print_isl_map): Same. + (print_isl_aff): Same. + (print_isl_constraint): Same. + (loop_to_lst): Remove. + (scop_to_lst): Remove. + (lst_indent_to): Remove. + (print_lst): Remove. + (debug_lst): Remove. + (dot_lst_1): Remove. + (dot_lst): Remove. + (reverse_loop_at_level): Remove. + (reverse_loop_for_pbbs): Remove. + * graphite-poly.h (pdr_dim_iter_domain): Remove. + (pdr_nb_params): Remove. + (pdr_alias_set_dim): Remove. + (pdr_subscript_dim): Remove. + (pdr_iterator_dim): Remove. + (pdr_parameter_dim): Remove. + (same_pdr_p): Remove. + (struct poly_scattering): Remove. + (struct poly_bb): Remove _original, _transformed, _saved. + (PBB_DOMAIN, PBB_ORIGINAL, PBB_ORIGINAL_SCATTERING): Remove. + (PBB_TRANSFORMED, PBB_TRANSFORMED_SCATTERING, PBB_SAVED): Remove. + (PBB_NB_LOCAL_VARIABLES): Remove. + (PBB_NB_SCATTERING_TRANSFORM): Remove. + (schedule_to_scattering): Remove. + (number_of_write_pdrs): Remove. + (pbb_dim_iter_domain): Remove. + (pbb_nb_params): Remove. + (pbb_nb_scattering_orig): Remove. + (pbb_nb_scattering_transform): Remove. + (pbb_nb_dynamic_scattering_transform): Remove. + (pbb_nb_local_vars): Remove. + (pbb_iterator_dim): Remove. + (pbb_parameter_dim): Remove. + (psco_scattering_dim): Remove. + (psct_scattering_dim): Remove. + (psct_local_var_dim): Remove. + (psco_iterator_dim): Remove. + (psct_iterator_dim): Remove. + (psco_parameter_dim): Remove. + (psct_parameter_dim): Remove. + (psct_dynamic_dim): Remove. + (psct_static_dim): Remove. + (psct_add_local_variable): Remove. + (new_lst_loop): Remove. + (new_lst_stmt): Remove. + (free_lst): Remove. + (copy_lst): Remove. + (lst_add_loop_under_loop): Remove. + (lst_depth): Remove. + (lst_dewey_number): Remove. + (lst_dewey_number_at_depth): Remove. + (lst_pred): Remove. + (lst_succ): Remove. + (lst_find_pbb): Remove. + (find_lst_loop): Remove. + (lst_find_first_pbb): Remove. + (lst_empty_p): Remove. + (lst_find_last_pbb): Remove. + (lst_contains_p): Remove. + (lst_contains_pbb): Remove. + (lst_create_nest): Remove. + (lst_remove_from_sequence): Remove. + (lst_remove_loop_and_inline_stmts_in_loop_father): Remove. + (lst_niter_for_loop): Remove. + (pbb_update_scattering): Remove. + (lst_update_scattering_under): Remove. + (lst_update_scattering): Remove. + (lst_insert_in_sequence): Remove. + (lst_replace): Remove. + (lst_substitute_3): Remove. + (lst_distribute_lst): Remove. + (lst_remove_all_before_including_pbb): Remove. + (lst_remove_all_before_excluding_pbb): Remove. + (struct scop): Remove original_schedule, transformed_schedule, and + saved_schedule. + (SCOP_ORIGINAL_SCHEDULE, SCOP_TRANSFORMED_SCHEDULE): Remove. + (SCOP_SAVED_SCHEDULE): Remove. + (poly_scattering_new): Remove. + (poly_scattering_free): Remove. + (poly_scattering_copy): Remove. + (store_scattering_pbb): Remove. + (store_lst_schedule): Remove. + (restore_lst_schedule): Remove. + (store_scattering): Remove. + (restore_scattering_pbb): Remove. + (restore_scattering): Remove. + * graphite-sese-to-poly.c (build_pbb_scattering_polyhedrons): + Remove scattering_dimensions. Do not use pbb_dim_iter_domain: + compute the scattering polyhedron dimension from the dimension of + pbb->domain. + (build_scop_scattering): Update call to + build_pbb_scattering_polyhedrons. + (build_poly_scop): Remove call to scop_to_lst. + * graphite.c (graphite_transform_loops): Add call to print_scop. + (gate_graphite_transforms): Remove use of flag_loop_block, + flag_loop_interchange, and flag_loop_strip_mine. + 2015-08-27 Sebastian Pop * common.opt (floop-unroll-and-jam): Make alias of floop-nest-optimize. diff --git a/gcc/Makefile.in b/gcc/Makefile.in index e298eccb682..3d1c1e5aba3 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -1277,10 +1277,8 @@ OBJS = \ graph.o \ graphds.o \ graphite.o \ - graphite-blocking.o \ graphite-isl-ast-to-gimple.o \ graphite-dependences.o \ - graphite-interchange.o \ graphite-optimize-isl.o \ graphite-poly.o \ graphite-scop-detection.o \ diff --git a/gcc/common.opt b/gcc/common.opt index 0964ae4fdae..94d1d884833 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -1341,16 +1341,16 @@ Common Report Var(flag_loop_parallelize_all) Optimization Mark all loops as parallel floop-strip-mine -Common Report Var(flag_loop_strip_mine) Optimization -Enable Loop Strip Mining transformation +Common Alias(floop-nest-optimize) +Enable loop nest transforms. Same as -floop-nest-optimize floop-interchange -Common Report Var(flag_loop_interchange) Optimization -Enable Loop Interchange transformation +Common Alias(floop-nest-optimize) +Enable loop nest transforms. Same as -floop-nest-optimize floop-block -Common Report Var(flag_loop_block) Optimization -Enable Loop Blocking transformation +Common Alias(floop-nest-optimize) +Enable loop nest transforms. Same as -floop-nest-optimize floop-unroll-and-jam Common Alias(floop-nest-optimize) @@ -2315,8 +2315,8 @@ Common Report Var(flag_tree_loop_im) Init(1) Optimization Enable loop invariant motion on trees ftree-loop-linear -Common Alias(floop-interchange) -Enable loop interchange transforms. Same as -floop-interchange +Common Alias(floop-nest-optimize) +Enable loop nest transforms. Same as -floop-nest-optimize ftree-loop-ivcanon Common Report Var(flag_tree_loop_ivcanon) Init(1) Optimization diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 01423bb1e3d..c0ec0fde639 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -8734,102 +8734,19 @@ Perform loop optimizations on trees. This flag is enabled by default at @option{-O} and higher. @item -ftree-loop-linear +@itemx -floop-interchange +@itemx -floop-strip-mine +@itemx -floop-block +@itemx -floop-unroll-and-jam @opindex ftree-loop-linear -Perform loop interchange transformations on tree. Same as -@option{-floop-interchange}. To use this code transformation, GCC has -to be configured with @option{--with-isl} to enable the Graphite loop -transformation infrastructure. - -@item -floop-interchange @opindex floop-interchange -Perform loop interchange transformations on loops. Interchanging two -nested loops switches the inner and outer loops. For example, given a -loop like: -@smallexample -DO J = 1, M - DO I = 1, N - A(J, I) = A(J, I) * C - ENDDO -ENDDO -@end smallexample -@noindent -loop interchange transforms the loop as if it were written: -@smallexample -DO I = 1, N - DO J = 1, M - A(J, I) = A(J, I) * C - ENDDO -ENDDO -@end smallexample -which can be beneficial when @code{N} is larger than the caches, -because in Fortran, the elements of an array are stored in memory -contiguously by column, and the original loop iterates over rows, -potentially creating at each access a cache miss. This optimization -applies to all the languages supported by GCC and is not limited to -Fortran. To use this code transformation, GCC has to be configured -with @option{--with-isl} to enable the Graphite loop transformation -infrastructure. - -@item -floop-strip-mine @opindex floop-strip-mine -Perform loop strip mining transformations on loops. Strip mining -splits a loop into two nested loops. The outer loop has strides -equal to the strip size and the inner loop has strides of the -original loop within a strip. The strip length can be changed -using the @option{loop-block-tile-size} parameter. For example, -given a loop like: -@smallexample -DO I = 1, N - A(I) = A(I) + C -ENDDO -@end smallexample -@noindent -loop strip mining transforms the loop as if it were written: -@smallexample -DO II = 1, N, 51 - DO I = II, min (II + 50, N) - A(I) = A(I) + C - ENDDO -ENDDO -@end smallexample -This optimization applies to all the languages supported by GCC and is -not limited to Fortran. To use this code transformation, GCC has to -be configured with @option{--with-isl} to enable the Graphite loop -transformation infrastructure. - -@item -floop-block @opindex floop-block -Perform loop blocking transformations on loops. Blocking strip mines -each loop in the loop nest such that the memory accesses of the -element loops fit inside caches. The strip length can be changed -using the @option{loop-block-tile-size} parameter. For example, given -a loop like: -@smallexample -DO I = 1, N - DO J = 1, M - A(J, I) = B(I) + C(J) - ENDDO -ENDDO -@end smallexample -@noindent -loop blocking transforms the loop as if it were written: -@smallexample -DO II = 1, N, 51 - DO JJ = 1, M, 51 - DO I = II, min (II + 50, N) - DO J = JJ, min (JJ + 50, M) - A(J, I) = B(I) + C(J) - ENDDO - ENDDO - ENDDO -ENDDO -@end smallexample -which can be beneficial when @code{M} is larger than the caches, -because the innermost loop iterates over a smaller amount of data -which can be kept in the caches. This optimization applies to all the -languages supported by GCC and is not limited to Fortran. To use this -code transformation, GCC has to be configured with @option{--with-isl} -to enable the Graphite loop transformation infrastructure. +@opindex floop-unroll-and-jam +Perform loop nest optimizations. Same as +@option{-floop-nest-optimize}. To use this code transformation, GCC has +to be configured with @option{--with-isl} to enable the Graphite loop +transformation infrastructure. @item -fgraphite-identity @opindex fgraphite-identity @@ -8847,13 +8764,6 @@ optimizer based on the Pluto optimization algorithms. It calculates a loop structure optimized for data-locality and parallelism. This option is experimental. -@item -floop-unroll-and-jam -@opindex floop-unroll-and-jam -Perform loop nest transformations. Same as -@option{-floop-nest-optimize}. To use this code transformation, GCC has -to be configured with @option{--with-isl} to enable the Graphite loop -transformation infrastructure. - @item -floop-parallelize-all @opindex floop-parallelize-all Use the Graphite data dependence analysis to identify loops that can diff --git a/gcc/graphite-blocking.c b/gcc/graphite-blocking.c deleted file mode 100644 index 34342948409..00000000000 --- a/gcc/graphite-blocking.c +++ /dev/null @@ -1,270 +0,0 @@ -/* Heuristics and transform for loop blocking and strip mining on - polyhedral representation. - - Copyright (C) 2009-2015 Free Software Foundation, Inc. - Contributed by Sebastian Pop and - Pranav Garg . - -This file is part of GCC. - -GCC is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 3, or (at your option) -any later version. - -GCC is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GCC; see the file COPYING3. If not see -. */ - -#include "config.h" - -#ifdef HAVE_isl -/* Workaround for GMP 5.1.3 bug, see PR56019. */ -#include - -#include -#include -#include -#include -#include - -#include "system.h" -#include "coretypes.h" -#include "backend.h" -#include "cfghooks.h" -#include "tree.h" -#include "gimple.h" -#include "params.h" -#include "fold-const.h" -#include "gimple-iterator.h" -#include "tree-ssa-loop.h" -#include "dumpfile.h" -#include "cfgloop.h" -#include "tree-data-ref.h" -#include "graphite-poly.h" - -/* Strip mines with a factor STRIDE the scattering (time) dimension - around PBB at depth TIME_DEPTH. - - The following example comes from the wiki page: - http://gcc.gnu.org/wiki/Graphite/Strip_mine - - The strip mine of a loop with a tile of 64 can be obtained with a - scattering function as follows: - - $ cat ./albert_strip_mine.cloog - # language: C - c - - # parameter {n | n >= 0} - 1 3 - # n 1 - 1 1 0 - 1 - n - - 1 # Number of statements: - - 1 - # {i | 0 <= i <= n} - 2 4 - # i n 1 - 1 1 0 0 - 1 -1 1 0 - - 0 0 0 - 1 - i - - 1 # Scattering functions - - 3 6 - # NEW OLD i n 1 - 1 -64 0 1 0 0 - 1 64 0 -1 0 63 - 0 0 1 -1 0 0 - - 1 - NEW OLD - - #the output of CLooG is like this: - #$ cloog ./albert_strip_mine.cloog - # for (NEW=0;NEW<=floord(n,64);NEW++) { - # for (OLD=max(64*NEW,0);OLD<=min(64*NEW+63,n);OLD++) { - # S1(i = OLD) ; - # } - # } -*/ - -static void -pbb_strip_mine_time_depth (poly_bb_p pbb, int time_depth, int stride) -{ - isl_space *d; - isl_constraint *c; - int iter, strip; - /* STRIP is the dimension that iterates with stride STRIDE. */ - /* ITER is the dimension that enumerates single iterations inside - one strip that has at most STRIDE iterations. */ - strip = time_depth; - iter = strip + 2; - - pbb->transformed = isl_map_insert_dims (pbb->transformed, isl_dim_out, - strip, 2); - - /* Lower bound of the striped loop. */ - d = isl_map_get_space (pbb->transformed); - c = isl_inequality_alloc (isl_local_space_from_space (d)); - c = isl_constraint_set_coefficient_si (c, isl_dim_out, strip, -stride); - c = isl_constraint_set_coefficient_si (c, isl_dim_out, iter, 1); - pbb->transformed = isl_map_add_constraint (pbb->transformed, c); - - /* Upper bound of the striped loop. */ - d = isl_map_get_space (pbb->transformed); - c = isl_inequality_alloc (isl_local_space_from_space (d)); - c = isl_constraint_set_coefficient_si (c, isl_dim_out, strip, stride); - c = isl_constraint_set_coefficient_si (c, isl_dim_out, iter, -1); - c = isl_constraint_set_constant_si (c, stride - 1); - pbb->transformed = isl_map_add_constraint (pbb->transformed, c); - - /* Static scheduling for ITER level. - This is mandatory to keep the 2d + 1 canonical scheduling format. */ - d = isl_map_get_space (pbb->transformed); - c = isl_equality_alloc (isl_local_space_from_space (d)); - c = isl_constraint_set_coefficient_si (c, isl_dim_out, strip + 1, 1); - pbb->transformed = isl_map_add_constraint (pbb->transformed, c); -} - -/* Returns true when strip mining with STRIDE of the loop LST is - profitable. */ - -static bool -lst_strip_mine_profitable_p (lst_p lst, int stride) -{ - mpz_t niter, strip_stride; - bool res; - - gcc_assert (LST_LOOP_P (lst)); - mpz_init (strip_stride); - mpz_init (niter); - - mpz_set_si (strip_stride, stride); - lst_niter_for_loop (lst, niter); - res = (mpz_cmp (niter, strip_stride) > 0); - - mpz_clear (strip_stride); - mpz_clear (niter); - return res; -} - -/* Strip-mines all the loops of LST with STRIDE. Return the number of - loops strip-mined. */ - -static int -lst_do_strip_mine_loop (lst_p lst, int depth, int stride) -{ - int i; - lst_p l; - poly_bb_p pbb; - - if (!lst) - return 0; - - if (LST_LOOP_P (lst)) - { - int res = 0; - - FOR_EACH_VEC_ELT (LST_SEQ (lst), i, l) - res += lst_do_strip_mine_loop (l, depth, stride); - - return res; - } - - pbb = LST_PBB (lst); - pbb_strip_mine_time_depth (pbb, psct_dynamic_dim (pbb, depth), stride); - return 1; -} - -/* Strip-mines all the loops of LST with STRIDE. When STRIDE is zero, - read the stride from the PARAM_LOOP_BLOCK_TILE_SIZE. Return the - number of strip-mined loops. - - Strip mining transforms a loop - - | for (i = 0; i < N; i++) - | S (i); - - into the following loop nest: - - | for (k = 0; k < N; k += STRIDE) - | for (j = 0; j < STRIDE; j++) - | S (i = k + j); -*/ - -static int -lst_do_strip_mine (lst_p lst, int stride) -{ - int i; - lst_p l; - int res = 0; - int depth; - - if (!stride) - stride = PARAM_VALUE (PARAM_LOOP_BLOCK_TILE_SIZE); - - if (!lst - || !LST_LOOP_P (lst)) - return false; - - FOR_EACH_VEC_ELT (LST_SEQ (lst), i, l) - res += lst_do_strip_mine (l, stride); - - depth = lst_depth (lst); - if (depth >= 0 - && lst_strip_mine_profitable_p (lst, stride)) - { - res += lst_do_strip_mine_loop (lst, lst_depth (lst), stride); - lst_add_loop_under_loop (lst); - } - - return res; -} - -/* Strip mines all the loops in SCOP. Returns the number of - strip-mined loops. */ - -int -scop_do_strip_mine (scop_p scop, int stride) -{ - return lst_do_strip_mine (SCOP_TRANSFORMED_SCHEDULE (scop), stride); -} - -/* Loop blocks all the loops in SCOP. Returns true when we manage to - block some loops. */ - -bool -scop_do_block (scop_p scop) -{ - store_scattering (scop); - - /* If we don't strip mine at least two loops, or not interchange - loops, the strip mine alone will not be profitable, and the - transform is not a loop blocking: so revert the transform. */ - if (lst_do_strip_mine (SCOP_TRANSFORMED_SCHEDULE (scop), 0) < 2 - || scop_do_interchange (scop) == 0) - { - restore_scattering (scop); - return false; - } - - if (dump_file && (dump_flags & TDF_DETAILS)) - fprintf (dump_file, "SCoP will be loop blocked.\n"); - - return true; -} - -#endif diff --git a/gcc/graphite-interchange.c b/gcc/graphite-interchange.c deleted file mode 100644 index 6b14955ced7..00000000000 --- a/gcc/graphite-interchange.c +++ /dev/null @@ -1,656 +0,0 @@ -/* Interchange heuristics and transform for loop interchange on - polyhedral representation. - - Copyright (C) 2009-2015 Free Software Foundation, Inc. - Contributed by Sebastian Pop and - Harsha Jagasia . - -This file is part of GCC. - -GCC is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 3, or (at your option) -any later version. - -GCC is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GCC; see the file COPYING3. If not see -. */ - -#include "config.h" - -#ifdef HAVE_isl -/* Workaround for GMP 5.1.3 bug, see PR56019. */ -#include - -#include -#include -#include -#include -#include -#include -#include - -/* Since ISL-0.13, the extern is in val_gmp.h. */ -#if !defined(HAVE_ISL_SCHED_CONSTRAINTS_COMPUTE_SCHEDULE) && defined(__cplusplus) -extern "C" { -#endif -#include -#if !defined(HAVE_ISL_SCHED_CONSTRAINTS_COMPUTE_SCHEDULE) && defined(__cplusplus) -} -#endif - -#include "system.h" -#include "coretypes.h" -#include "backend.h" -#include "cfghooks.h" -#include "tree.h" -#include "gimple.h" -#include "fold-const.h" -#include "gimple-iterator.h" -#include "tree-ssa-loop.h" -#include "dumpfile.h" -#include "cfgloop.h" -#include "tree-data-ref.h" -#include "graphite-poly.h" - - -/* XXX isl rewrite following comment */ -/* Builds a linear expression, of dimension DIM, representing PDR's - memory access: - - L = r_{n}*r_{n-1}*...*r_{1}*s_{0} + ... + r_{n}*s_{n-1} + s_{n}. - - For an array A[10][20] with two subscript locations s0 and s1, the - linear memory access is 20 * s0 + s1: a stride of 1 in subscript s0 - corresponds to a memory stride of 20. - - OFFSET is a number of dimensions to prepend before the - subscript dimensions: s_0, s_1, ..., s_n. - - Thus, the final linear expression has the following format: - 0 .. 0_{offset} | 0 .. 0_{nit} | 0 .. 0_{gd} | 0 | c_0 c_1 ... c_n - where the expression itself is: - c_0 * s_0 + c_1 * s_1 + ... c_n * s_n. */ - -static isl_constraint * -build_linearized_memory_access (isl_map *map, poly_dr_p pdr) -{ - isl_local_space *ls = isl_local_space_from_space (isl_map_get_space (map)); - isl_constraint *res = isl_equality_alloc (ls); - isl_val *size = isl_val_int_from_ui (isl_map_get_ctx (map), 1); - - unsigned nsubs = isl_set_dim (pdr->subscript_sizes, isl_dim_set); - /* -1 for the already included L dimension. */ - unsigned offset = isl_map_dim (map, isl_dim_out) - 1 - nsubs; - res = isl_constraint_set_coefficient_si (res, isl_dim_out, offset + nsubs, -1); - /* Go through all subscripts from last to first. The dimension "i=0" - is the alias set, ignore it. */ - for (int i = nsubs - 1; i >= 1; i--) - { - isl_aff *extract_dim; - res = isl_constraint_set_coefficient_val (res, isl_dim_out, offset + i, - isl_val_copy (size)); - isl_space *dc = isl_set_get_space (pdr->subscript_sizes); - extract_dim = isl_aff_zero_on_domain (isl_local_space_from_space (dc)); - extract_dim = isl_aff_set_coefficient_si (extract_dim, isl_dim_in, i, 1); - isl_val *max = isl_set_max_val (pdr->subscript_sizes, extract_dim); - isl_aff_free (extract_dim); - - /* The result is NULL in case of an error, the optimal value in case there - is one, negative infinity or infinity if the problem is unbounded and - NaN if the problem is empty. */ - gcc_assert (max); - - /* When one of the dimensions cannot be computed, we cannot build the size - of the array for any outer dimensions. */ - if (!isl_val_is_int (max)) - { - isl_val_free (max); - break; - } - size = isl_val_mul (size, max); - } - - isl_val_free (size); - - return res; -} - -/* Set STRIDE to the stride of PDR in memory by advancing by one in - the loop at DEPTH. */ - -static void -pdr_stride_in_loop (mpz_t stride, graphite_dim_t depth, poly_dr_p pdr) -{ - poly_bb_p pbb = PDR_PBB (pdr); - isl_map *map; - isl_set *set; - isl_aff *aff; - isl_space *dc; - isl_constraint *lma, *c; - isl_val *islstride; - graphite_dim_t time_depth; - unsigned offset, nt; - unsigned i; - /* XXX isl rewrite following comments. */ - /* Builds a partial difference equations and inserts them - into pointset powerset polyhedron P. Polyhedron is assumed - to have the format: T|I|T'|I'|G|S|S'|l1|l2. - - TIME_DEPTH is the time dimension w.r.t. which we are - differentiating. - OFFSET represents the number of dimensions between - columns t_{time_depth} and t'_{time_depth}. - DIM_SCTR is the number of scattering dimensions. It is - essentially the dimensionality of the T vector. - - The following equations are inserted into the polyhedron P: - | t_1 = t_1' - | ... - | t_{time_depth-1} = t'_{time_depth-1} - | t_{time_depth} = t'_{time_depth} + 1 - | t_{time_depth+1} = t'_{time_depth + 1} - | ... - | t_{dim_sctr} = t'_{dim_sctr}. */ - - /* Add the equality: t_{time_depth} = t'_{time_depth} + 1. - This is the core part of this alogrithm, since this - constraint asks for the memory access stride (difference) - between two consecutive points in time dimensions. */ - - /* Add equalities: - | t1 = t1' - | ... - | t_{time_depth-1} = t'_{time_depth-1} - | t_{time_depth+1} = t'_{time_depth+1} - | ... - | t_{dim_sctr} = t'_{dim_sctr} - - This means that all the time dimensions are equal except for - time_depth, where the constraint is t_{depth} = t'_{depth} + 1 - step. More to this: we should be careful not to add equalities - to the 'coupled' dimensions, which happens when the one dimension - is stripmined dimension, and the other dimension corresponds - to the point loop inside stripmined dimension. */ - - /* pdr->accesses: [P1..nb_param,I1..nb_domain]->[a,S1..nb_subscript] - ??? [P] not used for PDRs? - pdr->subscript_sizes: [a,S1..nb_subscript] - pbb->domain: [P1..nb_param,I1..nb_domain] - pbb->transformed: [P1..nb_param,I1..nb_domain]->[T1..Tnb_sctr] - [T] includes local vars (currently unused) - - First we create [P,I] -> [T,a,S]. */ - - map = isl_map_flat_range_product (isl_map_copy (pbb->transformed), - isl_map_copy (pdr->accesses)); - /* Add a dimension for L: [P,I] -> [T,a,S,L].*/ - map = isl_map_add_dims (map, isl_dim_out, 1); - /* Build a constraint for "lma[S] - L == 0", effectively calculating - L in terms of subscripts. */ - lma = build_linearized_memory_access (map, pdr); - /* And add it to the map, so we now have: - [P,I] -> [T,a,S,L] : lma([S]) == L. */ - map = isl_map_add_constraint (map, lma); - - /* Then we create [P,I,P',I'] -> [T,a,S,L,T',a',S',L']. */ - map = isl_map_flat_product (map, isl_map_copy (map)); - - /* Now add the equality T[time_depth] == T'[time_depth]+1. This will - force L' to be the linear address at T[time_depth] + 1. */ - time_depth = psct_dynamic_dim (pbb, depth); - /* Length of [a,S] plus [L] ... */ - offset = 1 + isl_map_dim (pdr->accesses, isl_dim_out); - /* ... plus [T]. */ - offset += isl_map_dim (pbb->transformed, isl_dim_out); - - c = isl_equality_alloc (isl_local_space_from_space (isl_map_get_space (map))); - c = isl_constraint_set_coefficient_si (c, isl_dim_out, time_depth, 1); - c = isl_constraint_set_coefficient_si (c, isl_dim_out, - offset + time_depth, -1); - c = isl_constraint_set_constant_si (c, 1); - map = isl_map_add_constraint (map, c); - - /* Now we equate most of the T/T' elements (making PITaSL nearly - the same is (PITaSL)', except for one dimension, namely for 'depth' - (an index into [I]), after translating to index into [T]. Take care - to not produce an empty map, which indicates we wanted to equate - two dimensions that are already coupled via the above time_depth - dimension. Happens with strip mining where several scatter dimension - are interdependend. */ - /* Length of [T]. */ - nt = pbb_nb_scattering_transform (pbb) + pbb_nb_local_vars (pbb); - for (i = 0; i < nt; i++) - if (i != time_depth) - { - isl_map *temp = isl_map_equate (isl_map_copy (map), - isl_dim_out, i, - isl_dim_out, offset + i); - if (isl_map_is_empty (temp)) - isl_map_free (temp); - else - { - isl_map_free (map); - map = temp; - } - } - - /* Now maximize the expression L' - L. */ - set = isl_map_range (map); - dc = isl_set_get_space (set); - aff = isl_aff_zero_on_domain (isl_local_space_from_space (dc)); - aff = isl_aff_set_coefficient_si (aff, isl_dim_in, offset - 1, -1); - aff = isl_aff_set_coefficient_si (aff, isl_dim_in, offset + offset - 1, 1); - islstride = isl_set_max_val (set, aff); - isl_val_get_num_gmp (islstride, stride); - isl_val_free (islstride); - isl_aff_free (aff); - isl_set_free (set); - - if (dump_file && (dump_flags & TDF_DETAILS)) - { - gmp_fprintf (dump_file, "\nStride in BB_%d, DR_%d, depth %d: %Zd ", - pbb_index (pbb), PDR_ID (pdr), (int) depth, stride); - } -} - -/* Sets STRIDES to the sum of all the strides of the data references - accessed in LOOP at DEPTH. */ - -static void -memory_strides_in_loop_1 (lst_p loop, graphite_dim_t depth, mpz_t strides) -{ - int i, j; - lst_p l; - poly_dr_p pdr; - mpz_t s, n; - - mpz_init (s); - mpz_init (n); - - FOR_EACH_VEC_ELT (LST_SEQ (loop), j, l) - if (LST_LOOP_P (l)) - memory_strides_in_loop_1 (l, depth, strides); - else - FOR_EACH_VEC_ELT (PBB_DRS (LST_PBB (l)), i, pdr) - { - pdr_stride_in_loop (s, depth, pdr); - mpz_set_si (n, PDR_NB_REFS (pdr)); - mpz_mul (s, s, n); - mpz_add (strides, strides, s); - } - - mpz_clear (s); - mpz_clear (n); -} - -/* Sets STRIDES to the sum of all the strides of the data references - accessed in LOOP at DEPTH. */ - -static void -memory_strides_in_loop (lst_p loop, graphite_dim_t depth, mpz_t strides) -{ - if (mpz_cmp_si (loop->memory_strides, -1) == 0) - { - mpz_set_si (strides, 0); - memory_strides_in_loop_1 (loop, depth, strides); - } - else - mpz_set (strides, loop->memory_strides); -} - -/* Return true when the interchange of loops LOOP1 and LOOP2 is - profitable. - - Example: - - | int a[100][100]; - | - | int - | foo (int N) - | { - | int j; - | int i; - | - | for (i = 0; i < N; i++) - | for (j = 0; j < N; j++) - | a[j][2 * i] += 1; - | - | return a[N][12]; - | } - - The data access A[j][i] is described like this: - - | i j N a s0 s1 1 - | 0 0 0 1 0 0 -5 = 0 - | 0 -1 0 0 1 0 0 = 0 - |-2 0 0 0 0 1 0 = 0 - | 0 0 0 0 1 0 0 >= 0 - | 0 0 0 0 0 1 0 >= 0 - | 0 0 0 0 -1 0 100 >= 0 - | 0 0 0 0 0 -1 100 >= 0 - - The linearized memory access L to A[100][100] is: - - | i j N a s0 s1 1 - | 0 0 0 0 100 1 0 - - TODO: the shown format is not valid as it does not show the fact - that the iteration domain "i j" is transformed using the scattering. - - Next, to measure the impact of iterating once in loop "i", we build - a maximization problem: first, we add to DR accesses the dimensions - k, s2, s3, L1 = 100 * s0 + s1, L2, and D1: this is the polyhedron P1. - L1 and L2 are the linearized memory access functions. - - | i j N a s0 s1 k s2 s3 L1 L2 D1 1 - | 0 0 0 1 0 0 0 0 0 0 0 0 -5 = 0 alias = 5 - | 0 -1 0 0 1 0 0 0 0 0 0 0 0 = 0 s0 = j - |-2 0 0 0 0 1 0 0 0 0 0 0 0 = 0 s1 = 2 * i - | 0 0 0 0 1 0 0 0 0 0 0 0 0 >= 0 - | 0 0 0 0 0 1 0 0 0 0 0 0 0 >= 0 - | 0 0 0 0 -1 0 0 0 0 0 0 0 100 >= 0 - | 0 0 0 0 0 -1 0 0 0 0 0 0 100 >= 0 - | 0 0 0 0 100 1 0 0 0 -1 0 0 0 = 0 L1 = 100 * s0 + s1 - - Then, we generate the polyhedron P2 by interchanging the dimensions - (s0, s2), (s1, s3), (L1, L2), (k, i) - - | i j N a s0 s1 k s2 s3 L1 L2 D1 1 - | 0 0 0 1 0 0 0 0 0 0 0 0 -5 = 0 alias = 5 - | 0 -1 0 0 0 0 0 1 0 0 0 0 0 = 0 s2 = j - | 0 0 0 0 0 0 -2 0 1 0 0 0 0 = 0 s3 = 2 * k - | 0 0 0 0 0 0 0 1 0 0 0 0 0 >= 0 - | 0 0 0 0 0 0 0 0 1 0 0 0 0 >= 0 - | 0 0 0 0 0 0 0 -1 0 0 0 0 100 >= 0 - | 0 0 0 0 0 0 0 0 -1 0 0 0 100 >= 0 - | 0 0 0 0 0 0 0 100 1 0 -1 0 0 = 0 L2 = 100 * s2 + s3 - - then we add to P2 the equality k = i + 1: - - |-1 0 0 0 0 0 1 0 0 0 0 0 -1 = 0 k = i + 1 - - and finally we maximize the expression "D1 = max (P1 inter P2, L2 - L1)". - - Similarly, to determine the impact of one iteration on loop "j", we - interchange (k, j), we add "k = j + 1", and we compute D2 the - maximal value of the difference. - - Finally, the profitability test is D1 < D2: if in the outer loop - the strides are smaller than in the inner loop, then it is - profitable to interchange the loops at DEPTH1 and DEPTH2. */ - -static bool -lst_interchange_profitable_p (lst_p nest, int depth1, int depth2) -{ - mpz_t d1, d2; - bool res; - - gcc_assert (depth1 < depth2); - - mpz_init (d1); - mpz_init (d2); - - memory_strides_in_loop (nest, depth1, d1); - memory_strides_in_loop (nest, depth2, d2); - - res = mpz_cmp (d1, d2) < 0; - - mpz_clear (d1); - mpz_clear (d2); - - return res; -} - -/* Interchanges the loops at DEPTH1 and DEPTH2 of the original - scattering and assigns the resulting polyhedron to the transformed - scattering. */ - -static void -pbb_interchange_loop_depths (graphite_dim_t depth1, graphite_dim_t depth2, - poly_bb_p pbb) -{ - unsigned i; - unsigned dim1 = psct_dynamic_dim (pbb, depth1); - unsigned dim2 = psct_dynamic_dim (pbb, depth2); - isl_space *d = isl_map_get_space (pbb->transformed); - isl_space *d1 = isl_space_range (d); - unsigned n = isl_space_dim (d1, isl_dim_out); - isl_space *d2 = isl_space_add_dims (d1, isl_dim_in, n); - isl_map *x = isl_map_universe (d2); - - x = isl_map_equate (x, isl_dim_in, dim1, isl_dim_out, dim2); - x = isl_map_equate (x, isl_dim_in, dim2, isl_dim_out, dim1); - - for (i = 0; i < n; i++) - if (i != dim1 && i != dim2) - x = isl_map_equate (x, isl_dim_in, i, isl_dim_out, i); - - pbb->transformed = isl_map_apply_range (pbb->transformed, x); -} - -/* Apply the interchange of loops at depths DEPTH1 and DEPTH2 to all - the statements below LST. */ - -static void -lst_apply_interchange (lst_p lst, int depth1, int depth2) -{ - if (!lst) - return; - - if (LST_LOOP_P (lst)) - { - int i; - lst_p l; - - FOR_EACH_VEC_ELT (LST_SEQ (lst), i, l) - lst_apply_interchange (l, depth1, depth2); - } - else - pbb_interchange_loop_depths (depth1, depth2, LST_PBB (lst)); -} - -/* Return true when the nest starting at LOOP1 and ending on LOOP2 is - perfect: i.e. there are no sequence of statements. */ - -static bool -lst_perfectly_nested_p (lst_p loop1, lst_p loop2) -{ - if (loop1 == loop2) - return true; - - if (!LST_LOOP_P (loop1)) - return false; - - return LST_SEQ (loop1).length () == 1 - && lst_perfectly_nested_p (LST_SEQ (loop1)[0], loop2); -} - -/* Transform the loop nest between LOOP1 and LOOP2 into a perfect - nest. To continue the naming tradition, this function is called - after perfect_nestify. NEST is set to the perfectly nested loop - that is created. BEFORE/AFTER are set to the loops distributed - before/after the loop NEST. */ - -static void -lst_perfect_nestify (lst_p loop1, lst_p loop2, lst_p *before, - lst_p *nest, lst_p *after) -{ - poly_bb_p first, last; - - gcc_assert (loop1 && loop2 - && loop1 != loop2 - && LST_LOOP_P (loop1) && LST_LOOP_P (loop2)); - - first = LST_PBB (lst_find_first_pbb (loop2)); - last = LST_PBB (lst_find_last_pbb (loop2)); - - *before = copy_lst (loop1); - *nest = copy_lst (loop1); - *after = copy_lst (loop1); - - lst_remove_all_before_including_pbb (*before, first, false); - lst_remove_all_before_including_pbb (*after, last, true); - - lst_remove_all_before_excluding_pbb (*nest, first, true); - lst_remove_all_before_excluding_pbb (*nest, last, false); - - if (lst_empty_p (*before)) - { - free_lst (*before); - *before = NULL; - } - if (lst_empty_p (*after)) - { - free_lst (*after); - *after = NULL; - } - if (lst_empty_p (*nest)) - { - free_lst (*nest); - *nest = NULL; - } -} - -/* Try to interchange LOOP1 with LOOP2 for all the statements of the - body of LOOP2. LOOP1 contains LOOP2. Return true if it did the - interchange. */ - -static bool -lst_try_interchange_loops (scop_p scop, lst_p loop1, lst_p loop2) -{ - int depth1 = lst_depth (loop1); - int depth2 = lst_depth (loop2); - lst_p transformed; - - lst_p before = NULL, nest = NULL, after = NULL; - - if (!lst_perfectly_nested_p (loop1, loop2)) - lst_perfect_nestify (loop1, loop2, &before, &nest, &after); - - if (!lst_interchange_profitable_p (loop2, depth1, depth2)) - return false; - - lst_apply_interchange (loop2, depth1, depth2); - - /* Sync the transformed LST information and the PBB scatterings - before using the scatterings in the data dependence analysis. */ - if (before || nest || after) - { - transformed = lst_substitute_3 (SCOP_TRANSFORMED_SCHEDULE (scop), loop1, - before, nest, after); - lst_update_scattering (transformed); - free_lst (transformed); - } - - if (graphite_legal_transform (scop)) - { - if (dump_file && (dump_flags & TDF_DETAILS)) - fprintf (dump_file, - "Loops at depths %d and %d will be interchanged.\n", - depth1, depth2); - - /* Transform the SCOP_TRANSFORMED_SCHEDULE of the SCOP. */ - lst_insert_in_sequence (before, loop1, true); - lst_insert_in_sequence (after, loop1, false); - - if (nest) - { - lst_replace (loop1, nest); - free_lst (loop1); - } - - return true; - } - - /* Undo the transform. */ - free_lst (before); - free_lst (nest); - free_lst (after); - lst_apply_interchange (loop2, depth2, depth1); - return false; -} - -/* Selects the inner loop in LST_SEQ (INNER_FATHER) to be interchanged - with the loop OUTER in LST_SEQ (OUTER_FATHER). */ - -static bool -lst_interchange_select_inner (scop_p scop, lst_p outer_father, int outer, - lst_p inner_father) -{ - int inner; - lst_p loop1, loop2; - - gcc_assert (outer_father - && LST_LOOP_P (outer_father) - && LST_LOOP_P (LST_SEQ (outer_father)[outer]) - && inner_father - && LST_LOOP_P (inner_father)); - - loop1 = LST_SEQ (outer_father)[outer]; - - FOR_EACH_VEC_ELT (LST_SEQ (inner_father), inner, loop2) - if (LST_LOOP_P (loop2) - && (lst_try_interchange_loops (scop, loop1, loop2) - || lst_interchange_select_inner (scop, outer_father, outer, loop2))) - return true; - - return false; -} - -/* Interchanges all the loops of LOOP and the loops of its body that - are considered profitable to interchange. Return the number of - interchanged loops. OUTER is the index in LST_SEQ (LOOP) that - points to the next outer loop to be considered for interchange. */ - -static int -lst_interchange_select_outer (scop_p scop, lst_p loop, int outer) -{ - lst_p l; - int res = 0; - int i = 0; - lst_p father; - - if (!loop || !LST_LOOP_P (loop)) - return 0; - - father = LST_LOOP_FATHER (loop); - if (father) - { - while (lst_interchange_select_inner (scop, father, outer, loop)) - { - res++; - loop = LST_SEQ (father)[outer]; - } - } - - if (LST_LOOP_P (loop)) - FOR_EACH_VEC_ELT (LST_SEQ (loop), i, l) - if (LST_LOOP_P (l)) - res += lst_interchange_select_outer (scop, l, i); - - return res; -} - -/* Interchanges all the loop depths that are considered profitable for - SCOP. Return the number of interchanged loops. */ - -int -scop_do_interchange (scop_p scop) -{ - int res = lst_interchange_select_outer - (scop, SCOP_TRANSFORMED_SCHEDULE (scop), 0); - - lst_update_scattering (SCOP_TRANSFORMED_SCHEDULE (scop)); - - return res; -} - - -#endif /* HAVE_isl */ - diff --git a/gcc/graphite-optimize-isl.c b/gcc/graphite-optimize-isl.c index 470dbfa4aae..ffa44652f63 100644 --- a/gcc/graphite-optimize-isl.c +++ b/gcc/graphite-optimize-isl.c @@ -47,6 +47,7 @@ along with GCC; see the file COPYING3. If not see #include "tree-data-ref.h" #include "graphite-poly.h" #include "params.h" +#include "dumpfile.h" static isl_union_set * scop_get_domains (scop_p scop ATTRIBUTE_UNUSED) @@ -177,12 +178,21 @@ getScheduleForBand (isl_band *Band, int *Dimensions) /* It does not make any sense to tile a band with just one dimension. */ if (*Dimensions == 1) - return PartialSchedule; + { + if (dump_file && dump_flags) + fprintf (dump_file, "not tiled\n"); + return PartialSchedule; + } + + 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 (PartialSchedule); Space = isl_union_map_get_space (PartialSchedule); - TileMap = getTileMap (ctx, *Dimensions, 32); + TileMap = getTileMap (ctx, *Dimensions, + PARAM_VALUE (PARAM_LOOP_BLOCK_TILE_SIZE)); TileUMap = isl_union_map_from_map (isl_map_from_basic_map (TileMap)); TileUMap = isl_union_map_align_params (TileUMap, Space); *Dimensions = 2 * *Dimensions; diff --git a/gcc/graphite-poly.c b/gcc/graphite-poly.c index 7ea938966c9..98e8ab01cdc 100644 --- a/gcc/graphite-poly.c +++ b/gcc/graphite-poly.c @@ -69,94 +69,6 @@ debug_gmp_value (mpz_t val) gmp_fprintf (stderr, "%Zd", val); } -/* Return the maximal loop depth in SCOP. */ - -int -scop_max_loop_depth (scop_p scop) -{ - int i; - poly_bb_p pbb; - int max_nb_loops = 0; - - FOR_EACH_VEC_ELT (SCOP_BBS (scop), i, pbb) - { - int nb_loops = pbb_dim_iter_domain (pbb); - if (max_nb_loops < nb_loops) - max_nb_loops = nb_loops; - } - - return max_nb_loops; -} - -/* Prints to FILE the scattering function of PBB, at some VERBOSITY - level. */ - -static void -print_scattering_function_1 (FILE *file, poly_bb_p pbb, int verbosity) -{ - graphite_dim_t i; - - if (verbosity > 0) - { - fprintf (file, "# scattering bb_%d (\n", pbb_index (pbb)); - fprintf (file, "#eq"); - - for (i = 0; i < pbb_nb_scattering_transform (pbb); i++) - fprintf (file, " s%d", (int) i); - - for (i = 0; i < pbb_nb_local_vars (pbb); i++) - fprintf (file, " lv%d", (int) i); - - for (i = 0; i < pbb_dim_iter_domain (pbb); i++) - fprintf (file, " i%d", (int) i); - - for (i = 0; i < pbb_nb_params (pbb); i++) - fprintf (file, " p%d", (int) i); - - fprintf (file, " cst\n"); - } - - fprintf (file, "isl\n"); - print_isl_map (file, pbb->transformed ? pbb->transformed : pbb->schedule); - - if (verbosity > 0) - fprintf (file, "#)\n"); -} - -/* Prints to FILE the scattering function of PBB, at some VERBOSITY - level. */ - -void -print_scattering_function (FILE *file, poly_bb_p pbb, int verbosity) -{ - if (!PBB_TRANSFORMED (pbb)) - return; - - if (pbb->schedule || pbb->transformed) - { - if (verbosity > 0) - fprintf (file, "# Scattering function is provided\n"); - - fprintf (file, "1\n"); - } - else - { - if (verbosity > 0) - fprintf (file, "# Scattering function is not provided\n"); - - fprintf (file, "0\n"); - return; - } - - print_scattering_function_1 (file, pbb, verbosity); - - if (verbosity > 0) - fprintf (file, "# Scattering names are not provided\n"); - - fprintf (file, "0\n"); - -} - /* Prints to FILE the iteration domain of PBB, at some VERBOSITY level. */ @@ -166,18 +78,6 @@ print_iteration_domain (FILE *file, poly_bb_p pbb, int verbosity) print_pbb_domain (file, pbb, verbosity); } -/* Prints to FILE the scattering functions of every PBB of SCOP. */ - -void -print_scattering_functions (FILE *file, scop_p scop, int verbosity) -{ - int i; - poly_bb_p pbb; - - FOR_EACH_VEC_ELT (SCOP_BBS (scop), i, pbb) - print_scattering_function (file, pbb, verbosity); -} - /* Prints to FILE the iteration domains of every PBB of SCOP, at some VERBOSITY level. */ @@ -191,15 +91,6 @@ print_iteration_domains (FILE *file, scop_p scop, int verbosity) print_iteration_domain (file, pbb, verbosity); } -/* Prints to STDERR the scattering function of PBB, at some VERBOSITY - level. */ - -DEBUG_FUNCTION void -debug_scattering_function (poly_bb_p pbb, int verbosity) -{ - print_scattering_function (stderr, pbb, verbosity); -} - /* Prints to STDERR the iteration domain of PBB, at some VERBOSITY level. */ @@ -209,15 +100,6 @@ debug_iteration_domain (poly_bb_p pbb, int verbosity) print_iteration_domain (stderr, pbb, verbosity); } -/* Prints to STDERR the scattering functions of every PBB of SCOP, at - some VERBOSITY level. */ - -DEBUG_FUNCTION void -debug_scattering_functions (scop_p scop, int verbosity) -{ - print_scattering_functions (stderr, scop, verbosity); -} - /* Prints to STDERR the iteration domains of every PBB of SCOP, at some VERBOSITY level. */ @@ -236,28 +118,13 @@ apply_poly_transforms (scop_p scop) /* 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 - Keep in mind that CLooG optimizes in control, so the loop structure - may change, even if we only use -fgraphite-identity. */ + transformation: GIMPLE -> GRAPHITE -> GIMPLE. */ if (flag_graphite_identity) transform_done = true; if (flag_loop_parallelize_all) transform_done = true; - if (flag_loop_block) - transform_done |= scop_do_block (scop); - else - { - if (flag_loop_strip_mine) - transform_done |= scop_do_strip_mine (scop, 0); - - if (flag_loop_interchange) - transform_done |= scop_do_interchange (scop); - } - - /* This pass needs to be run at the final stage, as it does not - update the lst. */ if (flag_loop_optimize_isl) transform_done |= optimize_isl (scop); @@ -311,9 +178,6 @@ new_poly_bb (scop_p scop, void *black_box) pbb->saved = NULL; PBB_SCOP (pbb) = scop; pbb_set_black_box (pbb, black_box); - PBB_TRANSFORMED (pbb) = NULL; - PBB_SAVED (pbb) = NULL; - PBB_ORIGINAL (pbb) = NULL; PBB_DRS (pbb).create (3); PBB_IS_REDUCTION (pbb) = false; GBB_PBB ((gimple_bb_p) black_box) = pbb; @@ -342,27 +206,6 @@ free_poly_bb (poly_bb_p pbb) XDELETE (pbb); } -static void -print_pdr_access_layout (FILE *file, poly_bb_p pbb, poly_dr_p pdr) -{ - graphite_dim_t i; - - fprintf (file, "# eq"); - - fprintf (file, " alias"); - - for (i = 0; i < PDR_NB_SUBSCRIPTS (pdr); i++) - fprintf (file, " sub%d", (int) i); - - for (i = 0; i < pbb_dim_iter_domain (pbb); i++) - fprintf (file, " i%d", (int) i); - - for (i = 0; i < pbb_nb_params (pbb); i++) - fprintf (file, " p%d", (int) i); - - fprintf (file, " cst\n"); -} - /* Prints to FILE the polyhedral data reference PDR, at some VERBOSITY level. */ @@ -397,14 +240,10 @@ print_pdr (FILE *file, poly_dr_p pdr, int verbosity) if (verbosity > 0) { fprintf (file, "# data accesses (\n"); - print_pdr_access_layout (file, PDR_PBB (pdr), pdr); + print_isl_map (file, pdr->accesses); + print_isl_set (file, pdr->subscript_sizes); + fprintf (file, "#)\n"); } - - /* XXX isl dump accesses/subscripts */ - - if (verbosity > 0) - fprintf (file, "#)\n"); - if (verbosity > 1) fprintf (file, "#)\n"); } @@ -440,9 +279,6 @@ new_scop (sese region) scop->may_waw_no_source = NULL; scop_set_region (scop, region); SCOP_BBS (scop).create (3); - SCOP_ORIGINAL_SCHEDULE (scop) = NULL; - SCOP_TRANSFORMED_SCHEDULE (scop) = NULL; - SCOP_SAVED_SCHEDULE (scop) = NULL; POLY_SCOP_P (scop) = false; return scop; @@ -474,44 +310,9 @@ free_scop (scop_p scop) isl_union_map_free (scop->may_waw); isl_union_map_free (scop->must_waw_no_source); isl_union_map_free (scop->may_waw_no_source); - free_lst (SCOP_ORIGINAL_SCHEDULE (scop)); - free_lst (SCOP_TRANSFORMED_SCHEDULE (scop)); - free_lst (SCOP_SAVED_SCHEDULE (scop)); XDELETE (scop); } -/* Print to FILE the domain of PBB in OpenScop format, at some VERBOSITY - level. */ - -static void -openscop_print_pbb_domain (FILE *file, poly_bb_p pbb, int verbosity) -{ - graphite_dim_t i; - gimple_bb_p gbb = PBB_BLACK_BOX (pbb); - - if (!pbb->domain) - return; - - if (verbosity > 0) - { - fprintf (file, "\n# Iteration domain of bb_%d (\n", GBB_BB (gbb)->index); - fprintf (file, "#eq"); - - for (i = 0; i < pbb_dim_iter_domain (pbb); i++) - fprintf (file, " i%d", (int) i); - - for (i = 0; i < pbb_nb_params (pbb); i++) - fprintf (file, " p%d", (int) i); - - fprintf (file, " cst\n"); - } - - fprintf (file, "XXX isl\n"); - - if (verbosity > 0) - fprintf (file, "#)\n"); -} - /* Print to FILE the domain of PBB, at some VERBOSITY level. */ void @@ -699,8 +500,7 @@ print_pbb (FILE *file, poly_bb_p pbb, int verbosity) dump_gbb_cases (file, PBB_BLACK_BOX (pbb)); } - openscop_print_pbb_domain (file, pbb, verbosity); - print_scattering_function (file, pbb, verbosity); + print_pbb_domain (file, pbb, verbosity); print_pdrs (file, pbb, verbosity); print_pbb_body (file, pbb, verbosity, false); @@ -748,58 +548,16 @@ print_scop_params (FILE *file, scop_p scop, int verbosity) fprintf (file, "#)\n"); } -/* Print to FILE the context of SCoP in OpenScop format, at some VERBOSITY - level. */ - -static void -openscop_print_scop_context (FILE *file, scop_p scop, int verbosity) -{ - graphite_dim_t i; - - if (verbosity > 0) - { - fprintf (file, "# Context (\n"); - fprintf (file, "#eq"); - - for (i = 0; i < scop_nb_params (scop); i++) - fprintf (file, " p%d", (int) i); - - fprintf (file, " cst\n"); - } - - if (scop->context) - /* XXX isl print context */ - fprintf (file, "XXX isl\n"); - else - fprintf (file, "0 %d 0 0 0 %d\n", (int) scop_nb_params (scop) + 2, - (int) scop_nb_params (scop)); - - if (verbosity > 0) - fprintf (file, "# )\n"); -} - /* Print to FILE the context of SCoP, at some VERBOSITY level. */ void print_scop_context (FILE *file, scop_p scop, int verbosity) { - graphite_dim_t i; - if (verbosity > 0) - { - fprintf (file, "# Context (\n"); - fprintf (file, "#eq"); - - for (i = 0; i < scop_nb_params (scop); i++) - fprintf (file, " p%d", (int) i); - - fprintf (file, " cst\n"); - } + fprintf (file, "# Context (\n"); if (scop->context) print_isl_set (file, scop->context); - else - fprintf (file, "no isl context %d\n", (int) scop_nb_params (scop) + 2); if (verbosity > 0) fprintf (file, "# )\n"); @@ -815,7 +573,7 @@ print_scop (FILE *file, scop_p scop, int verbosity) fprintf (file, "SCoP 1\n#(\n"); fprintf (file, "# Language\nGimple\n"); - openscop_print_scop_context (file, scop, verbosity); + print_scop_context (file, scop, verbosity); print_scop_params (file, scop, verbosity); if (verbosity > 0) @@ -826,17 +584,6 @@ print_scop (FILE *file, scop_p scop, int verbosity) FOR_EACH_VEC_ELT (SCOP_BBS (scop), i, pbb) print_pbb (file, pbb, verbosity); - if (verbosity > 1) - { - fprintf (file, "# original_lst (\n"); - print_lst (file, SCOP_ORIGINAL_SCHEDULE (scop), 0); - fprintf (file, "\n#)\n"); - - fprintf (file, "# transformed_lst (\n"); - print_lst (file, SCOP_TRANSFORMED_SCHEDULE (scop), 0); - fprintf (file, "\n#)\n"); - } - fprintf (file, "#)\n"); } @@ -888,6 +635,7 @@ print_isl_set (FILE *f, isl_set *set) { isl_printer *p = isl_printer_to_file (the_isl_ctx, f); p = isl_printer_print_set (p, set); + p = isl_printer_print_str (p, "\n"); isl_printer_free (p); } @@ -902,6 +650,7 @@ print_isl_map (FILE *f, isl_map *map) { isl_printer *p = isl_printer_to_file (the_isl_ctx, f); p = isl_printer_print_map (p, map); + p = isl_printer_print_str (p, "\n"); isl_printer_free (p); } @@ -916,6 +665,7 @@ print_isl_aff (FILE *f, isl_aff *aff) { isl_printer *p = isl_printer_to_file (the_isl_ctx, f); p = isl_printer_print_aff (p, aff); + p = isl_printer_print_str (p, "\n"); isl_printer_free (p); } @@ -930,6 +680,7 @@ print_isl_constraint (FILE *f, isl_constraint *c) { isl_printer *p = isl_printer_to_file (the_isl_ctx, f); p = isl_printer_print_constraint (p, c); + p = isl_printer_print_str (p, "\n"); isl_printer_free (p); } @@ -976,224 +727,5 @@ pbb_number_of_iterations_at_time (poly_bb_p pbb, isl_set_free (transdomain); } -/* Translates LOOP to LST. */ - -static lst_p -loop_to_lst (loop_p loop, vec bbs, int *i) -{ - poly_bb_p pbb; - vec seq; - seq.create (5); - - for (; bbs.iterate (*i, &pbb); (*i)++) - { - lst_p stmt; - basic_block bb = GBB_BB (PBB_BLACK_BOX (pbb)); - - if (bb->loop_father == loop) - stmt = new_lst_stmt (pbb); - else if (flow_bb_inside_loop_p (loop, bb)) - { - loop_p next = loop->inner; - - while (next && !flow_bb_inside_loop_p (next, bb)) - next = next->next; - - stmt = loop_to_lst (next, bbs, i); - } - else - { - (*i)--; - return new_lst_loop (seq); - } - - seq.safe_push (stmt); - } - - return new_lst_loop (seq); -} - -/* Reads the original scattering of the SCOP and returns an LST - representing it. */ - -void -scop_to_lst (scop_p scop) -{ - lst_p res; - int i, n = SCOP_BBS (scop).length (); - vec seq; - seq.create (5); - sese region = SCOP_REGION (scop); - - for (i = 0; i < n; i++) - { - poly_bb_p pbb = SCOP_BBS (scop)[i]; - loop_p loop = outermost_loop_in_sese (region, GBB_BB (PBB_BLACK_BOX (pbb))); - - if (loop_in_sese_p (loop, region)) - res = loop_to_lst (loop, SCOP_BBS (scop), &i); - else - res = new_lst_stmt (pbb); - - seq.safe_push (res); - } - - res = new_lst_loop (seq); - SCOP_ORIGINAL_SCHEDULE (scop) = res; - SCOP_TRANSFORMED_SCHEDULE (scop) = copy_lst (res); -} - -/* Print to FILE on a new line COLUMN white spaces. */ - -static void -lst_indent_to (FILE *file, int column) -{ - int i; - - if (column > 0) - fprintf (file, "\n#"); - - for (i = 0; i < column; i++) - fprintf (file, " "); -} - -/* Print LST to FILE with INDENT spaces of indentation. */ - -void -print_lst (FILE *file, lst_p lst, int indent) -{ - if (!lst) - return; - - lst_indent_to (file, indent); - - if (LST_LOOP_P (lst)) - { - int i; - lst_p l; - - if (LST_LOOP_FATHER (lst)) - fprintf (file, "%d (loop", lst_dewey_number (lst)); - else - fprintf (file, "#(root"); - - FOR_EACH_VEC_ELT (LST_SEQ (lst), i, l) - print_lst (file, l, indent + 2); - - fprintf (file, ")"); - } - else - fprintf (file, "%d stmt_%d", lst_dewey_number (lst), pbb_index (LST_PBB (lst))); -} - -/* Print LST to STDERR. */ - -DEBUG_FUNCTION void -debug_lst (lst_p lst) -{ - print_lst (stderr, lst, 0); -} - -/* Pretty print to FILE the loop statement tree LST in DOT format. */ - -static void -dot_lst_1 (FILE *file, lst_p lst) -{ - if (!lst) - return; - - if (LST_LOOP_P (lst)) - { - int i; - lst_p l; - - if (!LST_LOOP_FATHER (lst)) - fprintf (file, "L -> L_%d_%d\n", - lst_depth (lst), - lst_dewey_number (lst)); - else - fprintf (file, "L_%d_%d -> L_%d_%d\n", - lst_depth (LST_LOOP_FATHER (lst)), - lst_dewey_number (LST_LOOP_FATHER (lst)), - lst_depth (lst), - lst_dewey_number (lst)); - - FOR_EACH_VEC_ELT (LST_SEQ (lst), i, l) - dot_lst_1 (file, l); - } - - else - fprintf (file, "L_%d_%d -> S_%d\n", - lst_depth (LST_LOOP_FATHER (lst)), - lst_dewey_number (LST_LOOP_FATHER (lst)), - pbb_index (LST_PBB (lst))); - -} - -/* Display the LST using dotty. */ - -DEBUG_FUNCTION void -dot_lst (lst_p lst) -{ - /* When debugging, enable the following code. This cannot be used - in production compilers because it calls "system". */ -#if 0 - FILE *stream = fopen ("/tmp/lst.dot", "w"); - gcc_assert (stream); - - fputs ("digraph all {\n", stream); - dot_lst_1 (stream, lst); - fputs ("}\n\n", stream); - fclose (stream); - - system ("dotty /tmp/lst.dot &"); -#else - fputs ("digraph all {\n", stderr); - dot_lst_1 (stderr, lst); - fputs ("}\n\n", stderr); - -#endif -} - -/* Reverse the loop around PBB at level DEPTH. */ - -isl_map * -reverse_loop_at_level (poly_bb_p pbb, int depth) -{ - unsigned i, depth_dim = psct_dynamic_dim (pbb, depth); - isl_space *d = isl_map_get_space (pbb->transformed); - isl_space *d1 = isl_space_range (d); - unsigned n = isl_space_dim (d1, isl_dim_out); - isl_space *d2 = isl_space_add_dims (d1, isl_dim_in, n); - isl_map *x = isl_map_universe (isl_space_copy (d2)); - isl_constraint *c = isl_equality_alloc (isl_local_space_from_space (d2)); - - for (i = 0; i < n; i++) - if (i != depth_dim) - x = isl_map_equate (x, isl_dim_in, i, isl_dim_out, i); - - c = isl_constraint_set_coefficient_si (c, isl_dim_in, depth_dim, 1); - c = isl_constraint_set_coefficient_si (c, isl_dim_out, depth_dim, 1); - x = isl_map_add_constraint (x, c); - return x; -} - -/* Reverse the loop at level DEPTH for all the PBBS. */ - -isl_union_map * -reverse_loop_for_pbbs (scop_p scop, vec pbbs, int depth) -{ - poly_bb_p pbb; - int i; - isl_space *space = isl_space_from_domain (isl_set_get_space (scop->context)); - isl_union_map *res = isl_union_map_empty (space); - - for (i = 0; pbbs.iterate (i, &pbb); i++) - res = isl_union_map_add_map (res, reverse_loop_at_level (pbb, depth)); - - return res; -} - - #endif /* HAVE_isl */ diff --git a/gcc/graphite-poly.h b/gcc/graphite-poly.h index 29813e0a6ec..3bd22f05ae8 100644 --- a/gcc/graphite-poly.h +++ b/gcc/graphite-poly.h @@ -37,8 +37,6 @@ typedef struct scop *scop_p; typedef unsigned graphite_dim_t; -static inline graphite_dim_t pbb_dim_iter_domain (const struct poly_bb *); -static inline graphite_dim_t pbb_nb_params (const struct poly_bb *); static inline graphite_dim_t scop_nb_params (scop_p); /* A data reference can write or read some memory or we @@ -206,63 +204,6 @@ void new_poly_dr (poly_bb_p, int, enum poly_dr_type, void *, void free_poly_dr (poly_dr_p); void debug_pdr (poly_dr_p, int); void print_pdr (FILE *, poly_dr_p, int); -static inline scop_p pdr_scop (poly_dr_p pdr); - -/* The dimension of the iteration domain of the scop of PDR. */ - -static inline graphite_dim_t -pdr_dim_iter_domain (poly_dr_p pdr) -{ - return pbb_dim_iter_domain (PDR_PBB (pdr)); -} - -/* The number of parameters of the scop of PDR. */ - -static inline graphite_dim_t -pdr_nb_params (poly_dr_p pdr) -{ - return scop_nb_params (pdr_scop (pdr)); -} - -/* The dimension of the alias set in PDR. */ - -static inline graphite_dim_t -pdr_alias_set_dim (poly_dr_p pdr) -{ - poly_bb_p pbb = PDR_PBB (pdr); - - return pbb_dim_iter_domain (pbb) + pbb_nb_params (pbb); -} - -/* The dimension in PDR containing subscript S. */ - -static inline graphite_dim_t -pdr_subscript_dim (poly_dr_p pdr, graphite_dim_t s) -{ - poly_bb_p pbb = PDR_PBB (pdr); - - return pbb_dim_iter_domain (pbb) + pbb_nb_params (pbb) + 1 + s; -} - -/* The dimension in PDR containing the loop iterator ITER. */ - -static inline graphite_dim_t -pdr_iterator_dim (poly_dr_p pdr ATTRIBUTE_UNUSED, graphite_dim_t iter) -{ - return iter; -} - -/* The dimension in PDR containing parameter PARAM. */ - -static inline graphite_dim_t -pdr_parameter_dim (poly_dr_p pdr, graphite_dim_t param) -{ - poly_bb_p pbb = PDR_PBB (pdr); - - return pbb_dim_iter_domain (pbb) + param; -} - -/* Returns true when PDR is a "read". */ static inline bool pdr_read_p (poly_dr_p pdr) @@ -286,27 +227,6 @@ pdr_may_write_p (poly_dr_p pdr) return PDR_TYPE (pdr) == PDR_MAY_WRITE; } -/* Return true when PDR1 and PDR2 are similar data accesses: they have - the same base array, and the same access functions. */ - -static inline bool -same_pdr_p (poly_dr_p pdr1, poly_dr_p pdr2) -{ - return PDR_NB_SUBSCRIPTS (pdr1) == PDR_NB_SUBSCRIPTS (pdr2) - && PDR_BASE_OBJECT_SET (pdr1) == PDR_BASE_OBJECT_SET (pdr2); -} - -typedef struct poly_scattering *poly_scattering_p; - -struct poly_scattering -{ - /* The number of local variables. */ - int nb_local_variables; - - /* The number of scattering dimensions. */ - int nb_scattering; -}; - /* POLY_BB represents a blackbox in the polyhedral model. */ struct poly_bb @@ -345,15 +265,12 @@ struct poly_bb vec drs; /* The original scattering. */ - poly_scattering_p _original; isl_map *schedule; /* The transformed scattering. */ - poly_scattering_p _transformed; isl_map *transformed; /* A copy of the transformed scattering. */ - poly_scattering_p _saved; isl_map *saved; /* True when this PBB contains only a reduction statement. */ @@ -362,24 +279,12 @@ struct poly_bb #define PBB_BLACK_BOX(PBB) ((gimple_bb_p) PBB->black_box) #define PBB_SCOP(PBB) (PBB->scop) -#define PBB_DOMAIN(PBB) (NULL) #define PBB_DRS(PBB) (PBB->drs) -#define PBB_ORIGINAL(PBB) (PBB->_original) -#define PBB_ORIGINAL_SCATTERING(PBB) (NULL) -#define PBB_TRANSFORMED(PBB) (PBB->_transformed) -#define PBB_TRANSFORMED_SCATTERING(PBB) (NULL) -#define PBB_SAVED(PBB) (PBB->_saved) -/* XXX isl if we ever need local vars in the scatter, we can't use the - out dimension of transformed to count the scatterting transform dimension. - */ -#define PBB_NB_LOCAL_VARIABLES(PBB) (0) -#define PBB_NB_SCATTERING_TRANSFORM(PBB) (isl_map_n_out (PBB->transformed)) #define PBB_IS_REDUCTION(PBB) (PBB->is_reduction) extern poly_bb_p new_poly_bb (scop_p, void *); extern void free_poly_bb (poly_bb_p); extern void debug_loop_vec (poly_bb_p); -extern void schedule_to_scattering (poly_bb_p, int); extern void print_pbb_domain (FILE *, poly_bb_p, int); extern void print_pbb (FILE *, poly_bb_p, int); extern void print_scop_context (FILE *, scop_p, int); @@ -412,22 +317,6 @@ extern bool optimize_isl (scop_p); extern void pbb_number_of_iterations_at_time (poly_bb_p, graphite_dim_t, mpz_t); extern void debug_gmp_value (mpz_t); -/* Return the number of write data references in PBB. */ - -static inline int -number_of_write_pdrs (poly_bb_p pbb) -{ - int res = 0; - int i; - poly_dr_p pdr; - - for (i = 0; PBB_DRS (pbb).iterate (i, &pdr); i++) - if (PDR_TYPE (pdr) == PDR_WRITE) - res++; - - return res; -} - /* Returns a gimple_bb from BB. */ static inline gimple_bb_p @@ -452,8 +341,6 @@ pbb_bb (poly_bb_p pbb) return GBB_BB (PBB_BLACK_BOX (pbb)); } -/* The index of the PBB. */ - static inline int pbb_index (poly_bb_p pbb) { @@ -484,859 +371,6 @@ pbb_set_black_box (poly_bb_p pbb, void *black_box) pbb->black_box = black_box; } -/* The number of loops around PBB: the dimension of the iteration - domain. */ - -static inline graphite_dim_t -pbb_dim_iter_domain (const struct poly_bb *pbb) -{ - return isl_set_dim (pbb->domain, isl_dim_set); -} - -/* The number of params defined in PBB. */ - -static inline graphite_dim_t -pbb_nb_params (const struct poly_bb *pbb) -{ - scop_p scop = PBB_SCOP (pbb); - - return scop_nb_params (scop); -} - -/* The number of scattering dimensions in the SCATTERING polyhedron - of a PBB for a given SCOP. */ - -static inline graphite_dim_t -pbb_nb_scattering_orig (const struct poly_bb *pbb) -{ - return 2 * pbb_dim_iter_domain (pbb) + 1; -} - -/* The number of scattering dimensions in PBB. */ - -static inline graphite_dim_t -pbb_nb_scattering_transform (const struct poly_bb *pbb) -{ - return PBB_NB_SCATTERING_TRANSFORM (pbb); -} - -/* The number of dynamic scattering dimensions in PBB. */ - -static inline graphite_dim_t -pbb_nb_dynamic_scattering_transform (const struct poly_bb *pbb) -{ - /* This function requires the 2d + 1 scattering format to be - invariant during all transformations. */ - gcc_assert (PBB_NB_SCATTERING_TRANSFORM (pbb) % 2); - return PBB_NB_SCATTERING_TRANSFORM (pbb) / 2; -} - -/* Returns the number of local variables used in the transformed - scattering polyhedron of PBB. */ - -static inline graphite_dim_t -pbb_nb_local_vars (const struct poly_bb *pbb ATTRIBUTE_UNUSED) -{ - /* For now we do not have any local variables, as we do not do strip - mining for example. */ - return PBB_NB_LOCAL_VARIABLES (pbb); -} - -/* The dimension in the domain of PBB containing the iterator ITER. */ - -static inline graphite_dim_t -pbb_iterator_dim (poly_bb_p pbb ATTRIBUTE_UNUSED, graphite_dim_t iter) -{ - return iter; -} - -/* The dimension in the domain of PBB containing the iterator ITER. */ - -static inline graphite_dim_t -pbb_parameter_dim (poly_bb_p pbb, graphite_dim_t param) -{ - return param - + pbb_dim_iter_domain (pbb); -} - -/* The dimension in the original scattering polyhedron of PBB - containing the scattering iterator SCATTER. */ - -static inline graphite_dim_t -psco_scattering_dim (poly_bb_p pbb ATTRIBUTE_UNUSED, graphite_dim_t scatter) -{ - gcc_assert (scatter < pbb_nb_scattering_orig (pbb)); - return scatter; -} - -/* The dimension in the transformed scattering polyhedron of PBB - containing the scattering iterator SCATTER. */ - -static inline graphite_dim_t -psct_scattering_dim (poly_bb_p pbb ATTRIBUTE_UNUSED, graphite_dim_t scatter) -{ - gcc_assert (scatter <= pbb_nb_scattering_transform (pbb)); - return scatter; -} - -/* The dimension in the transformed scattering polyhedron of PBB of - the local variable LV. */ - -static inline graphite_dim_t -psct_local_var_dim (poly_bb_p pbb, graphite_dim_t lv) -{ - gcc_assert (lv <= pbb_nb_local_vars (pbb)); - return lv + pbb_nb_scattering_transform (pbb); -} - -/* The dimension in the original scattering polyhedron of PBB - containing the loop iterator ITER. */ - -static inline graphite_dim_t -psco_iterator_dim (poly_bb_p pbb, graphite_dim_t iter) -{ - gcc_assert (iter < pbb_dim_iter_domain (pbb)); - return iter + pbb_nb_scattering_orig (pbb); -} - -/* The dimension in the transformed scattering polyhedron of PBB - containing the loop iterator ITER. */ - -static inline graphite_dim_t -psct_iterator_dim (poly_bb_p pbb, graphite_dim_t iter) -{ - gcc_assert (iter < pbb_dim_iter_domain (pbb)); - return iter - + pbb_nb_scattering_transform (pbb) - + pbb_nb_local_vars (pbb); -} - -/* The dimension in the original scattering polyhedron of PBB - containing parameter PARAM. */ - -static inline graphite_dim_t -psco_parameter_dim (poly_bb_p pbb, graphite_dim_t param) -{ - gcc_assert (param < pbb_nb_params (pbb)); - return param - + pbb_nb_scattering_orig (pbb) - + pbb_dim_iter_domain (pbb); -} - -/* The dimension in the transformed scattering polyhedron of PBB - containing parameter PARAM. */ - -static inline graphite_dim_t -psct_parameter_dim (poly_bb_p pbb, graphite_dim_t param) -{ - gcc_assert (param < pbb_nb_params (pbb)); - return param - + pbb_nb_scattering_transform (pbb) - + pbb_nb_local_vars (pbb) - + pbb_dim_iter_domain (pbb); -} - -/* The scattering dimension of PBB corresponding to the dynamic level - LEVEL. */ - -static inline graphite_dim_t -psct_dynamic_dim (poly_bb_p pbb, graphite_dim_t level) -{ - graphite_dim_t result = 1 + 2 * level; - - gcc_assert (result < pbb_nb_scattering_transform (pbb)); - return result; -} - -/* The scattering dimension of PBB corresponding to the static - sequence of the loop level LEVEL. */ - -static inline graphite_dim_t -psct_static_dim (poly_bb_p pbb, graphite_dim_t level) -{ - graphite_dim_t result = 2 * level; - - gcc_assert (result < pbb_nb_scattering_transform (pbb)); - return result; -} - -/* Adds to the transformed scattering polyhedron of PBB a new local - variable and returns its index. */ - -static inline graphite_dim_t -psct_add_local_variable (poly_bb_p pbb ATTRIBUTE_UNUSED) -{ - gcc_unreachable (); - return 0; -} - -typedef struct lst *lst_p; - -/* Loops and Statements Tree. */ -struct lst { - - /* LOOP_P is true when an LST node is a loop. */ - bool loop_p; - - /* A pointer to the loop that contains this node. */ - lst_p loop_father; - - /* The sum of all the memory strides for an LST loop. */ - mpz_t memory_strides; - - /* Loop nodes contain a sequence SEQ of LST nodes, statements - contain a pointer to their polyhedral representation PBB. */ - union { - poly_bb_p pbb; - vec seq; - } node; -}; - -#define LST_LOOP_P(LST) ((LST)->loop_p) -#define LST_LOOP_FATHER(LST) ((LST)->loop_father) -#define LST_PBB(LST) ((LST)->node.pbb) -#define LST_SEQ(LST) ((LST)->node.seq) -#define LST_LOOP_MEMORY_STRIDES(LST) ((LST)->memory_strides) - -void scop_to_lst (scop_p); -void print_lst (FILE *, lst_p, int); -void debug_lst (lst_p); -void dot_lst (lst_p); - -/* Creates a new LST loop with SEQ. */ - -static inline lst_p -new_lst_loop (vec seq) -{ - lst_p lst = XNEW (struct lst); - int i; - lst_p l; - - LST_LOOP_P (lst) = true; - LST_SEQ (lst) = seq; - LST_LOOP_FATHER (lst) = NULL; - mpz_init (LST_LOOP_MEMORY_STRIDES (lst)); - mpz_set_si (LST_LOOP_MEMORY_STRIDES (lst), -1); - - for (i = 0; seq.iterate (i, &l); i++) - LST_LOOP_FATHER (l) = lst; - - return lst; -} - -/* Creates a new LST statement with PBB. */ - -static inline lst_p -new_lst_stmt (poly_bb_p pbb) -{ - lst_p lst = XNEW (struct lst); - - LST_LOOP_P (lst) = false; - LST_PBB (lst) = pbb; - LST_LOOP_FATHER (lst) = NULL; - return lst; -} - -/* Frees the memory used by LST. */ - -static inline void -free_lst (lst_p lst) -{ - if (!lst) - return; - - if (LST_LOOP_P (lst)) - { - int i; - lst_p l; - - for (i = 0; LST_SEQ (lst).iterate (i, &l); i++) - free_lst (l); - - mpz_clear (LST_LOOP_MEMORY_STRIDES (lst)); - LST_SEQ (lst).release (); - } - - free (lst); -} - -/* Returns a copy of LST. */ - -static inline lst_p -copy_lst (lst_p lst) -{ - if (!lst) - return NULL; - - if (LST_LOOP_P (lst)) - { - int i; - lst_p l; - vec seq; - seq.create (5); - - for (i = 0; LST_SEQ (lst).iterate (i, &l); i++) - seq.safe_push (copy_lst (l)); - - return new_lst_loop (seq); - } - - return new_lst_stmt (LST_PBB (lst)); -} - -/* Adds a new loop under the loop LST. */ - -static inline void -lst_add_loop_under_loop (lst_p lst) -{ - vec seq; - seq.create (1); - lst_p l = new_lst_loop (LST_SEQ (lst)); - - gcc_assert (LST_LOOP_P (lst)); - - LST_LOOP_FATHER (l) = lst; - seq.quick_push (l); - LST_SEQ (lst) = seq; -} - -/* Returns the loop depth of LST. */ - -static inline int -lst_depth (lst_p lst) -{ - if (!lst) - return -2; - - /* The depth of the outermost "fake" loop is -1. This outermost - loop does not have a loop father and it is just a container, as - in the loop representation of GCC. */ - if (!LST_LOOP_FATHER (lst)) - return -1; - - return lst_depth (LST_LOOP_FATHER (lst)) + 1; -} - -/* Returns the Dewey number for LST. */ - -static inline int -lst_dewey_number (lst_p lst) -{ - int i; - lst_p l; - - if (!lst) - return -1; - - if (!LST_LOOP_FATHER (lst)) - return 0; - - FOR_EACH_VEC_ELT (LST_SEQ (LST_LOOP_FATHER (lst)), i, l) - if (l == lst) - return i; - - return -1; -} - -/* Returns the Dewey number of LST at depth DEPTH. */ - -static inline int -lst_dewey_number_at_depth (lst_p lst, int depth) -{ - gcc_assert (lst && depth >= 0 && lst_depth (lst) <= depth); - - if (lst_depth (lst) == depth) - return lst_dewey_number (lst); - - return lst_dewey_number_at_depth (LST_LOOP_FATHER (lst), depth); -} - -/* Returns the predecessor of LST in the sequence of its loop father. - Returns NULL if LST is the first statement in the sequence. */ - -static inline lst_p -lst_pred (lst_p lst) -{ - int dewey; - lst_p father; - - if (!lst || !LST_LOOP_FATHER (lst)) - return NULL; - - dewey = lst_dewey_number (lst); - if (dewey == 0) - return NULL; - - father = LST_LOOP_FATHER (lst); - return LST_SEQ (father)[dewey - 1]; -} - -/* Returns the successor of LST in the sequence of its loop father. - Returns NULL if there is none. */ - -static inline lst_p -lst_succ (lst_p lst) -{ - int dewey; - lst_p father; - - if (!lst || !LST_LOOP_FATHER (lst)) - return NULL; - - dewey = lst_dewey_number (lst); - father = LST_LOOP_FATHER (lst); - - if (LST_SEQ (father).length () == (unsigned) dewey + 1) - return NULL; - - return LST_SEQ (father)[dewey + 1]; -} - - -/* Return the LST node corresponding to PBB. */ - -static inline lst_p -lst_find_pbb (lst_p lst, poly_bb_p pbb) -{ - int i; - lst_p l; - - if (!lst) - return NULL; - - if (!LST_LOOP_P (lst)) - return (pbb == LST_PBB (lst)) ? lst : NULL; - - for (i = 0; LST_SEQ (lst).iterate (i, &l); i++) - { - lst_p res = lst_find_pbb (l, pbb); - if (res) - return res; - } - - return NULL; -} - -/* Return the LST node corresponding to the loop around STMT at depth - LOOP_DEPTH. */ - -static inline lst_p -find_lst_loop (lst_p stmt, int loop_depth) -{ - lst_p loop = LST_LOOP_FATHER (stmt); - - gcc_assert (loop_depth >= 0); - - while (loop_depth < lst_depth (loop)) - loop = LST_LOOP_FATHER (loop); - - return loop; -} - -/* Return the first LST representing a PBB statement in LST. */ - -static inline lst_p -lst_find_first_pbb (lst_p lst) -{ - int i; - lst_p l; - - if (!lst) - return NULL; - - if (!LST_LOOP_P (lst)) - return lst; - - for (i = 0; LST_SEQ (lst).iterate (i, &l); i++) - { - lst_p res = lst_find_first_pbb (l); - if (res) - return res; - } - - return NULL; -} - -/* Returns true when LST is a loop that does not contain - statements. */ - -static inline bool -lst_empty_p (lst_p lst) -{ - return !lst_find_first_pbb (lst); -} - -/* Return the last LST representing a PBB statement in LST. */ - -static inline lst_p -lst_find_last_pbb (lst_p lst) -{ - int i; - lst_p l, res = NULL; - - if (!lst) - return NULL; - - if (!LST_LOOP_P (lst)) - return lst; - - for (i = 0; LST_SEQ (lst).iterate (i, &l); i++) - { - lst_p last = lst_find_last_pbb (l); - - if (last) - res = last; - } - - gcc_assert (res); - return res; -} - -/* Returns true if LOOP contains LST, in other words, if LST is nested - in LOOP. */ - -static inline bool -lst_contains_p (lst_p loop, lst_p lst) -{ - if (!loop || !lst || !LST_LOOP_P (loop)) - return false; - - if (loop == lst) - return true; - - return lst_contains_p (loop, LST_LOOP_FATHER (lst)); -} - -/* Returns true if LOOP contains PBB, in other words, if PBB is nested - in LOOP. */ - -static inline bool -lst_contains_pbb (lst_p loop, poly_bb_p pbb) -{ - return lst_find_pbb (loop, pbb) ? true : false; -} - -/* Creates a loop nest of depth NB_LOOPS containing LST. */ - -static inline lst_p -lst_create_nest (int nb_loops, lst_p lst) -{ - lst_p res, loop; - vec seq; - - if (nb_loops == 0) - return lst; - - seq.create (1); - loop = lst_create_nest (nb_loops - 1, lst); - seq.quick_push (loop); - res = new_lst_loop (seq); - LST_LOOP_FATHER (loop) = res; - - return res; -} - -/* Removes LST from the sequence of statements of its loop father. */ - -static inline void -lst_remove_from_sequence (lst_p lst) -{ - lst_p father = LST_LOOP_FATHER (lst); - int dewey = lst_dewey_number (lst); - - gcc_assert (lst && father && dewey >= 0); - - LST_SEQ (father).ordered_remove (dewey); - LST_LOOP_FATHER (lst) = NULL; -} - -/* Removes the loop LST and inline its body in the father loop. */ - -static inline void -lst_remove_loop_and_inline_stmts_in_loop_father (lst_p lst) -{ - lst_p l, father = LST_LOOP_FATHER (lst); - int i, dewey = lst_dewey_number (lst); - - gcc_assert (lst && father && dewey >= 0); - - LST_SEQ (father).ordered_remove (dewey); - LST_LOOP_FATHER (lst) = NULL; - - FOR_EACH_VEC_ELT (LST_SEQ (lst), i, l) - { - LST_SEQ (father).safe_insert (dewey + i, l); - LST_LOOP_FATHER (l) = father; - } -} - -/* Sets NITER to the upper bound approximation of the number of - iterations of loop LST. */ - -static inline void -lst_niter_for_loop (lst_p lst, mpz_t niter) -{ - int depth = lst_depth (lst); - poly_bb_p pbb = LST_PBB (lst_find_first_pbb (lst)); - - gcc_assert (LST_LOOP_P (lst)); - pbb_number_of_iterations_at_time (pbb, psct_dynamic_dim (pbb, depth), niter); -} - -/* Updates the scattering of PBB to be at the DEWEY number in the loop - at depth LEVEL. */ - -static inline void -pbb_update_scattering (poly_bb_p pbb, graphite_dim_t level, int dewey) -{ - graphite_dim_t sched = psct_static_dim (pbb, level); - isl_space *d = isl_map_get_space (pbb->transformed); - isl_space *d1 = isl_space_range (d); - unsigned i, n = isl_space_dim (d1, isl_dim_out); - isl_space *d2 = isl_space_add_dims (d1, isl_dim_in, n); - isl_map *x = isl_map_universe (d2); - - x = isl_map_fix_si (x, isl_dim_out, sched, dewey); - - for (i = 0; i < n; i++) - if (i != sched) - x = isl_map_equate (x, isl_dim_in, i, isl_dim_out, i); - - pbb->transformed = isl_map_apply_range (pbb->transformed, x); -} - -/* Updates the scattering of all the PBBs under LST to be at the DEWEY - number in the loop at depth LEVEL. */ - -static inline void -lst_update_scattering_under (lst_p lst, int level, int dewey) -{ - int i; - lst_p l; - - gcc_assert (lst && level >= 0 && dewey >= 0); - - if (LST_LOOP_P (lst)) - for (i = 0; LST_SEQ (lst).iterate (i, &l); i++) - lst_update_scattering_under (l, level, dewey); - else - pbb_update_scattering (LST_PBB (lst), level, dewey); -} - -/* Updates the all the scattering levels of all the PBBs under - LST. */ - -static inline void -lst_update_scattering (lst_p lst) -{ - int i; - lst_p l; - - if (!lst) - return; - - if (LST_LOOP_FATHER (lst)) - { - lst_p father = LST_LOOP_FATHER (lst); - int dewey = lst_dewey_number (lst); - int level = lst_depth (lst); - - gcc_assert (lst && father && dewey >= 0 && level >= 0); - - for (i = dewey; LST_SEQ (father).iterate (i, &l); i++) - lst_update_scattering_under (l, level, i); - } - - if (LST_LOOP_P (lst)) - for (i = 0; LST_SEQ (lst).iterate (i, &l); i++) - lst_update_scattering (l); -} - -/* Inserts LST1 before LST2 if BEFORE is true; inserts LST1 after LST2 - if BEFORE is false. */ - -static inline void -lst_insert_in_sequence (lst_p lst1, lst_p lst2, bool before) -{ - lst_p father; - int dewey; - - /* Do not insert empty loops. */ - if (!lst1 || lst_empty_p (lst1)) - return; - - father = LST_LOOP_FATHER (lst2); - dewey = lst_dewey_number (lst2); - - gcc_assert (lst2 && father && dewey >= 0); - - LST_SEQ (father).safe_insert (before ? dewey : dewey + 1, lst1); - LST_LOOP_FATHER (lst1) = father; -} - -/* Replaces LST1 with LST2. */ - -static inline void -lst_replace (lst_p lst1, lst_p lst2) -{ - lst_p father; - int dewey; - - if (!lst2 || lst_empty_p (lst2)) - return; - - father = LST_LOOP_FATHER (lst1); - dewey = lst_dewey_number (lst1); - LST_LOOP_FATHER (lst2) = father; - LST_SEQ (father)[dewey] = lst2; -} - -/* Returns a copy of ROOT where LST has been replaced by a copy of the - LSTs A B C in this sequence. */ - -static inline lst_p -lst_substitute_3 (lst_p root, lst_p lst, lst_p a, lst_p b, lst_p c) -{ - int i; - lst_p l; - vec seq; - - if (!root) - return NULL; - - gcc_assert (lst && root != lst); - - if (!LST_LOOP_P (root)) - return new_lst_stmt (LST_PBB (root)); - - seq.create (5); - - for (i = 0; LST_SEQ (root).iterate (i, &l); i++) - if (l != lst) - seq.safe_push (lst_substitute_3 (l, lst, a, b, c)); - else - { - if (!lst_empty_p (a)) - seq.safe_push (copy_lst (a)); - if (!lst_empty_p (b)) - seq.safe_push (copy_lst (b)); - if (!lst_empty_p (c)) - seq.safe_push (copy_lst (c)); - } - - return new_lst_loop (seq); -} - -/* Moves LST before LOOP if BEFORE is true, and after the LOOP if - BEFORE is false. */ - -static inline void -lst_distribute_lst (lst_p loop, lst_p lst, bool before) -{ - int loop_depth = lst_depth (loop); - int depth = lst_depth (lst); - int nb_loops = depth - loop_depth; - - gcc_assert (lst && loop && LST_LOOP_P (loop) && nb_loops > 0); - - lst_remove_from_sequence (lst); - lst_insert_in_sequence (lst_create_nest (nb_loops, lst), loop, before); -} - -/* Removes from LOOP all the statements before/after and including PBB - if BEFORE is true/false. Returns the negation of BEFORE when the - statement PBB has been found. */ - -static inline bool -lst_remove_all_before_including_pbb (lst_p loop, poly_bb_p pbb, bool before) -{ - int i; - lst_p l; - - if (!loop || !LST_LOOP_P (loop)) - return before; - - for (i = 0; LST_SEQ (loop).iterate (i, &l);) - if (LST_LOOP_P (l)) - { - before = lst_remove_all_before_including_pbb (l, pbb, before); - - if (LST_SEQ (l).length () == 0) - { - LST_SEQ (loop).ordered_remove (i); - free_lst (l); - } - else - i++; - } - else - { - if (before) - { - if (LST_PBB (l) == pbb) - before = false; - - LST_SEQ (loop).ordered_remove (i); - free_lst (l); - } - else if (LST_PBB (l) == pbb) - { - before = true; - LST_SEQ (loop).ordered_remove (i); - free_lst (l); - } - else - i++; - } - - return before; -} - -/* Removes from LOOP all the statements before/after and excluding PBB - if BEFORE is true/false; Returns the negation of BEFORE when the - statement PBB has been found. */ - -static inline bool -lst_remove_all_before_excluding_pbb (lst_p loop, poly_bb_p pbb, bool before) -{ - int i; - lst_p l; - - if (!loop || !LST_LOOP_P (loop)) - return before; - - for (i = 0; LST_SEQ (loop).iterate (i, &l);) - if (LST_LOOP_P (l)) - { - before = lst_remove_all_before_excluding_pbb (l, pbb, before); - - if (LST_SEQ (l).length () == 0) - { - LST_SEQ (loop).ordered_remove (i); - free_lst (l); - continue; - } - - i++; - } - else - { - if (before && LST_PBB (l) != pbb) - { - LST_SEQ (loop).ordered_remove (i); - free_lst (l); - continue; - } - - i++; - - if (LST_PBB (l) == pbb) - before = before ? false : true; - } - - return before; -} - /* A SCOP is a Static Control Part of the program, simple enough to be represented in polyhedral form. */ struct scop @@ -1352,9 +386,6 @@ struct scop representation. */ vec bbs; - /* Original, transformed and saved schedules. */ - lst_p original_schedule, transformed_schedule, saved_schedule; - /* The context describes known restrictions concerning the parameters and relations in between the parameters. @@ -1389,9 +420,6 @@ struct scop #define SCOP_BBS(S) (S->bbs) #define SCOP_REGION(S) (S->region) #define SCOP_CONTEXT(S) (NULL) -#define SCOP_ORIGINAL_SCHEDULE(S) (S->original_schedule) -#define SCOP_TRANSFORMED_SCHEDULE(S) (S->transformed_schedule) -#define SCOP_SAVED_SCHEDULE(S) (S->saved_schedule) #define POLY_SCOP_P(S) (S->poly_scop_p) extern scop_p new_scop (sese); @@ -1399,11 +427,6 @@ extern void free_scop (scop_p); extern void free_scops (vec ); extern void print_generated_program (FILE *, scop_p); extern void debug_generated_program (scop_p); -extern void print_scattering_function (FILE *, poly_bb_p, int); -extern void print_scattering_functions (FILE *, scop_p, int); -extern void debug_scattering_function (poly_bb_p, int); -extern void debug_scattering_functions (scop_p, int); -extern int scop_max_loop_depth (scop_p); extern int unify_scattering_dimensions (scop_p); extern bool apply_poly_transforms (scop_p); extern bool graphite_legal_transform (scop_p); @@ -1432,114 +455,9 @@ scop_set_nb_params (scop_p scop, graphite_dim_t nb_params) scop->nb_params = nb_params; } -/* Allocates a new empty poly_scattering structure. */ - -static inline poly_scattering_p -poly_scattering_new (void) -{ - poly_scattering_p res = XNEW (struct poly_scattering); - - res->nb_local_variables = 0; - res->nb_scattering = 0; - return res; -} - -/* Free a poly_scattering structure. */ - -static inline void -poly_scattering_free (poly_scattering_p s) -{ - free (s); -} - -/* Copies S and return a new scattering. */ - -static inline poly_scattering_p -poly_scattering_copy (poly_scattering_p s) -{ - poly_scattering_p res = poly_scattering_new (); - - res->nb_local_variables = s->nb_local_variables; - res->nb_scattering = s->nb_scattering; - return res; -} - -/* Saves the transformed scattering of PBB. */ - -static inline void -store_scattering_pbb (poly_bb_p pbb) -{ - isl_map_free (pbb->saved); - pbb->saved = isl_map_copy (pbb->transformed); -} - -/* Stores the SCOP_TRANSFORMED_SCHEDULE to SCOP_SAVED_SCHEDULE. */ - -static inline void -store_lst_schedule (scop_p scop) -{ - if (SCOP_SAVED_SCHEDULE (scop)) - free_lst (SCOP_SAVED_SCHEDULE (scop)); - - SCOP_SAVED_SCHEDULE (scop) = copy_lst (SCOP_TRANSFORMED_SCHEDULE (scop)); -} - -/* Restores the SCOP_TRANSFORMED_SCHEDULE from SCOP_SAVED_SCHEDULE. */ - -static inline void -restore_lst_schedule (scop_p scop) -{ - if (SCOP_TRANSFORMED_SCHEDULE (scop)) - free_lst (SCOP_TRANSFORMED_SCHEDULE (scop)); - - SCOP_TRANSFORMED_SCHEDULE (scop) = copy_lst (SCOP_SAVED_SCHEDULE (scop)); -} - -/* Saves the scattering for all the pbbs in the SCOP. */ - -static inline void -store_scattering (scop_p scop) -{ - int i; - poly_bb_p pbb; - - for (i = 0; SCOP_BBS (scop).iterate (i, &pbb); i++) - store_scattering_pbb (pbb); - - store_lst_schedule (scop); -} - -/* Restores the scattering of PBB. */ - -static inline void -restore_scattering_pbb (poly_bb_p pbb) -{ - gcc_assert (pbb->saved); - - isl_map_free (pbb->transformed); - pbb->transformed = isl_map_copy (pbb->saved); -} - -/* Restores the scattering for all the pbbs in the SCOP. */ - -static inline void -restore_scattering (scop_p scop) -{ - int i; - poly_bb_p pbb; - - for (i = 0; SCOP_BBS (scop).iterate (i, &pbb); i++) - restore_scattering_pbb (pbb); - - restore_lst_schedule (scop); -} - bool graphite_legal_transform (scop_p); -isl_map *reverse_loop_at_level (poly_bb_p, int); -isl_union_map *reverse_loop_for_pbbs (scop_p, vec , int); __isl_give isl_union_map *extend_schedule (__isl_take isl_union_map *); - void compute_deps (scop_p scop, vec pbbs, isl_union_map **must_raw, diff --git a/gcc/graphite-sese-to-poly.c b/gcc/graphite-sese-to-poly.c index 0c97eba5190..e64a6fce45f 100644 --- a/gcc/graphite-sese-to-poly.c +++ b/gcc/graphite-sese-to-poly.c @@ -443,18 +443,12 @@ isl_id_for_pbb (scop_p s, poly_bb_p pbb) /* Converts the STATIC_SCHEDULE of PBB into a scattering polyhedron. We generate SCATTERING_DIMENSIONS scattering dimensions. - CLooG 0.15.0 and previous versions require, that all - scattering functions of one CloogProgram have the same number of - scattering dimensions, therefore we allow to specify it. This - should be removed in future versions of CLooG. - The scattering polyhedron consists of these dimensions: scattering, loop_iterators, parameters. Example: | scattering_dimensions = 5 - | used_scattering_dimensions = 3 | nb_iterators = 1 | scop_nb_params = 2 | @@ -475,15 +469,13 @@ isl_id_for_pbb (scop_p s, poly_bb_p pbb) static void build_pbb_scattering_polyhedrons (isl_aff *static_sched, - poly_bb_p pbb, int scattering_dimensions) + poly_bb_p pbb) { int i; - int nb_iterators = pbb_dim_iter_domain (pbb); - int used_scattering_dimensions = nb_iterators * 2 + 1; isl_val *val; isl_space *dc, *dm; - gcc_assert (scattering_dimensions >= used_scattering_dimensions); + int scattering_dimensions = isl_set_dim (pbb->domain, isl_dim_set) * 2 + 1; dc = isl_set_get_space (pbb->domain); dm = isl_space_add_dims (isl_space_from_domain (dc), @@ -577,7 +569,6 @@ build_scop_scattering (scop_p scop) { gimple_bb_p gbb = PBB_BLACK_BOX (pbb); int prefix; - int nb_scat_dims = pbb_dim_iter_domain (pbb) * 2 + 1; if (previous_gbb) prefix = nb_common_loops (SCOP_REGION (scop), previous_gbb, gbb); @@ -588,7 +579,7 @@ build_scop_scattering (scop_p scop) static_sched = isl_aff_add_coefficient_si (static_sched, isl_dim_in, prefix, 1); - build_pbb_scattering_polyhedrons (static_sched, pbb, nb_scat_dims); + build_pbb_scattering_polyhedrons (static_sched, pbb); } isl_aff_free (static_sched); @@ -3103,7 +3094,7 @@ rewrite_commutative_reductions_out_of_ssa (scop_p scop) } /* Can all ivs be represented by a signed integer? - As CLooG might generate negative values in its expressions, signed loop ivs + As ISL might generate negative values in its expressions, signed loop ivs are required in the backend. */ static bool @@ -3149,9 +3140,7 @@ build_poly_scop (scop_p scop) build_scop_bbs (scop); - /* FIXME: This restriction is needed to avoid a problem in CLooG. - Once CLooG is fixed, remove this guard. Anyways, it makes no - sense to optimize a scop containing only PBBs that do not belong + /* Do not optimize a scop containing only PBBs that do not belong to any loops. */ if (nb_pbbs_in_loops (scop) == 0) return; @@ -3182,7 +3171,6 @@ build_poly_scop (scop_p scop) rewrite_cross_bb_scalar_deps_out_of_ssa (scop); build_scop_drs (scop); - scop_to_lst (scop); build_scop_scattering (scop); /* This SCoP has been translated to the polyhedral diff --git a/gcc/graphite.c b/gcc/graphite.c index 4acc172b0af..36b97a71e3f 100644 --- a/gcc/graphite.c +++ b/gcc/graphite.c @@ -25,12 +25,7 @@ along with GCC; see the file COPYING3. If not see An early description of this pass can be found in the GCC Summit'06 paper "GRAPHITE: Polyhedral Analyses and Optimizations for GCC". The wiki page http://gcc.gnu.org/wiki/Graphite contains pointers to - the related work. - - One important document to read is CLooG's internal manual: - http://repo.or.cz/w/cloog-ppl.git?a=blob_plain;f=doc/cloog.texi;hb=HEAD - that describes the data structure of loops used in this file, and - the functions that are used for transforming the code. */ + the related work. */ #include "config.h" @@ -286,6 +281,9 @@ graphite_transform_loops (void) scop->ctx = ctx; build_poly_scop (scop); + if (dump_file && dump_flags) + print_scop (dump_file, scop, 3); + if (POLY_SCOP_P (scop) && apply_poly_transforms (scop) && graphite_regenerate_ast_isl (scop)) @@ -326,10 +324,7 @@ gate_graphite_transforms (void) { /* Enable -fgraphite pass if any one of the graphite optimization flags is turned on. */ - if (flag_loop_block - || flag_loop_interchange - || flag_loop_strip_mine - || flag_graphite_identity + if (flag_graphite_identity || flag_loop_parallelize_all || flag_loop_optimize_isl) flag_graphite = 1; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f5f64add7dd..e04ef9d3a09 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,43 @@ +2015-08-27 Sebastian Pop + + * gcc.dg/graphite/graphite.exp (interchange_files, block_files): + Replaced by opt_files, compile with -floop-nest-optimize. + * g++.dg/graphite/graphite.exp: Same. + * gfortran.dg/graphite/graphite.exp: Same. + * gcc.dg/graphite/block-0.c: Adjust pattern. + * gcc.dg/graphite/block-1.c: Same. + * gcc.dg/graphite/block-3.c: Same. + * gcc.dg/graphite/block-4.c: Same. + * gcc.dg/graphite/block-5.c: Same. + * gcc.dg/graphite/block-6.c: Same. + * gcc.dg/graphite/block-7.c: Same. + * gcc.dg/graphite/block-8.c: Same. + * gcc.dg/graphite/block-pr47654.c: Same. + * gcc.dg/graphite/interchange-0.c: Same. + * gcc.dg/graphite/interchange-1.c: Same. + * gcc.dg/graphite/interchange-10.c: Same. + * gcc.dg/graphite/interchange-11.c: Same. + * gcc.dg/graphite/interchange-12.c: Same. + * gcc.dg/graphite/interchange-13.c: Same. + * gcc.dg/graphite/interchange-14.c: Same. + * gcc.dg/graphite/interchange-15.c: Same. + * gcc.dg/graphite/interchange-3.c: Same. + * gcc.dg/graphite/interchange-4.c: Same. + * gcc.dg/graphite/interchange-5.c: Same. + * gcc.dg/graphite/interchange-6.c: Same. + * gcc.dg/graphite/interchange-7.c: Same. + * gcc.dg/graphite/interchange-8.c: Same. + * gcc.dg/graphite/interchange-9.c: Same. + * gcc.dg/graphite/interchange-mvt.c: Same. + * gcc.dg/graphite/pr37485.c: Same. + * gcc.dg/graphite/uns-block-1.c: Same. + * gcc.dg/graphite/uns-interchange-12.c: Same. + * gcc.dg/graphite/uns-interchange-14.c: Same. + * gcc.dg/graphite/uns-interchange-15.c: Same. + * gcc.dg/graphite/uns-interchange-9.c: Same. + * gcc.dg/graphite/uns-interchange-mvt.c: Same. + * gfortran.dg/graphite/interchange-3.f90: Same. + 2015-08-27 Uros Bizjak PR target/67317 diff --git a/gcc/testsuite/g++.dg/graphite/graphite.exp b/gcc/testsuite/g++.dg/graphite/graphite.exp index 594d065af82..2d85cf7442f 100644 --- a/gcc/testsuite/g++.dg/graphite/graphite.exp +++ b/gcc/testsuite/g++.dg/graphite/graphite.exp @@ -41,8 +41,8 @@ set wait_to_run_files [lsort [glob -nocomplain $srcdir/$subdir/*.C ] ] set scop_files [lsort [glob -nocomplain $srcdir/$subdir/scop-*.C ] ] set id_files [lsort [glob -nocomplain $srcdir/$subdir/id-*.C ] ] set run_id_files [lsort [glob -nocomplain $srcdir/$subdir/run-id-*.C ] ] -set interchange_files [lsort [glob -nocomplain $srcdir/$subdir/interchange-*.C ] ] -set block_files [lsort [glob -nocomplain $srcdir/$subdir/block-*.C ] ] +set opt_files [lsort [glob -nocomplain $srcdir/$subdir/interchange-*.C \ + $srcdir/$subdir/block-*.C ] ] # Tests to be compiled. set dg-do-what-default compile @@ -52,16 +52,14 @@ g++-dg-runtest $id_files "" "-O2 -fgraphite-identity -ffast-math" # Tests to be run. set dg-do-what-default run g++-dg-runtest $run_id_files "" "-O2 -fgraphite-identity" -g++-dg-runtest $interchange_files "" "-O2 -floop-interchange -fno-loop-block -fno-loop-strip-mine -ffast-math -fdump-tree-graphite-all" -g++-dg-runtest $block_files "" "-O2 -floop-block -fno-loop-strip-mine -fno-loop-interchange -ffast-math -fdump-tree-graphite-all" +g++-dg-runtest $opt_files "" "-O2 -floop-nest-optimize -ffast-math -fdump-tree-graphite-all" # The default action for the rest of the files is 'compile'. set dg-do-what-default compile foreach f $scop_files {lremove wait_to_run_files $f} foreach f $id_files {lremove wait_to_run_files $f} foreach f $run_id_files {lremove wait_to_run_files $f} -foreach f $interchange_files {lremove wait_to_run_files $f} -foreach f $block_files {lremove wait_to_run_files $f} +foreach f $opt_files {lremove wait_to_run_files $f} g++-dg-runtest $wait_to_run_files "" "-pedantic-errors" # Clean up. diff --git a/gcc/testsuite/gcc.dg/graphite/block-0.c b/gcc/testsuite/gcc.dg/graphite/block-0.c index 45a1d17eac2..cb08a5fe56f 100644 --- a/gcc/testsuite/gcc.dg/graphite/block-0.c +++ b/gcc/testsuite/gcc.dg/graphite/block-0.c @@ -42,4 +42,4 @@ main (void) return 0; } -/* { dg-final { scan-tree-dump-not "will be loop blocked" "graphite" } } */ +/* { dg-final { scan-tree-dump-times "not tiled" 3 "graphite" } } */ diff --git a/gcc/testsuite/gcc.dg/graphite/block-1.c b/gcc/testsuite/gcc.dg/graphite/block-1.c index 2208eb9d16b..19f9f20c3bc 100644 --- a/gcc/testsuite/gcc.dg/graphite/block-1.c +++ b/gcc/testsuite/gcc.dg/graphite/block-1.c @@ -45,4 +45,4 @@ main (void) return 0; } -/* { dg-final { scan-tree-dump-times "will be loop blocked" 3 "graphite" { xfail *-*-* } } } */ +/* { dg-final { scan-tree-dump-times "tiled by" 5 "graphite" } } */ diff --git a/gcc/testsuite/gcc.dg/graphite/block-3.c b/gcc/testsuite/gcc.dg/graphite/block-3.c index d4fd62db7eb..fd0e661696a 100644 --- a/gcc/testsuite/gcc.dg/graphite/block-3.c +++ b/gcc/testsuite/gcc.dg/graphite/block-3.c @@ -17,7 +17,7 @@ foo (void) { int i, j, k; - /* These loops contain too few iterations to be blocked by 64. */ + /* These loops contain too few iterations to be blocked. */ for (i = 0; i < 24; i++) for (j = 0; j < 24; j++) for (k = 0; k < 24; k++) @@ -58,4 +58,4 @@ main (void) return 0; } -/* { dg-final { scan-tree-dump-times "will be loop blocked" 1 "graphite" } } */ +/* { dg-final { scan-tree-dump-times "tiled by" 3 "graphite" } } */ diff --git a/gcc/testsuite/gcc.dg/graphite/block-4.c b/gcc/testsuite/gcc.dg/graphite/block-4.c index e383a66e582..744b481eaf0 100644 --- a/gcc/testsuite/gcc.dg/graphite/block-4.c +++ b/gcc/testsuite/gcc.dg/graphite/block-4.c @@ -16,7 +16,7 @@ foo (void) { int i, j, k; - /* This should NOT be blocked: each loop iterates only 24 times. */ + /* This should NOT be blocked. */ for (i = 0; i < 24; i++) for (j = 0; j < 24; j++) for (k = 0; k < 24; k++) @@ -57,4 +57,4 @@ main (void) return 0; } -/* { dg-final { scan-tree-dump-times "will be loop blocked" 1 "graphite" { xfail *-*-* } } } */ +/* { dg-final { scan-tree-dump-times "tiled by" 7 "graphite" } } */ diff --git a/gcc/testsuite/gcc.dg/graphite/block-5.c b/gcc/testsuite/gcc.dg/graphite/block-5.c index 60b7d0968c1..d30abf80fda 100644 --- a/gcc/testsuite/gcc.dg/graphite/block-5.c +++ b/gcc/testsuite/gcc.dg/graphite/block-5.c @@ -53,4 +53,4 @@ main (void) return 0; } -/* { dg-final { scan-tree-dump-times "will be loop blocked" 1 "graphite" } } */ +/* { dg-final { scan-tree-dump-times "tiled by" 3 "graphite" } } */ diff --git a/gcc/testsuite/gcc.dg/graphite/block-6.c b/gcc/testsuite/gcc.dg/graphite/block-6.c index 47fee896095..9f03448b957 100644 --- a/gcc/testsuite/gcc.dg/graphite/block-6.c +++ b/gcc/testsuite/gcc.dg/graphite/block-6.c @@ -48,4 +48,4 @@ main (void) return 0; } -/* { dg-final { scan-tree-dump-times "will be loop blocked" 0 "graphite" } } */ +/* { dg-final { scan-tree-dump-times "tiled by" 3 "graphite" } } */ diff --git a/gcc/testsuite/gcc.dg/graphite/block-7.c b/gcc/testsuite/gcc.dg/graphite/block-7.c index c07bae0652d..8b54e267078 100644 --- a/gcc/testsuite/gcc.dg/graphite/block-7.c +++ b/gcc/testsuite/gcc.dg/graphite/block-7.c @@ -54,4 +54,4 @@ main (void) return 0; } -/* { dg-final { scan-tree-dump-times "will be loop blocked" 1 "graphite" } } */ +/* { dg-final { scan-tree-dump-times "tiled by" 6 "graphite" } } */ diff --git a/gcc/testsuite/gcc.dg/graphite/block-8.c b/gcc/testsuite/gcc.dg/graphite/block-8.c index 0e9b02c52ae..d3fdf849d59 100644 --- a/gcc/testsuite/gcc.dg/graphite/block-8.c +++ b/gcc/testsuite/gcc.dg/graphite/block-8.c @@ -55,4 +55,4 @@ main (void) return 0; } -/* { dg-final { scan-tree-dump-times "will be loop blocked" 1 "graphite" } } */ +/* { dg-final { scan-tree-dump-times "tiled by" 7 "graphite" } } */ diff --git a/gcc/testsuite/gcc.dg/graphite/block-pr47654.c b/gcc/testsuite/gcc.dg/graphite/block-pr47654.c index 358c49a64d0..a7453c5e9a6 100644 --- a/gcc/testsuite/gcc.dg/graphite/block-pr47654.c +++ b/gcc/testsuite/gcc.dg/graphite/block-pr47654.c @@ -21,4 +21,4 @@ main () return 0; } -/* { dg-final { scan-tree-dump-not "will be loop blocked" "graphite" } } */ +/* { dg-final { scan-tree-dump-times "tiled by" 1 "graphite" } } */ diff --git a/gcc/testsuite/gcc.dg/graphite/graphite.exp b/gcc/testsuite/gcc.dg/graphite/graphite.exp index 9e7ede69253..f2d1417d87e 100644 --- a/gcc/testsuite/gcc.dg/graphite/graphite.exp +++ b/gcc/testsuite/gcc.dg/graphite/graphite.exp @@ -41,10 +41,10 @@ set wait_to_run_files [lsort [glob -nocomplain $srcdir/$subdir/*.c ] ] set scop_files [lsort [glob -nocomplain $srcdir/$subdir/scop-*.c ] ] set id_files [lsort [glob -nocomplain $srcdir/$subdir/id-*.c ] ] set run_id_files [lsort [glob -nocomplain $srcdir/$subdir/run-id-*.c ] ] -set interchange_files [lsort [glob -nocomplain $srcdir/$subdir/interchange-*.c \ - $srcdir/$subdir/uns-interchange-*.c ] ] -set block_files [lsort [glob -nocomplain $srcdir/$subdir/block-*.c \ - $srcdir/$subdir/uns-block-*.c ] ] +set opt_files [lsort [glob -nocomplain $srcdir/$subdir/interchange-*.c \ + $srcdir/$subdir/uns-interchange-*.c \ + $srcdir/$subdir/block-*.c \ + $srcdir/$subdir/uns-block-*.c ] ] set vect_files [lsort [glob -nocomplain $srcdir/$subdir/vect-*.c ] ] # Tests to be compiled. @@ -55,8 +55,7 @@ dg-runtest $id_files "" "-O2 -fgraphite-identity -ffast-math" # Tests to be run. set dg-do-what-default run dg-runtest $run_id_files "" "-O2 -fgraphite-identity" -dg-runtest $interchange_files "" "-O2 -floop-interchange -fno-loop-block -fno-loop-strip-mine -ffast-math -fdump-tree-graphite-all" -dg-runtest $block_files "" "-O2 -floop-block -fno-loop-strip-mine -fno-loop-interchange -ffast-math -fdump-tree-graphite-all" +dg-runtest $opt_files "" "-O2 -ffast-math -floop-nest-optimize -fdump-tree-graphite-all" # Vectorizer tests, to be run or compiled, depending on target capabilities. global DEFAULT_VECTCFLAGS @@ -71,8 +70,7 @@ set dg-do-what-default compile foreach f $scop_files {lremove wait_to_run_files $f} foreach f $id_files {lremove wait_to_run_files $f} foreach f $run_id_files {lremove wait_to_run_files $f} -foreach f $interchange_files {lremove wait_to_run_files $f} -foreach f $block_files {lremove wait_to_run_files $f} +foreach f $opt_files {lremove wait_to_run_files $f} foreach f $vect_files {lremove wait_to_run_files $f} dg-runtest $wait_to_run_files "" "-ansi -pedantic-errors" diff --git a/gcc/testsuite/gcc.dg/graphite/interchange-0.c b/gcc/testsuite/gcc.dg/graphite/interchange-0.c index 5d0406853fb..2ea8f017b8e 100644 --- a/gcc/testsuite/gcc.dg/graphite/interchange-0.c +++ b/gcc/testsuite/gcc.dg/graphite/interchange-0.c @@ -46,4 +46,4 @@ main (void) return 0; } -/* { dg-final { scan-tree-dump-times "will be interchanged" 1 "graphite" } } */ +/* { dg-final { scan-tree-dump-times "tiled by" 2 "graphite" } } */ diff --git a/gcc/testsuite/gcc.dg/graphite/interchange-1.c b/gcc/testsuite/gcc.dg/graphite/interchange-1.c index c480e83c3a3..b9f12c7d20d 100644 --- a/gcc/testsuite/gcc.dg/graphite/interchange-1.c +++ b/gcc/testsuite/gcc.dg/graphite/interchange-1.c @@ -49,4 +49,4 @@ main (void) return 0; } -/* { dg-final { scan-tree-dump-times "will be interchanged" 1 "graphite" } } */ +/* { dg-final { scan-tree-dump-times "tiled by" 2 "graphite" } } */ diff --git a/gcc/testsuite/gcc.dg/graphite/interchange-10.c b/gcc/testsuite/gcc.dg/graphite/interchange-10.c index cbb15bde65b..29e11c72257 100644 --- a/gcc/testsuite/gcc.dg/graphite/interchange-10.c +++ b/gcc/testsuite/gcc.dg/graphite/interchange-10.c @@ -46,4 +46,4 @@ main (void) return 0; } -/* { dg-final { scan-tree-dump-times "will be interchanged" 2 "graphite" } } */ +/* { dg-final { scan-tree-dump-times "tiled by" 4 "graphite" } } */ diff --git a/gcc/testsuite/gcc.dg/graphite/interchange-11.c b/gcc/testsuite/gcc.dg/graphite/interchange-11.c index f779fbdfd80..afd71230a63 100644 --- a/gcc/testsuite/gcc.dg/graphite/interchange-11.c +++ b/gcc/testsuite/gcc.dg/graphite/interchange-11.c @@ -46,4 +46,4 @@ main (void) return 0; } -/* { dg-final { scan-tree-dump-times "will be interchanged" 1 "graphite" } } */ +/* { dg-final { scan-tree-dump-times "tiled by" 2 "graphite" } } */ diff --git a/gcc/testsuite/gcc.dg/graphite/interchange-12.c b/gcc/testsuite/gcc.dg/graphite/interchange-12.c index bf95fdd98ad..9d5e04c882b 100644 --- a/gcc/testsuite/gcc.dg/graphite/interchange-12.c +++ b/gcc/testsuite/gcc.dg/graphite/interchange-12.c @@ -53,4 +53,4 @@ main (void) return 0; } -/* { dg-final { scan-tree-dump-times "will be interchanged" 1 "graphite" { xfail *-*-* } } } */ +/* { dg-final { scan-tree-dump-times "tiled by" 5 "graphite" } } */ diff --git a/gcc/testsuite/gcc.dg/graphite/interchange-13.c b/gcc/testsuite/gcc.dg/graphite/interchange-13.c index 69f6b60e3e0..0e722e2632e 100644 --- a/gcc/testsuite/gcc.dg/graphite/interchange-13.c +++ b/gcc/testsuite/gcc.dg/graphite/interchange-13.c @@ -50,4 +50,4 @@ main (void) } -/* { dg-final { scan-tree-dump-times "will be interchanged" 1 "graphite" } } */ +/* { dg-final { scan-tree-dump-times "tiled by" 2 "graphite" } } */ diff --git a/gcc/testsuite/gcc.dg/graphite/interchange-14.c b/gcc/testsuite/gcc.dg/graphite/interchange-14.c index 46f6a6deb23..55c600247c0 100644 --- a/gcc/testsuite/gcc.dg/graphite/interchange-14.c +++ b/gcc/testsuite/gcc.dg/graphite/interchange-14.c @@ -54,5 +54,4 @@ main (void) return 0; } -/* PRE destroys the perfect nest and we can't cope with that yet. */ -/* { dg-final { scan-tree-dump-times "will be interchanged" 1 "graphite" { xfail *-*-* } } } */ +/* { dg-final { scan-tree-dump-times "tiled by" 7 "graphite" } } */ diff --git a/gcc/testsuite/gcc.dg/graphite/interchange-15.c b/gcc/testsuite/gcc.dg/graphite/interchange-15.c index 9f6b7aeda44..0b6829f14cf 100644 --- a/gcc/testsuite/gcc.dg/graphite/interchange-15.c +++ b/gcc/testsuite/gcc.dg/graphite/interchange-15.c @@ -48,6 +48,4 @@ main (void) return 0; } -/* PRE destroys the perfect nest and we can't cope with that yet. */ -/* { dg-final { scan-tree-dump-times "will be interchanged" 1 "graphite" { xfail *-*-* } } } */ - +/* { dg-final { scan-tree-dump-times "tiled by" 4 "graphite" } } */ diff --git a/gcc/testsuite/gcc.dg/graphite/interchange-3.c b/gcc/testsuite/gcc.dg/graphite/interchange-3.c index 33320889af8..cdc02020197 100644 --- a/gcc/testsuite/gcc.dg/graphite/interchange-3.c +++ b/gcc/testsuite/gcc.dg/graphite/interchange-3.c @@ -47,4 +47,4 @@ main (void) return 0; } -/* { dg-final { scan-tree-dump-times "will be interchanged" 1 "graphite" } } */ +/* { dg-final { scan-tree-dump-times "tiled by" 2 "graphite" } } */ diff --git a/gcc/testsuite/gcc.dg/graphite/interchange-4.c b/gcc/testsuite/gcc.dg/graphite/interchange-4.c index 678c0ed2bde..67125658286 100644 --- a/gcc/testsuite/gcc.dg/graphite/interchange-4.c +++ b/gcc/testsuite/gcc.dg/graphite/interchange-4.c @@ -46,4 +46,4 @@ main (void) return 0; } -/* { dg-final { scan-tree-dump-times "will be interchanged" 1 "graphite" } } */ +/* { dg-final { scan-tree-dump-times "tiled by" 2 "graphite" } } */ diff --git a/gcc/testsuite/gcc.dg/graphite/interchange-5.c b/gcc/testsuite/gcc.dg/graphite/interchange-5.c index 16cadc83b2c..339e3b75f94 100644 --- a/gcc/testsuite/gcc.dg/graphite/interchange-5.c +++ b/gcc/testsuite/gcc.dg/graphite/interchange-5.c @@ -46,4 +46,4 @@ main (void) return 0; } -/* { dg-final { scan-tree-dump-times "will be interchanged" 1 "graphite" } } */ +/* { dg-final { scan-tree-dump-times "tiled by" 2 "graphite" } } */ diff --git a/gcc/testsuite/gcc.dg/graphite/interchange-6.c b/gcc/testsuite/gcc.dg/graphite/interchange-6.c index 708c739aaeb..78f358e9ed2 100644 --- a/gcc/testsuite/gcc.dg/graphite/interchange-6.c +++ b/gcc/testsuite/gcc.dg/graphite/interchange-6.c @@ -47,4 +47,4 @@ main (void) return 0; } -/* { dg-final { scan-tree-dump-times "will be interchanged" 1 "graphite" } } */ +/* { dg-final { scan-tree-dump-times "tiled by" 2 "graphite" } } */ diff --git a/gcc/testsuite/gcc.dg/graphite/interchange-7.c b/gcc/testsuite/gcc.dg/graphite/interchange-7.c index 3281e7e83bf..d99a16a291a 100644 --- a/gcc/testsuite/gcc.dg/graphite/interchange-7.c +++ b/gcc/testsuite/gcc.dg/graphite/interchange-7.c @@ -46,4 +46,4 @@ main (void) return 0; } -/* { dg-final { scan-tree-dump-times "will be interchanged" 1 "graphite" } } */ +/* { dg-final { scan-tree-dump-times "tiled by" 2 "graphite" } } */ diff --git a/gcc/testsuite/gcc.dg/graphite/interchange-8.c b/gcc/testsuite/gcc.dg/graphite/interchange-8.c index 49cfbc88e58..123106bb475 100644 --- a/gcc/testsuite/gcc.dg/graphite/interchange-8.c +++ b/gcc/testsuite/gcc.dg/graphite/interchange-8.c @@ -82,4 +82,4 @@ main (void) return 0; } -/* { dg-final { scan-tree-dump-times "will be interchanged" 2 "graphite" } } */ +/* { dg-final { scan-tree-dump-times "tiled by" 5 "graphite" } } */ diff --git a/gcc/testsuite/gcc.dg/graphite/interchange-9.c b/gcc/testsuite/gcc.dg/graphite/interchange-9.c index b023ea8a907..e4c54ae181d 100644 --- a/gcc/testsuite/gcc.dg/graphite/interchange-9.c +++ b/gcc/testsuite/gcc.dg/graphite/interchange-9.c @@ -44,4 +44,4 @@ main (void) return 0; } -/* { dg-final { scan-tree-dump-times "will be interchanged" 1 "graphite" { xfail *-*-* } } } */ +/* { dg-final { scan-tree-dump-times "tiled by" 3 "graphite" } } */ diff --git a/gcc/testsuite/gcc.dg/graphite/interchange-mvt.c b/gcc/testsuite/gcc.dg/graphite/interchange-mvt.c index 8c00f8073ef..bfa5c63b9d1 100644 --- a/gcc/testsuite/gcc.dg/graphite/interchange-mvt.c +++ b/gcc/testsuite/gcc.dg/graphite/interchange-mvt.c @@ -58,6 +58,4 @@ main (void) return 0; } -/* PRE destroys the perfect nest and we can't cope with that yet. */ -/* { dg-final { scan-tree-dump-times "will be interchanged" 1 "graphite" { xfail *-*-* } } } */ - +/* { dg-final { scan-tree-dump-times "tiled by" 7 "graphite" } } */ diff --git a/gcc/testsuite/gcc.dg/graphite/pr37485.c b/gcc/testsuite/gcc.dg/graphite/pr37485.c index 9543ce4fd54..0a6dfbceefc 100644 --- a/gcc/testsuite/gcc.dg/graphite/pr37485.c +++ b/gcc/testsuite/gcc.dg/graphite/pr37485.c @@ -1,4 +1,4 @@ -/* { dg-options "-O2 -floop-block -fno-loop-strip-mine -fno-loop-interchange -ffast-math -fdump-tree-graphite-all" } */ +/* { dg-options "-O2 -floop-block -ffast-math -fdump-tree-graphite-all" } */ typedef unsigned char UChar; typedef int Int32; @@ -30,4 +30,5 @@ void fallbackSort ( UInt32* fmap, } AssertH ( j < 256, 1005 ); } -/* { dg-final { scan-tree-dump-times "Loop blocked" 1 "graphite" { xfail *-*-* }} } */ + +/* { dg-final { scan-tree-dump-times "tiled by" 1 "graphite" } } */ diff --git a/gcc/testsuite/gcc.dg/graphite/uns-block-1.c b/gcc/testsuite/gcc.dg/graphite/uns-block-1.c index c50b7708ef7..12a62919b5f 100644 --- a/gcc/testsuite/gcc.dg/graphite/uns-block-1.c +++ b/gcc/testsuite/gcc.dg/graphite/uns-block-1.c @@ -45,4 +45,4 @@ main (void) return 0; } -/* { dg-final { scan-tree-dump-times "will be loop blocked" 3 "graphite" } } */ +/* { dg-final { scan-tree-dump-times "tiled by" 4 "graphite" } } */ diff --git a/gcc/testsuite/gcc.dg/graphite/uns-interchange-12.c b/gcc/testsuite/gcc.dg/graphite/uns-interchange-12.c index bd21ba9bc4b..d9c07e2fe21 100644 --- a/gcc/testsuite/gcc.dg/graphite/uns-interchange-12.c +++ b/gcc/testsuite/gcc.dg/graphite/uns-interchange-12.c @@ -54,4 +54,4 @@ main (void) return 0; } -/* { dg-final { scan-tree-dump-times "will be interchanged" 1 "graphite" } } */ +/* { dg-final { scan-tree-dump-times "tiled by" 4 "graphite" } } */ diff --git a/gcc/testsuite/gcc.dg/graphite/uns-interchange-14.c b/gcc/testsuite/gcc.dg/graphite/uns-interchange-14.c index b1abd13c02e..7ef575b667d 100644 --- a/gcc/testsuite/gcc.dg/graphite/uns-interchange-14.c +++ b/gcc/testsuite/gcc.dg/graphite/uns-interchange-14.c @@ -55,5 +55,4 @@ main (void) return 0; } -/* PRE destroys the perfect nest and we can't cope with that yet. */ -/* { dg-final { scan-tree-dump-times "will be interchanged" 1 "graphite" } } */ +/* { dg-final { scan-tree-dump-times "tiled by" 6 "graphite" } } */ diff --git a/gcc/testsuite/gcc.dg/graphite/uns-interchange-15.c b/gcc/testsuite/gcc.dg/graphite/uns-interchange-15.c index a5a2e2781b6..0e32fd61456 100644 --- a/gcc/testsuite/gcc.dg/graphite/uns-interchange-15.c +++ b/gcc/testsuite/gcc.dg/graphite/uns-interchange-15.c @@ -49,6 +49,4 @@ main (void) return 0; } -/* PRE destroys the perfect nest and we can't cope with that yet. */ -/* { dg-final { scan-tree-dump-times "will be interchanged" 1 "graphite" } } */ - +/* { dg-final { scan-tree-dump-times "tiled by" 2 "graphite" } } */ diff --git a/gcc/testsuite/gcc.dg/graphite/uns-interchange-9.c b/gcc/testsuite/gcc.dg/graphite/uns-interchange-9.c index 6bfd3d61f23..31b132253c6 100644 --- a/gcc/testsuite/gcc.dg/graphite/uns-interchange-9.c +++ b/gcc/testsuite/gcc.dg/graphite/uns-interchange-9.c @@ -45,4 +45,4 @@ main (void) return 0; } -/* { dg-final { scan-tree-dump-times "will be interchanged" 1 "graphite" } } */ +/* { dg-final { scan-tree-dump-times "tiled by" 2 "graphite" } } */ diff --git a/gcc/testsuite/gcc.dg/graphite/uns-interchange-mvt.c b/gcc/testsuite/gcc.dg/graphite/uns-interchange-mvt.c index 80f67897f92..eebece38698 100644 --- a/gcc/testsuite/gcc.dg/graphite/uns-interchange-mvt.c +++ b/gcc/testsuite/gcc.dg/graphite/uns-interchange-mvt.c @@ -59,6 +59,4 @@ main (void) return 0; } -/* PRE destroys the perfect nest and we can't cope with that yet. */ -/* { dg-final { scan-tree-dump-times "will be interchanged" 1 "graphite" } } */ - +/* { dg-final { scan-tree-dump-times "tiled by" 3 "graphite" } } */ diff --git a/gcc/testsuite/gfortran.dg/graphite/graphite.exp b/gcc/testsuite/gfortran.dg/graphite/graphite.exp index 1df46ead2c1..93863c32922 100644 --- a/gcc/testsuite/gfortran.dg/graphite/graphite.exp +++ b/gcc/testsuite/gfortran.dg/graphite/graphite.exp @@ -38,9 +38,9 @@ set save-dg-do-what-default ${dg-do-what-default} dg-init set wait_to_run_files [lsort [glob -nocomplain $srcdir/$subdir/*.\[fF\]{,90,95,03,08} ] ] -set block_files [lsort [glob -nocomplain $srcdir/$subdir/block-*.\[fF\]{,90,95,03,08} ] ] set id_files [lsort [glob -nocomplain $srcdir/$subdir/id-*.\[fF\]{,90,95,03,08} ] ] -set interchange_files [lsort [glob -nocomplain $srcdir/$subdir/interchange-*.\[fF\]{,90,95,03,08} ] ] +set opt_files [lsort [glob -nocomplain $srcdir/$subdir/interchange-*.\[fF\]{,90,95,03,08} \ + $srcdir/$subdir/block-*.\[fF\]{,90,95,03,08} ] ] set scop_files [lsort [glob -nocomplain $srcdir/$subdir/scop-*.\[fF\]{,90,95,03,08} ] ] set run_id_files [lsort [glob -nocomplain $srcdir/$subdir/run-id-*.\[fF\]{,90,95,03,08} ] ] set vect_files [lsort [glob -nocomplain $srcdir/$subdir/vect-*.\[fF\]{,90,95,03,08} ] ] @@ -49,8 +49,7 @@ set vect_files [lsort [glob -nocomplain $srcdir/$subdir/vect-*.\[fF\]{,90 set dg-do-what-default compile gfortran-dg-runtest $scop_files "" "-O2 -fgraphite -fdump-tree-graphite-all" gfortran-dg-runtest $id_files "" "-O2 -fgraphite-identity -ffast-math" -gfortran-dg-runtest $interchange_files "" "-O2 -floop-interchange -fno-loop-block -fno-loop-strip-mine -ffast-math -fdump-tree-graphite-all" -gfortran-dg-runtest $block_files "" "-O2 -floop-block -fno-loop-strip-mine -fno-loop-interchange -ffast-math -fdump-tree-graphite-all" +gfortran-dg-runtest $opt_files "" "-O2 -floop-nest-optimize -ffast-math -fdump-tree-graphite-all" # Vectorizer tests, to be run or compiled, depending on target capabilities. if [check_vect_support_and_set_flags] { @@ -63,9 +62,8 @@ gfortran-dg-runtest $run_id_files "" "-O2 -fgraphite-identity" # The default action for the rest of the files is 'compile'. set dg-do-what-default compile -foreach f $block_files {lremove wait_to_run_files $f} foreach f $id_files {lremove wait_to_run_files $f} -foreach f $interchange_files {lremove wait_to_run_files $f} +foreach f $opt_files {lremove wait_to_run_files $f} foreach f $scop_files {lremove wait_to_run_files $f} foreach f $run_id_files {lremove wait_to_run_files $f} foreach f $vect_files {lremove wait_to_run_files $f} diff --git a/gcc/testsuite/gfortran.dg/graphite/interchange-3.f90 b/gcc/testsuite/gfortran.dg/graphite/interchange-3.f90 index ffc84b60703..a99cf153d9e 100644 --- a/gcc/testsuite/gfortran.dg/graphite/interchange-3.f90 +++ b/gcc/testsuite/gfortran.dg/graphite/interchange-3.f90 @@ -24,4 +24,4 @@ Program FOO end Program FOO -! { dg-final { scan-tree-dump-times "will be interchanged" 1 "graphite" } } +! { dg-final { scan-tree-dump-times "tiled by" 2 "graphite" } }