Looks good to me. (ChangeLog entry?) Thanks, Richard.
On Thu, Aug 27, 2015 at 12:14 AM, Sebastian Pop <s....@samsung.com> wrote: > --- > gcc/Makefile.in | 2 - > gcc/common.opt | 16 +- > gcc/doc/invoke.texi | 108 +- > gcc/graphite-blocking.c | 270 ----- > gcc/graphite-interchange.c | 656 ------------ > gcc/graphite-optimize-isl.c | 14 +- > gcc/graphite-poly.c | 489 +-------- > gcc/graphite-poly.h | 1082 > -------------------- > gcc/graphite-sese-to-poly.c | 22 +- > gcc/graphite.c | 10 +- > gcc/testsuite/g++.dg/graphite/graphite.exp | 10 +- > gcc/testsuite/gcc.dg/graphite/block-0.c | 2 +- > gcc/testsuite/gcc.dg/graphite/block-1.c | 2 +- > gcc/testsuite/gcc.dg/graphite/block-3.c | 4 +- > gcc/testsuite/gcc.dg/graphite/block-4.c | 4 +- > gcc/testsuite/gcc.dg/graphite/block-5.c | 2 +- > gcc/testsuite/gcc.dg/graphite/block-6.c | 2 +- > gcc/testsuite/gcc.dg/graphite/block-7.c | 2 +- > gcc/testsuite/gcc.dg/graphite/block-8.c | 2 +- > gcc/testsuite/gcc.dg/graphite/block-pr47654.c | 2 +- > gcc/testsuite/gcc.dg/graphite/graphite.exp | 14 +- > gcc/testsuite/gcc.dg/graphite/interchange-0.c | 2 +- > gcc/testsuite/gcc.dg/graphite/interchange-1.c | 2 +- > gcc/testsuite/gcc.dg/graphite/interchange-10.c | 2 +- > gcc/testsuite/gcc.dg/graphite/interchange-11.c | 2 +- > gcc/testsuite/gcc.dg/graphite/interchange-12.c | 2 +- > gcc/testsuite/gcc.dg/graphite/interchange-13.c | 2 +- > gcc/testsuite/gcc.dg/graphite/interchange-14.c | 3 +- > gcc/testsuite/gcc.dg/graphite/interchange-15.c | 4 +- > gcc/testsuite/gcc.dg/graphite/interchange-3.c | 2 +- > gcc/testsuite/gcc.dg/graphite/interchange-4.c | 2 +- > gcc/testsuite/gcc.dg/graphite/interchange-5.c | 2 +- > gcc/testsuite/gcc.dg/graphite/interchange-6.c | 2 +- > gcc/testsuite/gcc.dg/graphite/interchange-7.c | 2 +- > gcc/testsuite/gcc.dg/graphite/interchange-8.c | 2 +- > gcc/testsuite/gcc.dg/graphite/interchange-9.c | 2 +- > gcc/testsuite/gcc.dg/graphite/interchange-mvt.c | 4 +- > gcc/testsuite/gcc.dg/graphite/pr37485.c | 5 +- > gcc/testsuite/gcc.dg/graphite/uns-block-1.c | 2 +- > gcc/testsuite/gcc.dg/graphite/uns-interchange-12.c | 2 +- > gcc/testsuite/gcc.dg/graphite/uns-interchange-14.c | 3 +- > gcc/testsuite/gcc.dg/graphite/uns-interchange-15.c | 4 +- > gcc/testsuite/gcc.dg/graphite/uns-interchange-9.c | 2 +- > .../gcc.dg/graphite/uns-interchange-mvt.c | 4 +- > gcc/testsuite/gfortran.dg/graphite/graphite.exp | 10 +- > 45 files changed, 98 insertions(+), 2686 deletions(-) > delete mode 100644 gcc/graphite-blocking.c > delete mode 100644 gcc/graphite-interchange.c > > diff --git a/gcc/Makefile.in b/gcc/Makefile.in > index e298ecc..3d1c1e5 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 0964ae4..94d1d88 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 c33cc27..8710ff8 100644 > --- a/gcc/doc/invoke.texi > +++ b/gcc/doc/invoke.texi > @@ -8733,102 +8733,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 > @@ -8846,13 +8763,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 3434294..0000000 > --- 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 <sebastian....@amd.com> and > - Pranav Garg <pranav.garg2...@gmail.com>. > - > -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 > -<http://www.gnu.org/licenses/>. */ > - > -#include "config.h" > - > -#ifdef HAVE_isl > -/* Workaround for GMP 5.1.3 bug, see PR56019. */ > -#include <stddef.h> > - > -#include <isl/constraint.h> > -#include <isl/set.h> > -#include <isl/map.h> > -#include <isl/union_map.h> > -#include <isl/constraint.h> > - > -#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 6b14955..0000000 > --- 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 <sebastian....@amd.com> and > - Harsha Jagasia <harsha.jaga...@amd.com>. > - > -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 > -<http://www.gnu.org/licenses/>. */ > - > -#include "config.h" > - > -#ifdef HAVE_isl > -/* Workaround for GMP 5.1.3 bug, see PR56019. */ > -#include <stddef.h> > - > -#include <isl/constraint.h> > -#include <isl/aff.h> > -#include <isl/set.h> > -#include <isl/map.h> > -#include <isl/union_map.h> > -#include <isl/ilp.h> > -#include <isl/val.h> > - > -/* 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 <isl/val_gmp.h> > -#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 470dbfa..ffa4465 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 7ea9389..55ddb80 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,6 @@ 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_pdrs (file, pbb, verbosity); > print_pbb_body (file, pbb, verbosity, false); > > @@ -748,58 +547,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 +572,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 +583,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 +634,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 +649,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 +664,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 +679,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 +726,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<poly_bb_p> bbs, int *i) > -{ > - poly_bb_p pbb; > - vec<lst_p> 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<lst_p> 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<poly_bb_p> 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 29813e0..3bd22f0 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<poly_dr_p> 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<lst_p> 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<lst_p> 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<lst_p> 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<lst_p> 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<lst_p> 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<lst_p> 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<poly_bb_p> 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<scop_p> ); > 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<poly_bb_p> , int); > __isl_give isl_union_map *extend_schedule (__isl_take isl_union_map *); > > - > void > compute_deps (scop_p scop, vec<poly_bb_p> pbbs, > isl_union_map **must_raw, > diff --git a/gcc/graphite-sese-to-poly.c b/gcc/graphite-sese-to-poly.c > index 0c97eba..e64a6fc 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 4acc172..c57c2ba 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)) > diff --git a/gcc/testsuite/g++.dg/graphite/graphite.exp > b/gcc/testsuite/g++.dg/graphite/graphite.exp > index 594d065..2d85cf7 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 45a1d17..cb08a5f 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 2208eb9..19f9f20 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 d4fd62d..fd0e661 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 e383a66..744b481 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 60b7d09..d30abf80 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 47fee89..9f03448 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 c07bae065..8b54e26 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 0e9b02c..d3fdf84 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 358c49a..a7453c5 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 9e7ede6..f2d1417 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 5d04068..2ea8f01 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 c480e83..b9f12c7 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 cbb15bd..29e11c7 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 f779fbd..afd7123 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 bf95fdd..9d5e04c 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 69f6b60..0e722e2 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 46f6a6d..55c6002 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 9f6b7ae..0b6829f 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 3332088..cdc0202 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 678c0ed..6712565 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 16cadc8..339e3b7 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 708c739..78f358e 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 3281e7e..d99a16a 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 49cfbc8..123106b 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 b023ea8..e4c54ae 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 8c00f80..bfa5c63 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 9543ce4..0a6dfbc 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 c50b770..12a6291 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 bd21ba9..d9c07e2 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 b1abd13..7ef575b 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 a5a2e27..0e32fd6 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 6bfd3d6..31b1322 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 80f6789..eebece3 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 1df46ea..93863c3 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} > -- > 2.1.0.243.g30d45f7 >