GCC Middle and Back End API Reference
graphite-blocking.c File Reference

Functions

static void pbb_strip_mine_time_depth ()
static bool lst_strip_mine_profitable_p ()
static int lst_do_strip_mine_loop ()
static int lst_do_strip_mine ()
int scop_do_strip_mine ()
bool scop_do_block ()

Function Documentation

static int lst_do_strip_mine ( )
static
@verbatim 

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

References lst_add_loop_under_loop(), lst_depth(), and lst_do_strip_mine_loop().

static int lst_do_strip_mine_loop ( )
static
   Strip-mines all the loops of LST with STRIDE.  Return the number of
   loops strip-mined.  

Referenced by lst_do_strip_mine().

static bool lst_strip_mine_profitable_p ( )
static
   Returns true when strip mining with STRIDE of the loop LST is
   profitable.  
static void pbb_strip_mine_time_depth ( )
static
@verbatim 

Heuristics and transform for loop blocking and strip mining on polyhedral representation.

Copyright (C) 2009-2013 Free Software Foundation, Inc. Contributed by Sebastian Pop sebas.nosp@m.tian.nosp@m..pop@.nosp@m.amd..nosp@m.com and Pranav Garg prana.nosp@m.v.ga.nosp@m.rg210.nosp@m.7@gm.nosp@m.ail.c.nosp@m.om.

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/.

   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) ;
   #   }
   # }
     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.  
     Lower bound of the striped loop.  
     Upper bound of the striped loop.  
     Static scheduling for ITER level.
     This is mandatory to keep the 2d + 1 canonical scheduling format.  
bool scop_do_block ( )
   Loop blocks all the loops in SCOP.  Returns true when we manage to
   block some loops.  
     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.  
int scop_do_strip_mine ( )
   Strip mines all the loops in SCOP.  Returns the number of
   strip-mined loops.