blob: b62a274529dab2193380c44566d1f5f0300eb0fd [file] [log] [blame]
/**-------------------------------------------------------------------**
** CLooG **
**-------------------------------------------------------------------**
** loop.h **
**-------------------------------------------------------------------**
** First version: october 26th 2001 **
**-------------------------------------------------------------------**/
/******************************************************************************
* CLooG : the Chunky Loop Generator (experimental) *
******************************************************************************
* *
* Copyright (C) 2001-2005 Cedric Bastoul *
* *
* This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Lesser General Public *
* License as published by the Free Software Foundation; either *
* version 2.1 of the License, or (at your option) any later version. *
* *
* This library 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 *
* Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU Lesser General Public *
* License along with this library; if not, write to the Free Software *
* Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301 USA *
* *
* CLooG, the Chunky Loop Generator *
* Written by Cedric Bastoul, Cedric.Bastoul@inria.fr *
* *
******************************************************************************/
#ifndef CLOOG_LOOP_H
#define CLOOG_LOOP_H
#if defined(__cplusplus)
extern "C"
{
#endif
/**
* CloogLoop structure:
* this structure contains all the informations of a loop generated or to be
* generated.
* - if the loop has not been processed yet (it is not a result of a call to
* cloog_loop_generate), the domain is the whole iteration domain of a given
* block, the stride is 1 (i.e. there is no stride), block is necessarily not
* NULL and inner is NULL.
* - if the loop comes as a result of a cloog_loop_generate call, the domain
* describes the constraints (guards and loop bounds) for only one dimension
* (the last one: outer dimensions being considered as parameters), the stride
* may differ from one (this means that on the considered dimension, a step of
* 'stride' must be considered between integral point, the first integral
* point to be considered being the lower bound of the loop), inner may differ
* from NULL, meaning that there are further dimensions and nesting levels in
* the loop.
*/
struct cloogloop
{
CloogState *state; /**< State. */
CloogDomain * domain ; /**< The iteration domain. */
CloogDomain *unsimplified; /**< Unsimplified version of domain. */
int otl; /**< Loop is executed at most once. */
CloogStride *stride; /**< If not NULL, stride information on iterator
* (filled only after loop generation).
*/
CloogBlock * block ; /**< The included statement block, NULL if none.*/
void * usr; /**< User field, for library user convenience.
* This pointer is not freed when the
* CloogLoop structure is freed.
*/
struct cloogloop * inner ; /**< Loops at the next level. */
struct cloogloop * next ; /**< Next loop at the same level. */
} ;
typedef struct cloogloop CloogLoop ;
/******************************************************************************
* Structure display function *
******************************************************************************/
void cloog_loop_print_structure(FILE *, CloogLoop *, int) ;
void cloog_loop_print(FILE *, CloogLoop *) ;
/******************************************************************************
* Memory deallocation function *
******************************************************************************/
void cloog_loop_free(CloogLoop *) ;
/******************************************************************************
* Reading functions *
******************************************************************************/
CloogLoop *cloog_loop_from_domain(CloogState *state, CloogDomain *domain,
int number);
CloogLoop * cloog_loop_read(CloogState *state,
FILE * foo, int number, int nb_parameters);
/******************************************************************************
* Processing functions *
******************************************************************************/
CloogLoop * cloog_loop_block(CloogLoop *loop, int *scaldims, int nb_scattdims);
CloogLoop * cloog_loop_malloc(CloogState *state);
CloogLoop *cloog_loop_generate(CloogLoop *loop, CloogDomain *context,
int level, int scalar, int *scaldims, int nb_scattdims,
CloogOptions *options);
CloogLoop *cloog_loop_simplify(CloogLoop *loop, CloogDomain *context, int level,
int nb_scattdims, CloogOptions *options);
void cloog_loop_scatter(CloogLoop *, CloogScattering *);
#if defined(__cplusplus)
}
#endif
#endif /* define _H */