GCC Middle and Back End API 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 () |
|
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 |
Strip-mines all the loops of LST with STRIDE. Return the number of loops strip-mined.
Referenced by lst_do_strip_mine().
|
static |
Returns true when strip mining with STRIDE of the loop LST is profitable.
|
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 and Pranav Garg tian .pop@ amd. comprana. v.ga rg210 7@gm ail.c 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.