summaryrefslogtreecommitdiff
path: root/cloog-core/doc/cloog.texi
diff options
context:
space:
mode:
authorjk7744.park <jk7744.park@samsung.com>2015-09-09 02:18:21 +0900
committerjk7744.park <jk7744.park@samsung.com>2015-09-09 02:18:21 +0900
commit40ef93558be42b604f5eb912414f767972a70b8c (patch)
treedd3a18995e2d72f452f3804d87b8a205f0f0a936 /cloog-core/doc/cloog.texi
parenteea72ec0021ec2c1c84631af37435123c063eaf1 (diff)
downloadcloog-tizen_2.3.1.tar.gz
cloog-tizen_2.3.1.tar.bz2
cloog-tizen_2.3.1.zip
Diffstat (limited to 'cloog-core/doc/cloog.texi')
-rw-r--r--cloog-core/doc/cloog.texi2528
1 files changed, 2528 insertions, 0 deletions
diff --git a/cloog-core/doc/cloog.texi b/cloog-core/doc/cloog.texi
new file mode 100644
index 0000000..00f32c8
--- /dev/null
+++ b/cloog-core/doc/cloog.texi
@@ -0,0 +1,2528 @@
+\input texinfo
+@c %
+@c % /**-----------------------------------------------------------------**
+@c % ** CLooG **
+@c % **-----------------------------------------------------------------**
+@c % ** cloog.texi **
+@c % **-----------------------------------------------------------------**
+@c % ** First version: july 6th 2002 **
+@c % **-----------------------------------------------------------------**/
+@c %
+@c % release 1.0: September 17th 2002
+@c % release 1.1: December 5th 2002
+@c % release 1.2: April 22th 2003
+@c % release 2.0: November 21th 2005 (and now in texinfo instead of LaTeX)
+@c % release 2.1: October 15th 2007
+@c %
+@c %/**************************************************************************
+@c % * CLooG : the Chunky Loop Generator (experimental) *
+@c % **************************************************************************/
+@c %/* CAUTION: the English used is probably the worst you ever read, please
+@c % * feel free to correct and improve it !
+@c % */
+
+@c %\textit{"I found the ultimate transformation functions, optimization for
+@c %static control programs is now a closed problem, I have \textnormal{just}
+@c %to generate the target code !"}
+
+
+
+@c % /*************************************************************************
+@c % * PART I: HEADER *
+@c % *************************************************************************/
+@c %**start of header
+@setfilename cloog.info
+@settitle CLooG - a loop generator for scanning polyhedra
+
+@set EDITION 2.1
+@include gitversion.texi
+@set UPDATED October 15th 2007
+@setchapternewpage odd
+
+@c %**end of header
+
+@c % /*************************************************************************
+@c % * PART II: SUMMARY DESCRIPTION AND COPYRIGHT *
+@c % *************************************************************************/
+
+@copying
+This manual is for CLooG version @value{VERSION}, a software
+which generates loops for scanning Z-polyhedra. That is, CLooG produces a
+code visiting each integral point of a union of parametrized
+polyhedra. CLooG is designed to avoid control overhead and to produce a very
+efficient code.
+
+It would be quite kind to refer the following paper in any publication that
+results from the use of the CLooG software or its library:
+
+@example
+@@InProceedings@{Bas04,
+@ @ author =@ @ @ @ @{C. Bastoul@},
+@ @ title =@ @ @ @ @ @{Code Generation in the Polyhedral Model
+@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ Is Easier Than You Think@},
+@ @ booktitle = @{PACT'13 IEEE International Conference on
+@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ Parallel Architecture and Compilation Techniques@},
+@ @ year =@ @ @ @ @ @ 2004,
+@ @ pages =@ @ @ @ @ @{7--16@},
+@ @ month =@ @ @ @ @ @{september@},
+@ @ address =@ @ @ @{Juan-les-Pins@}
+@}
+@end example
+
+Copyright @copyright{} 2002-2005 C@'edric Bastoul.
+
+@c quotation
+Permission is granted to copy, distribute and/or modify this document under
+the terms of the GNU Free Documentation License, Version 1.2
+published by the Free Software Foundation. To receive a copy of the
+GNU Free Documentation License, write to the Free Software Foundation, Inc.,
+59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+@c end quotation
+@end copying
+
+@c % /*************************************************************************
+@c % * PART III: TITLEPAGE, CONTENTS, COPYRIGHT *
+@c % *************************************************************************/
+@titlepage
+@title CLooG
+@subtitle A Loop Generator For Scanning Polyhedra
+@subtitle Edition @value{EDITION}, for CLooG @value{VERSION}
+@subtitle @value{UPDATED}
+@author C@'edric Bastoul
+
+@c The following two commands start the copyright page.
+@page
+@noindent (September 2001)
+@table @code
+@item C@'edric Bastoul
+SCHEDULES GENERATE !!! I just need to apply them now, where can I find
+a good code generator ?!
+
+@item Paul Feautrier
+Hmmm. I fear that if you want something powerful enough, you'll have to
+write it yourself !
+@end table
+
+@vskip 0pt plus 1filll
+@insertcopying
+@end titlepage
+
+@c Output the table of contents at the beginning.
+@contents
+
+@c % /*************************************************************************
+@c % * PART IV: TOP NODE AND MASTER MENU *
+@c % *************************************************************************/
+@ifnottex
+@node Top
+@top CLooG
+
+@insertcopying
+@end ifnottex
+
+@menu
+* Introduction::
+* CLooG Software::
+* CLooG Library::
+@c * Hacking::
+* Installing::
+* Documentation::
+* References::
+@end menu
+
+
+
+@c % /*************************************************************************
+@c % * PART V: BODY OF THE DOCUMENT *
+@c % *************************************************************************/
+
+@c % ****************************** INTRODUCTION ******************************
+@node Introduction
+@chapter Introduction
+CLooG is a free software and library generating loops for scanning Z-polyhedra.
+That is, it finds a code (e.g. in C, FORTRAN...) that reaches each integral
+point of one or more parameterized polyhedra. CLooG has been originally
+written to solve the code generation problem for optimizing compilers based on
+the polytope model. Nevertheless it is used now in various area, e.g., to build
+control automata for high-level synthesis or to find the best polynomial
+approximation of a function. CLooG may help in any situation where scanning
+polyhedra matters. It uses the best state-of-the-art code generation
+algorithm known as the Quiller@'e et al. algorithm (@pxref{Qui00})
+with our own improvements and extensions (@pxref{Bas04}).
+The user has full control on generated code quality.
+On one hand, generated code size has to be tuned for sake of
+readability or instruction cache use. On the other hand, we must ensure that
+a bad control management does not hamper performance of the generated code,
+for instance by producing redundant guards or complex loop bounds.
+CLooG is specially designed to avoid control overhead and to produce a very
+efficient code.
+
+CLooG stands for @emph{Chunky Loop Generator}: it is a part of the Chunky
+project, a research tool for data locality improvement (@pxref{Bas03a}).
+It is designed
+also to be the back-end of automatic parallelizers like LooPo (@pxref{Gri04}).
+Thus it is very
+compilable code oriented and provides powerful program transformation
+facilities. Mainly, it allows the user to specify very general schedules where,
+e.g., unimodularity or invertibility of the transformation doesn't matter.
+
+The current version is still under
+evaluation, and there is no guarantee that the upward compatibility
+will be respected (but the previous API has been stable for two years,
+we hope this one will be as successful -and we believe it-).
+A lot of reports are necessary to freeze the library
+API and the input file shape. Most API changes from 0.12.x to 0.14.x
+have been requested by the users themselves.
+Thus you are very welcome and encouraged
+to post reports on bugs, wishes, critics, comments, suggestions or
+successful experiences in the forum of @code{http://www.CLooG.org}
+or to send them to cedric.bastoul@@inria.fr directly.
+
+@menu
+* Basics::
+* Scattering::
+@end menu
+
+@node Basics
+@section Basically, what's the point ?
+If you want to use CLooG, this is because you want to scan or to find
+something inside the integral points of a set of polyhedra. There are many
+reasons for that. Maybe you need the generated code itself because it
+actually implements a very smart program transformation you found.
+Maybe you want to use the generated code
+because you know that the solution of your problem belongs to the integral
+points of those damned polyhedra and you don't know which one. Maybe you just
+want to know if a polyhedron has integral points depending on some parameters,
+which is the lexicographic minimum, maximum, the third on the basis of the
+left etc. Probably you have your own reasons to use CLooG.
+
+Let us illustrate a basic use of CLooG. Suppose we have a set of affine
+constraints that describes a part of a whatever-dimensional space,
+called a @strong{domain}, and we
+want to scan it. Let us consider for instance the following set of constraints
+where @samp{i}
+and @samp{j} are the unknown (the two dimensions of the space) and
+@samp{m} and @samp{n} are the parameters (some symbolic constants):
+@example
+@group
+2<=i<=n
+2<=j<=m
+j<=n+2-i
+@end group
+@end example
+Let us also consider that we have a partial knowledge of the parameter values,
+called the @strong{context}, expressed as affine constraints as well,
+for instance:
+@example
+@group
+m>=2
+n>=2
+@end group
+@end example
+Note that using parameters is optional, if you are not comfortable with
+parameter manipulation, just replace them with any scalar value that fits
+@code{m>=2} and @code{n>=2}.
+A graphical representation of this part of the 2-dimensional space, where
+the integral points are represented using heavy dots would be for instance:
+
+@image{images/basic,6cm}
+
+The affine constraints of both the domain and the context are what we will
+provide to CLooG as input (in a particular shape that will be described later).
+The output of CLooG is a pseudo-code to scan the integral points of the
+input domain according to the context:
+@example
+@group
+for (i=2;i<=n;i++) @{
+ for (j=2;j<=min(m,-i+n+2);j++) @{
+ S1(i,j) ;
+ @}
+@}
+@end group
+@end example
+If you felt such a basic example is yet interesting, there is a good chance
+that CLooG is appropriate for you. CLooG can do much more: scanning several
+polyhedra or unions of polyhedra at the same time, applying general affine
+transformations to the polyhedra, generate compilable code etc. Welcome
+to the CLooG's user's guide !
+
+@node Scattering
+@section Defining a Scanning Order: Scattering Functions
+In CLooG, domains only define the set of integral points to scan and their
+coordinates. In particular, CLooG is free to choose the scanning order for
+generating the most efficient code. This means, for optimizing/parallelizing
+compiler people, that CLooG doesn't make any speculation on dependences on and
+between statements (by the way, it's not its job !).
+For instance, if an user give to
+CLooG only two domains @code{S1:1<=i<=n}, @code{S2:1<=i<=n} and the context
+@code{n>=1}, the following pseudo-codes are considered to be equivalent:
+
+@example
+@group
+/* A convenient target pseudo-code. */
+for (i=1;i<=N;i++) @{
+ S1(i) ;
+@}
+for (i=1;i<=N;i++) @{
+ S2(i) ;
+@}
+@end group
+@end example
+
+@example
+@group
+/* Another convenient target pseudo-code. */
+for (i=1;i<=N;i++) @{
+ S1(i) ;
+ S2(i) ;
+@}
+@end group
+@end example
+
+The default behaviour
+of CLooG is to generate the second one, since it is optimized in control.
+It is right if there are no data dependences
+between @code{S1} and @code{S2}, but wrong otherwise.
+
+Thus it is often useful to force scanning to respect a given order. This can be
+done in CLooG by using @strong{scattering functions}. Scattering is a
+shortcut for scheduling, allocation, chunking functions and the like we can
+find in the restructuring compilation literature. There are a lot of reasons
+to scatter the integral points of the domains (i.e. the statement instances
+of a program, for compilation people), parallelization or optimization are good
+examples. For instance, if the user wants for any reason to set some
+precedence constraints between the statements of our example above
+in order to force the generation of the
+first code, he can do it easily by setting (for example) the following
+scheduling functions:
+
+@tex
+$$\theta _{S1}(i) = (1)$$
+$$\theta _{S2}(j) = (2)$$
+@end tex
+
+@ifnottex
+@example
+@group
+T_S1(i) = (1)
+T_S2(j) = (2)
+@end group
+@end example
+@end ifnottex
+
+This scattering means that each integral point of the domain @code{S1}
+is scanned at logical date @code{1} while each integral point of the domain
+@code{S2} is scanned at logical date @code{2}. As a result, the whole
+domain @code{S1} is scanned before domain @code{S2} and the first code in our
+example is generated.
+
+The user can set every kind of affine scanning order thanks to the
+scattering functions. Each domain has its own scattering function and
+each scattering function may be multi-dimensional. A multi-dimensional logical
+date may be seen as classical date (year,month,day,hour,minute,etc.) where
+the first dimensions are the most significant. Each scattering dimension
+may depend linearly on the original dimensions (e.g., @code{i}), the
+parameters (e.g., @code{n}) ans scalars (e.g., @code{2}).
+
+A very useful example of multi-dimensional scattering functions is, for
+compilation people, the scheduling of the original program.
+The basic data to use for code generation are statement iteration domains.
+As we saw, these data are not sufficient to rebuild the original
+program (what is the ordering between instances of different statements ?).
+The missing data can be put in the scattering functions as the original
+scheduling. The method to compute it is quite simple (@pxref{Fea92}). The idea is to
+build an abstract syntax tree of the program and to read the scheduling for
+each statement. For instance, let us consider the following implementation of
+a Cholesky factorization:
+
+@example
+@group
+/* A Cholesky factorization kernel. */
+for (i=1;i<=N;i++) @{
+ for (j=1;j<=i-1;j++) @{
+ a[i][i] -= a[i][j] ; /* S1 */
+ @}
+ a[i][i] = sqrt(a[i][i]) ; /* S2 */
+ for (j=i+1;j<=N;j++) @{
+ for (k=1;k<=i-1;k++) @{
+ a[j][i] -= a[j][k]*a[i][k] ; /* S3 */
+ @}
+ a[j][i] /= a[i][i] ; /* S4 */
+ @}
+ @}
+@}
+@end group
+@end example
+
+The corresponding abstract syntax tree is given in the following figure.
+It directly gives the scattering functions (schedules) for all the
+statements of the program.
+
+@image{images/tree,6cm}
+
+@tex
+$$
+\hbox{$ \cases{ \theta _{S1}(i,j)^T &$= (0,i,0,j,0)^T$\cr
+ \theta _{S2}(i) &$= (0,i,1)^T$\cr
+ \theta _{S3}(i,j,k)^T &$= (0,i,2,j,0,k,0)^T$\cr
+ \theta _{S4}(i,j)^T &$= (0,i,2,j,1)^T$}$}
+$$
+@end tex
+
+@ifnottex
+@example
+@group
+T_S1(i,j)^T = (0,i,0,j,0)^T
+T_S2(i) = (0,i,1)^T
+T_S3(i,j,k)^T = (0,i,2,j,0,k,0)^T
+T_S4(i,j)^T = (0,i,2,j,1)^T
+@end group
+@end example
+@end ifnottex
+
+These schedules depend on the iterators and give for each instance of each
+statement a unique execution date. Using such scattering functions allow
+CLooG to re-generate the input code.
+
+
+
+
+
+@c % ***********************Using the CLooG Software **************************
+@node CLooG Software
+@chapter Using the CLooG Software
+
+
+@menu
+* A First Example::
+* Writing The Input File::
+* Calling CLooG::
+* CLooG Options::
+* Full Example::
+@end menu
+
+@c %/*************************************************************************
+@c % * A FIRST EXAMPLE *
+@c % *************************************************************************/
+@node A First Example
+@section A First Example
+CLooG takes as input a file that must be written accordingly to a grammar
+described in depth in a further section (@pxref{Writing The Input File}).
+Moreover it supports many options to tune the target code presentation or
+quality as discussed in a dedicated section (@pxref{Calling CLooG}).
+However, a basic use
+of CLooG is not very complex and we present in this section how to generate the
+code corresponding to a basic example discussed earlier (@pxref{Basics}).
+
+The problem is to find the code that scans a 2-dimensional polyhedron
+where @samp{i} and @samp{j} are the unknown (the two dimensions of the space)
+and @samp{m} and @samp{n} are the parameters (the symbolic constants),
+defined by the following set of constraints:
+@example
+@group
+2<=i<=n
+2<=j<=m
+j<=n+2-i
+@end group
+@end example
+@noindent We also consider a partial knowledge of the parameter values,
+expressed thanks to the following affine constraints:
+@example
+@group
+m>=2
+n>=2
+@end group
+@end example
+
+An input file that corresponds to this problem, and asks for a generated
+code in C, may be the following. Note that we do not describe here precisely
+the structure and the components of this file (@pxref{Writing The Input File}
+ for such information, if you feel it necessary):
+
+@example
+# ---------------------- CONTEXT ----------------------
+c # language is C
+
+# Context (constraints on two parameters)
+2 4 # 2 lines and 4 columns
+# eq/in m n 1 eq/in: 1 for inequality >=0, 0 for equality =0
+ 1 1 0 -2 # 1*m + 0*n -2*1 >= 0, i.e. m>=2
+ 1 0 1 -2 # 0*m + 1*n -2*1 >= 0, i.e. n>=2
+
+1 # We want to set manually the parameter names
+m n # parameter names
+
+# --------------------- STATEMENTS --------------------
+1 # Number of statements
+
+1 # First statement: one domain
+# First domain
+5 6 # 5 lines and 6 columns
+# eq/in i j m n 1
+ 1 1 0 0 0 -2 # i >= 2
+ 1 -1 0 0 1 0 # i <= n
+ 1 0 1 0 0 -2 # j >= 2
+ 1 0 -1 1 0 0 # j <= m
+ 1 -1 -1 0 1 2 # n+2-i>=j
+0 0 0 # for future options
+
+1 # We want to set manually the iterator names
+i j # iterator names
+
+# --------------------- SCATTERING --------------------
+0 # No scattering functions
+@end example
+
+This file may be called @samp{basic.cloog}
+(this example is provided in the CLooG distribution as
+@code{test/manual_basic.cloog}) and we can ask CLooG to process it
+and to generate the code by a simple calling to CLooG with this file as input:
+@samp{cloog basic.cloog}. By default, CLooG will print the generated code in
+the standard output:
+
+@example
+@group
+/* Generated by CLooG v@value{VERSION} in 0.00s. */
+for (i=2;i<=n;i++) @{
+ for (j=2;j<=min(m,-i+n+2);j++) @{
+ S1(i,j) ;
+ @}
+@}
+@end group
+@end example
+
+@c %/*************************************************************************
+@c % * Input file *
+@c % *************************************************************************/
+@node Writing The Input File
+@section Writing The Input File
+The input text file contains a problem description, i.e. the context,
+the domains and the scattering functions.
+Because CLooG is very 'compilable code generation oriented', we can associate
+some additional informations to each domain. We call this association a
+@emph{statement}. The set of all informations is
+called a @emph{program}. The input file respects the grammar below
+(terminals are preceded by "_"):
+
+@example
+File ::= Program
+Program ::= Context Statements Scattering
+Context ::= Language Domain_union Naming
+Statements ::= Nb_statements Statement_list Naming
+Scatterings ::= Nb_functions Scattering_list Naming
+Naming ::= Option Name_list
+Name_list ::= _String Name_list | (void)
+Statement_list ::= Statement Statement_list | (void)
+Domain_list ::= _Domain Domain_list | (void)
+Scattering_list ::= Domain_union Scattering_list | (void)
+Statement ::= Iteration_domain 0 0 0
+Iteration_domain ::= Domain_union
+Domain_union ::= Nb_domains Domain_list
+Option ::= 0 | 1
+Language ::= c | f
+Nb_statements ::= _Integer
+Nb_domains ::= _Integer
+Nb_functions ::= _Integer
+@end example
+
+Note: if there is only one domain in a @samp{Domain_union},
+i.e., if @samp{Nb_domains} is 1, then this 1 may be omitted.
+
+@itemize @bullet
+@item @samp{Context} represents the informations that are
+ shared by all the statements. It consists on
+ the language used (which can be @samp{c} for C or @samp{f} for FORTRAN 90)
+ and the global constraints on parameters.
+ These constraints are essential
+ since they give to CLooG the number of parameters. If there is no
+ parameter or no constraints on parameters, just give a constraint
+ always satisfied like @math{1 \geq 0}. @samp{Naming} sets the parameter
+ names.
+ If the naming option @samp{Option} is 1, parameter names will be read
+ on the next line. There must be exactly as many names as parameters.
+ If the naming option @samp{Option} is 0, parameter names are
+ automatically generated. The name of the first parameter will
+ be @samp{M}, and the name of the @math{(n+1)^{th}} parameter directly
+ follows the name of the @math{n^{th}} parameter in ASCII code.
+ It is the user responsibility to ensure that parameter names,
+ iterators and scattering dimension names are different.
+@item @samp{Statements} represents the informations on the statements.
+ @samp{Nb_statements} is the number of statements in the program,
+ i.e. the number of @samp{Statement} items in the @samp{Statement_list}.
+ @samp{Statement} represents the informations on a given statement.
+ To each statement is associated a domain
+ (the statement iteration domain: @samp{Iteration_domain}) and three
+ zeroes that represents future options.
+ @samp{Naming} sets the iterator names. If the naming option
+ @samp{Option} is 1, the iterator names
+ will be read on the next line. There must be exactly as many names as
+ nesting level in the deepest iteration domain. If the naming option
+ @samp{Option} is 0, iterator names are automatically generated.
+ The iterator name of the outermost loop will be @samp{i}, and the
+ iterator name of the loop at level @math{n+1} directly follows the
+ iterator name of the loop at level @math{n} in ASCII code.
+@item @samp{Scatterings} represents the informations on scattering functions.
+ @samp{Nb_functions} is the number of functions (it must be
+ equal to the number of statements or 0 if there is no scattering
+ function). The functions themselves are represented through
+ @samp{Scattering_list}.
+ @samp{Naming} sets the scattering dimension names. If the naming option
+ @samp{Option} is 1, the scattering dimension names will be read on the
+ next line.
+ There must be exactly as many names as scattering dimensions. If the
+ naming option @samp{Option} is 0, scattering dimension names are automatically
+ generated. The name of the @math{n^{th}} scattering dimension
+ will be @samp{cn}.
+@end itemize
+
+@menu
+* Domain Representation::
+* Scattering Representation::
+@end menu
+
+@node Domain Representation
+@subsection Domain Representation
+As shown by the grammar, the input file describes the various informations
+thanks to characters, integers and domains. Each domain is defined by a set of
+constraints in the PolyLib format (@pxref{Wil93}). They have the
+following syntax:
+@enumerate
+@item some optional comment lines beginning with @samp{#},
+@item the row and column numbers, possibly followed by comments,
+@item the constraint rows, each row corresponds to a constraint the
+ domain have to satisfy. Each row must be on a single line and is possibly
+ followed by comments. The constraint is an equality @math{p(x) = 0} if the
+ first element is 0, an inequality @math{p(x) \geq 0} if the first element
+ is 1. The next elements are the unknown coefficients, followed by
+ the parameter coefficients. The last element is the constant factor.
+@end enumerate
+For instance, assuming that @samp{i}, @samp{j} and @samp{k} are iterators and
+@samp{m} and @samp{n} are parameters, the domain defined by the following
+constraints :
+
+@tex
+$$
+\hbox{$ \cases{ -i + m &$\geq 0$\cr
+ -j + n &$\geq 0$\cr
+ i + j - k &$\geq 0$}$}
+$$
+@end tex
+
+@ifnottex
+@example
+@group
+ -i + m >= 0
+ -j + n >= 0
+i + j - k >= 0
+@end group
+@end example
+@end ifnottex
+
+@noindent can be written in the input file as follows :
+
+@example
+@group
+# This is the domain
+3 7 # 3 lines and 7 columns
+# eq/in i j k m n 1
+ 1 -1 0 0 1 0 0 # -i + m >= 0
+ 1 0 -1 0 0 1 0 # -j + n >= 0
+ 1 1 1 -1 0 0 0 # i + j - k >= 0
+@end group
+@end example
+
+Each iteration domain @samp{Iteration_domain} of a given statement
+is a union of polyhedra
+@samp{Domain_union}. A union is defined by its number of elements
+@samp{Nb_domains} and the elements themselves @samp{Domain_list}.
+For instance, let us consider the following pseudo-code:
+
+@example
+@group
+for (i=1;i<=n;i++) @{
+ if ((i >= m) || (i <= 2*m))
+ S1 ;
+ for (j=i+1;j<=m;j++)
+ S2 ;
+@}
+@end group
+@end example
+
+@noindent The iteration domain of @samp{S1} can be divided into two
+polyhedra and written in the input file as follows:
+
+@example
+@group
+2 # Number of polyhedra in the union
+# First domain
+3 5 # 3 lines and 5 columns
+# eq/in i m n 1
+ 1 1 0 0 -1 # i >= 1
+ 1 -1 0 1 0 # i <= n
+ 1 1 -1 0 0 # i >= m
+# Second domain
+3 5 # 3 lines and 5 columns
+# eq/in i m n 1
+ 1 1 0 0 -1 # i >= 1
+ 1 -1 0 1 0 # i <= n
+ 1 -1 2 0 0 # i <= 2*m
+@end group
+@end example
+
+@node Scattering Representation
+@subsection Scattering Function Representation
+Scattering functions are depicted in the input file thanks a representation
+very close to the domain one.
+An integer gives the number of functions @samp{Nb_functions} and each function
+is represented by a domain. Each line of the domain corresponds to an equality
+defining a dimension of the function. Note that at present
+(CLooG @value{VERSION})
+@strong{all functions must have the same scattering dimension number}. If a
+user wants to set scattering functions with different dimensionality, he has
+to complete the smaller one with zeroes to reach the maximum dimensionality.
+For instance, let us consider the following code and
+scheduling functions:
+
+@example
+@group
+for (i=1;i<=n;i++) @{
+ if ((i >= m) || (i <= 2*m))
+ S1 ;
+ for (j=i+1;j<=m;j++)
+ S2 ;
+@}
+@end group
+@end example
+
+@tex
+$$
+\hbox{$ \cases{ \theta _{S1}(i) &$= (i,0)^T$\cr
+ \theta _{S2}(i,j)^T &$= (n,i+j)^T$}$}
+$$
+@end tex
+
+@ifnottex
+@example
+@group
+T_S1(i) = (i,0)^T
+T_S2(i,j)^T = (n,i+j)^T
+@end group
+@end example
+@end ifnottex
+
+
+@noindent This scheduling can be written in the input file as follows:
+
+@example
+@group
+2 # Number of scattering functions
+# First function
+2 7 # 2 lines and 7 columns
+# eq/in c1 c2 i m n 1
+ 0 1 0 -1 0 0 0 # c1 = i
+ 0 0 1 0 0 0 0 # c2 = 0
+# Second function
+2 8 # 2 lines and 8 columns
+# eq/in c1 c2 i j m n 1
+ 0 1 0 0 0 0 -1 0 # c1 = n
+ 0 0 1 -1 -1 0 0 0 # c2 = i+j
+@end group
+@end example
+The complete input file for the user who wants to generate the code for this
+example with the preceding scheduling would be
+(this file is provided in the CLooG distribution
+as @code{test/manual_scattering.cloog}:
+
+@example
+# ---------------------- CONTEXT ----------------------
+c # language is C
+
+# Context (no constraints on two parameters)
+1 4 # 1 lines and 4 columns
+# eq/in m n 1
+ 1 0 0 0 # 0 >= 0, always true
+
+1 # We want to set manually the parameter names
+m n # parameter names
+
+# --------------------- STATEMENTS --------------------
+2 # Number of statements
+
+2 # First statement: two domains
+# First domain
+3 5 # 3 lines and 5 columns
+# eq/in i m n 1
+ 1 1 0 0 -1 # i >= 1
+ 1 -1 0 1 0 # i <= n
+ 1 1 -1 0 0 # i >= m
+# Second domain
+3 5 # 3 lines and 5 columns
+# eq/in i m n 1
+ 1 1 0 0 -1 # i >= 1
+ 1 -1 0 1 0 # i <= n
+ 1 -1 2 0 0 # i <= 2*m
+0 0 0 # for future options
+
+1 # Second statement: one domain
+4 6 # 4 lines and 6 columns
+# eq/in i j m n 1
+ 1 1 0 0 0 -1 # i >= 1
+ 1 -1 0 0 1 0 # i <= n
+ 1 -1 1 0 0 -1 # j >= i+1
+ 1 0 -1 1 0 0 # j <= m
+0 0 0 # for future options
+
+1 # We want to set manually the iterator names
+i j # iterator names
+
+# --------------------- SCATTERING --------------------
+2 # Scattering functions
+# First function
+2 7 # 2 lines and 7 columns
+# eq/in p1 p2 i m n 1
+ 0 1 0 -1 0 0 0 # p1 = i
+ 0 0 1 0 0 0 0 # p2 = 0
+# Second function
+2 8 # 2 lines and 8 columns
+# eq/in p1 p2 i j m n 1
+ 0 1 0 0 0 0 -1 0 # p1 = n
+ 0 0 1 -1 -1 0 0 0 # p2 = i+j
+
+1 # We want to set manually the scattering dimension names
+p1 p2 # scattering dimension names
+@end example
+
+
+@c %/*************************************************************************
+@c % * Calling CLooG *
+@c % *************************************************************************/
+@node Calling CLooG
+@section Calling CLooG
+CLooG is called by the following command:
+@example
+ cloog [ options | file ]
+@end example
+The default behavior of CLooG is to read the input informations from a file and
+to print the generated code or pseudo-code on the standard output.
+CLooG's behavior and the output code shape is under the user control thanks
+to many options which are detailed a further section (@pxref{CLooG Options}).
+@code{file} is the input file. @code{stdin} is a special value: when used,
+input is standard input. For instance, we can call CLooG to treat the
+input file @code{basic.cloog} with default options by typing:
+@code{cloog basic.cloog} or @code{more basic.cloog | cloog stdin}.
+
+@c %/*************************************************************************
+@c % * CLooG Options *
+@c % *************************************************************************/
+@node CLooG Options
+@section CLooG Options
+
+@menu
+* Last Depth to Optimize Control::
+* First Depth to Optimize Control::
+* Simplify Convex Hull::
+* Once Time Loop Elimination::
+* Equality Spreading::
+* First Level for Spreading::
+* Statement Block::
+* Loop Strides::
+* Compilable Code::
+* Output::
+* Help::
+* Version ::
+* Quiet ::
+@end menu
+
+@node Last Depth to Optimize Control
+@subsection Last Depth to Optimize Control @code{-l <depth>}
+
+@code{-l <depth>}: this option sets the last loop depth to be optimized in
+control. The higher this depth, the less control overhead.
+For instance, with some input file, a user can generate
+different pseudo-codes with different @code{depth} values as shown below.
+@example
+@group
+/* Generated using a given input file and @strong{option -l 1} */
+for (i=0;i<=M;i++) @{
+ S1 ;
+ for (j=0;j<=N;j++) @{
+ S2 ;
+ @}
+ for (j=0;j<=N;j++) @{
+ S3 ;
+ @}
+ S4 ;
+@}
+@end group
+@end example
+@example
+@group
+/* Generated using the same input file but @strong{option -l 2} */
+for (i=0;i<=M;i++) @{
+ S1 ;
+ for (j=0;j<=N;j++) @{
+ S2 ;
+ S3 ;
+ @}
+ S4 ;
+@}
+@end group
+@end example
+ In this example we can see that this option can change the operation
+ execution order between statements. Let us remind that CLooG does not
+ make any speculation on dependences between statements
+ (@pxref{Scattering}). Thus if nothing (i.e. scattering functions)
+ forbids this, CLooG considers the above codes to be equivalent.
+ If there is no scattering functions, the minimum value for @code{depth}
+ is 1 (in the case of 0, the user doesn't really need a loop generator !),
+ and the number of scattering dimensions otherwise (CLooG will warn the
+ user if he doesn't respect such constraint).
+ The maximum value for depth is -1 (infinity).
+ Default value is infinity.
+
+@node First Depth to Optimize Control
+@subsection First Depth to Optimize Control @code{-f <depth>}
+
+ @code{-f <depth>}: this option sets the first loop depth to be optimized
+ in control. The lower this depth, the less control overhead (and the longer
+ the generated code). For instance, with some input file, a user
+ can generate different pseudo-codes with different @code{depth} values
+ as shown below.
+ The minimum value for @code{depth} is 1, and the
+ maximum value is -1 (infinity).
+ Default value is 1.
+@example
+@group
+/* Generated using a given input file and @strong{option -f 3} */
+for (i=1;i<=N;i++) @{
+ for (j=1;j<=M;j++) @{
+ S1 ;
+ if (j >= 10) @{
+ S2 ;
+ @}
+ @}
+@}
+@end group
+@end example
+@example
+@group
+/* Generated using the same input file but @strong{option -f 2} */
+for (i=1;i<=N;i++) @{
+ for (j=1;j<=9;j++) @{
+ S1 ;
+ @}
+ for (j=10;j<=M;j++) @{
+ S1 ;
+ S2 ;
+ @}
+@}
+@end group
+@end example
+
+@node Simplify Convex Hull
+@subsection Simplify Convex Hull @code{-sh <boolean>}
+
+ @code{-sh <boolean>}: this option enables (@code{boolean=1})
+ or forbids (@code{boolean=0}) a simplification step
+ that may simplify some constraints.
+ This option works only for generated code without
+ code duplication (it means, you have to tune @code{-f} and
+ @code{-l} options first to generate only a loop nest with internal
+ guards). For instance, with the input file @code{test/union.cloog}, a user
+ can generate different pseudo-codes as shown below.
+ Default value is 0.
+@example
+@group
+/* Generated using test/union.cloog and @strong{option -f -1 -l 2 -override} */
+for (i=0;i<=11;i++) @{
+ for (j=max(0,5*i-50);j<=min(15,5*i+10);j++) @{
+ if ((i <= 10) && (j <= 10)) @{
+ S1 ;
+ @}
+ if ((i >= 1) && (j >= 5)) @{
+ S2 ;
+ @}
+ @}
+@}
+@end group
+@end example
+@example
+@group
+/* Generated using the same input file but @strong{option -sh 1 -f -1 -l 2 -override} */
+for (i=0;i<=11;i++) @{
+ for (j=0;j<=15;j++) @{
+ if ((i <= 10) && (j <= 10)) @{
+ S1 ;
+ @}
+ if ((i >= 1) && (j >= 5)) @{
+ S2 ;
+ @}
+ @}
+@}
+@end group
+@end example
+
+@node Once Time Loop Elimination
+@subsection Once Time Loop Elimination @code{-otl <boolean>}
+
+ @code{-otl <boolean>}: this option allows (@code{boolean=1}) or
+ forbids (@code{boolean=0}) the simplification of loops running
+ once. Default value is 1.
+@example
+@group
+/* Generated using a given input file and @strong{option -otl 0} */
+for (j=i+1;j<=i+1;j++) @{
+ S1 ;
+@}
+@end group
+@end example
+@example
+@group
+/* Generated using the same input file but @strong{option -otl 1} */
+j = i+1 ;
+S1 ;
+@end group
+@end example
+
+
+@node Equality Spreading
+@subsection Equality Spreading @code{-esp <boolean>}
+
+ @code{-esp <boolean>}: this option allows (@code{boolean=1}) or
+ forbids (@code{boolean=0}) values spreading when there
+ are equalities. Default value is 1.
+@example
+@group
+/* Generated using a given input file and @strong{option -esp 0} */
+i = M+2 ;
+j = N ;
+for (k=i;k<=j+M;k++) @{
+ S1 ;
+@}
+@end group
+@end example
+@example
+@group
+/* Generated using the same input file but @strong{option -esp 1} */
+for (k=M+2;k<=N+M;k++) @{
+ S1(i = M+2, j = N) ;
+@}
+@end group
+@end example
+
+
+@node First Level for Spreading
+@subsection First Level for Spreading @code{-fsp <level>}
+
+ @code{-fsp <level>}: it can be useful to set a
+ first level to begin equality spreading. Particularly when using
+ scattering functions, the user may want to see the scattering dimension
+ values instead of spreading or hiding them. If user has set a
+ spreading, @code{level} is
+ the first level to start it. Default value is 1.
+@example
+@group
+/* Generated using a given input file and @strong{option -fsp 1} */
+for (j=0;j<=N+M;j++) @{
+ S1(i = N) ;
+@}
+for (j=0;j<=N+M;j++) @{
+ S1(i = M) ;
+@}
+@end group
+@end example
+@example
+@group
+/* Generated using the same input file but @strong{option -fsp 2} */
+c1 = N ;
+for (j=0;j<=c1+M;j++) @{
+ S1(i = c1) ;
+@}
+c1 = M ;
+for (j=0;j<=N+c1;j++) @{
+ S1(i = c1) ;
+@}
+@end group
+@end example
+
+
+@node Statement Block
+@subsection Statement Block @code{-block <boolean>}
+
+ @code{-block <boolean>}: this option allows (@code{boolean=1}) to
+ create a statement block for each new iterator, even if there is only
+ an equality. This can be useful in order to parse the generated
+ pseudo-code. When @code{boolean} is set to 0 or when the generation
+ language is FORTRAN, this feature is disabled. Default value is 0.
+@example
+@group
+/* Generated using a given input file and @strong{option -block 0} */
+i = M+2 ;
+j = N ;
+S1 ;
+@end group
+@end example
+@example
+@group
+/* Generated using the same input file but @strong{option -block 1} */
+@{ i = M+2 ;
+ @{ j = N ;
+ S1 ;
+ @}
+@}
+@end group
+@end example
+
+
+@node Loop Strides
+@subsection Loop Strides @code{-strides <boolean>}
+
+ @code{-strides <boolean>}: this options allows (@code{boolean=1}) to
+ handle non-unit strides for loop increments. This can remove a lot of
+ guards and make the generated code more efficient. Default value is 0.
+@example
+@group
+/* Generated using a given input file and @strong{option -strides 0} */
+for (i=1;i<=n;i++) @{
+ if (i%2 == 0) @{
+ S1(j = i/2) ;
+ @}
+ if (i%4 == 0) @{
+ S2(j = i/4) ;
+ @}
+@}
+@end group
+@end example
+@example
+@group
+/* Generated using the same input file but @strong{option -strides 1} */
+for (i=2;i<=n;i+=2) @{
+ S1(j = i/2) ;
+ if (i%4 == 0) @{
+ S2(j = i/4) ;
+ @}
+@}
+@end group
+@end example
+
+@node Compilable Code
+@subsection Compilable Code @code{-compilable <value>}
+
+ @code{-compilable <value>}: this options allows (@code{value} is not 0)
+ to generate a compilable code where all parameters have the integral value
+ @code{value}. This option creates a macro for each statement. Since
+ CLooG do not know anything about the statement sources, it fills the
+ macros with a basic increment that computes the total number of
+ scanned integral points. The user may change easily the macros according
+ to his own needs. This option is possible only if the generated code is
+ in C. Default value is 0.
+@example
+@group
+/* Generated using a given input file and @strong{option -compilable 0} */
+for (i=0;i<=n;i++) @{
+ for (j=0;j<=n;j++) @{
+ S1 ;
+ S2 ;
+ @}
+ S3 ;
+@}
+@end group
+@end example
+@example
+/* Generated using the same input file but @strong{option -compilable 10} */
+/* DON'T FORGET TO USE -lm OPTION TO COMPILE. */
+
+/* Useful headers. */
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+/* Parameter value. */
+#define PARVAL 10
+
+/* Statement macros (please set). */
+#define S1(i,j) @{total++;@}
+#define S2(i,j) @{total++;@}
+#define S3(i) @{total++;@}
+
+int main() @{
+ /* Original iterators. */
+ int i, j ;
+ /* Parameters. */
+ int n=PARVAL, total=0 ;
+
+ for (i=0;i<=n;i++) @{
+ for (j=0;j<=n;j++) @{
+ S1(i,j) ;
+ S2(i,j) ;
+ @}
+ S3(i) ;
+ @}
+
+ printf("Number of integral points: %d.\n",total) ;
+ return 0 ;
+@}
+@end example
+
+@node Callable Code
+@subsection Callable Code @code{-callable <boolean>}
+
+ @code{-callable <boolean>}: if @code{boolean=1}, then a @code{test}
+ function will be generated that has the parameters as arguments.
+ Similarly to the @code{-compilable} option,
+ a macro for each statement is generated. The generated definitions of
+ these macros are as used during the correctness testing, but they
+ can easily be changed by the user to suit her own needs.
+ This option is only available if the target language is C.
+ The default value is 0.
+
+@example
+/* Generated from double.cloog with @strong{option -callable 0} */
+for (i=0;i<=M;i++) @{
+ S1 ;
+ for (j=0;j<=N;j++) @{
+ S2 ;
+ S3 ;
+ @}
+ S4 ;
+@}
+@end example
+@example
+/* Generated from double.cloog with @strong{option -callable 1} */
+extern void hash(int);
+
+/* Useful macros. */
+#define floord(n,d) (((n)<0) ? ((n)-(d)+1)/(d) : (n)/(d))
+#define ceild(n,d) (((n)<0) ? (n)/(d) : ((n)+(d)+1)/(d))
+#define max(x,y) ((x) > (y) ? (x) : (y))
+#define min(x,y) ((x) < (y) ? (x) : (y))
+
+#define S1(i) @{ hash(1); hash(i); @}
+#define S2(i,j) @{ hash(2); hash(i); hash(j); @}
+#define S3(i,j) @{ hash(3); hash(i); hash(j); @}
+#define S4(i) @{ hash(4); hash(i); @}
+
+void test(int M, int N)
+@{
+ /* Original iterators. */
+ int i, j;
+ for (i=0;i<=M;i++) @{
+ S1(i) ;
+ for (j=0;j<=N;j++) @{
+ S2(i,j) ;
+ S3(i,j) ;
+ @}
+ S4(i) ;
+ @}
+@}
+@end example
+
+@node Output
+@subsection Output @code{-o <output>}
+
+ @code{-o <output>}: this option sets the output file. @code{stdout} is a
+ special value: when used, output is standard output.
+ Default value is @code{stdout}.
+
+@node Help
+@subsection Help @code{--help} or @code{-h}
+
+ @code{--help} or @code{-h}: this option ask CLooG to print a short help.
+
+@node Version
+@subsection Version @code{--version} or @code{-v}
+
+ @code{--version} or @code{-v}: this option ask CLooG to print some version
+ informations.
+
+@node Quiet
+@subsection Quiet @code{--quiet} or @code{-q}
+
+ @code{--quiet} or @code{-q}: this option tells CLooG not to print
+ any informational messages.
+
+
+@c %/*************************************************************************
+@c % * A Full Example *
+@c % *************************************************************************/
+@node Full Example
+@section A Full Example
+
+Let us consider the allocation problem of a Gaussian elimination, i.e. we want
+to distribute the various statement instances of the compute kernel onto
+different processors. The original code is the following:
+@example
+@group
+for (i=1;j<=N-1;i++) @{
+ for (j=i+1;j<=N;j++) @{
+ c[i][j] = a[j][i]/a[i][i] ; /* S1 */
+ for (k=i+1;k<=N;k++) @{
+ a[j][k] -= c[i][j]*a[i][k] ; /* S2 */
+ @}
+ @}
+@}
+@end group
+@end example
+
+@noindent The best affine allocation functions can be found by any good automatic
+parallelizer like LooPo (@pxref{Gri04}):
+
+@tex
+$$
+\hbox{$ \cases{ \theta _{S1}(i,j)^T &$= (i)$\cr
+ \theta _{S2}(i,j,k)^T &$= (k)$}$}
+$$
+@end tex
+
+@ifnottex
+@example
+@group
+T_S1(i,j)^T = (i)
+T_S2(i,j,k)^T = (k)
+@end group
+@end example
+@end ifnottex
+
+@noindent To ensure that on each processor, the set of statement instances is
+executed according to the original ordering, we add as minor scattering
+dimensions the original scheduling (@pxref{Scattering}):
+
+@tex
+$$
+\hbox{$ \cases{ \theta _{S1}(i,j)^T &$= (i,0,i,0,j,0)^T$\cr
+ \theta _{S2}(i,j,k)^T &$= (k,0,i,0,j,1,k,0)^T$}$}
+$$
+@end tex
+
+@ifnottex
+@example
+@group
+T_S1(i,j)^T = (i,0,i,0,j,0)^T
+T_S2(i,j,k)^T = (k,0,i,0,j,1,k,0)^T
+@end group
+@end example
+@end ifnottex
+
+@noindent To ensure that the scattering functions have the same dimensionality, we
+complete the first function with zeroes
+(this is a CLooG @value{VERSION} and previous versions requirement,
+it should be removed in a future version, don't worry it's absolutely legal !):
+
+@tex
+$$
+\hbox{$ \cases{ \theta _{S1}(i,j)^T &$= (i,0,i,0,j,0,0,0)^T$\cr
+ \theta _{S2}(i,j,k)^T &$= (k,0,i,0,j,1,k,0)^T$}$}
+$$
+@end tex
+
+@ifnottex
+@example
+@group
+T_S1(i,j)^T = (i,0,i,0,j,0,0,0)^T
+T_S2(i,j,k)^T = (k,0,i,0,j,1,k,0)^T
+@end group
+@end example
+@end ifnottex
+
+@noindent The input file corresponding to this code generation problem
+could be (this file is provided in the CLooG distribution
+as @code{test/manual_gauss.cloog}:
+
+@example
+# ---------------------- CONTEXT ----------------------
+c # language is C
+
+# Context (no constraints on one parameter)
+1 3 # 1 line and 3 columns
+# eq/in n 1
+ 1 0 0 # 0 >= 0, always true
+
+1 # We want to set manually the parameter name
+n # parameter name
+
+# --------------------- STATEMENTS --------------------
+2 # Number of statements
+
+1 # First statement: one domain
+4 5 # 4 lines and 3 columns
+# eq/in i j n 1
+ 1 1 0 0 -1 # i >= 1
+ 1 -1 0 1 -1 # i <= n-1
+ 1 -1 1 0 -1 # j >= i+1
+ 1 0 -1 1 0 # j <= n
+0 0 0 # for future options
+
+1
+# Second statement: one domain
+6 6 # 6 lines and 3 columns
+# eq/in i j k n 1
+ 1 1 0 0 0 -1 # i >= 1
+ 1 -1 0 0 1 -1 # i <= n-1
+ 1 -1 1 0 0 -1 # j >= i+1
+ 1 0 -1 0 1 0 # j <= n
+ 1 -1 0 1 0 -1 # k >= i+1
+ 1 0 0 -1 1 0 # k <= n
+0 0 0 # for future options
+
+0 # We let CLooG set the iterator names
+
+# --------------------- SCATTERING --------------------
+2 # Scattering functions
+# First function
+8 13 # 3 lines and 3 columns
+# eq/in p1 p2 p3 p4 p5 p6 p7 p8 i j n 1
+ 0 1 0 0 0 0 0 0 0 -1 0 0 0 # p1 = i
+ 0 0 1 0 0 0 0 0 0 0 0 0 0 # p2 = 0
+ 0 0 0 1 0 0 0 0 0 -1 0 0 0 # p3 = i
+ 0 0 0 0 1 0 0 0 0 0 0 0 0 # p4 = 0
+ 0 0 0 0 0 1 0 0 0 0 -1 0 0 # p5 = j
+ 0 0 0 0 0 0 1 0 0 0 0 0 0 # p6 = 0
+ 0 0 0 0 0 0 0 1 0 0 0 0 0 # p7 = 0
+ 0 0 0 0 0 0 0 0 1 0 0 0 0 # p8 = 0
+# Second function
+8 14 # 3 lines and 3 columns
+# eq/in p1 p2 p3 p4 p5 p6 p7 p8 i j k n 1
+ 0 1 0 0 0 0 0 0 0 0 0 -1 0 0 # p1 = k
+ 0 0 1 0 0 0 0 0 0 0 0 0 0 0 # p2 = 0
+ 0 0 0 1 0 0 0 0 0 -1 0 0 0 0 # p3 = i
+ 0 0 0 0 1 0 0 0 0 0 0 0 0 0 # p4 = 0
+ 0 0 0 0 0 1 0 0 0 0 -1 0 0 0 # p5 = j
+ 0 0 0 0 0 0 1 0 0 0 0 0 0 -1 # p6 = 1
+ 0 0 0 0 0 0 0 1 0 0 0 -1 0 0 # p7 = k
+ 0 0 0 0 0 0 0 0 1 0 0 0 0 0 # p8 = 0
+
+1 # We want to set manually the scattering dimension names
+p1 p2 p3 p4 p5 p6 p7 p8 # scattering dimension names
+@end example
+
+Calling CLooG, with for instance the command line
+@code{cloog -fsp 2 gauss.cloog} for a better view
+of the allocation (the processor number is given by @code{p1}),
+will result on the following target code that actually implements
+the transformation. A minor processing on the dimension @code{p1}
+to implement, e.g., MPI calls, which is not shown here may
+result in dramatic speedups !
+
+@example
+if (n >= 2) @{
+ p1 = 1 ;
+ for (p5=2;p5<=n;p5++) @{
+ S1(i = 1,j = p5) ;
+ @}
+@}
+for (p1=2;p1<=n-1;p1++) @{
+ for (p3=1;p3<=p1-1;p3++) @{
+ for (p5=p3+1;p5<=n;p5++) @{
+ S2(i = p3,j = p5,k = p1) ;
+ @}
+ @}
+ for (p5=p1+1;p5<=n;p5++) @{
+ S1(i = p1,j = p5) ;
+ @}
+@}
+if (n >= 2) @{
+ p1 = n ;
+ for (p3=1;p3<=n-1;p3++) @{
+ for (p5=p3+1;p5<=n;p5++) @{
+ S2(i = p3,j = p5,k = n) ;
+ @}
+ @}
+@}
+@end example
+
+
+@c %/*************************************************************************
+@c % * A Full Example *
+@c % *************************************************************************/
+@node CLooG Library
+@chapter Using the CLooG Library
+The CLooG Library was implemented to allow the user to call CLooG
+directly from his programs, without file accesses or system calls. The
+user only needs to link his programs with C libraries. The CLooG
+library mainly provides one function (@code{cloog_clast_create_from_input})
+which takes as input the problem
+description with some options, and returns the data structure corresponding
+to the generated code (a @code{struct clast_stmt} structure)
+which is more or less an abstract syntax tree.
+The user can work with this data structure and/or use
+our pretty printing function to write the final code in either C or FORTRAN.
+Some other functions are provided for convenience reasons.
+These functions as well as the data structures are described in this section.
+
+@menu
+* CLooG Data Structures::
+* CLooG Output::
+* Retrieving version information::
+* Example of Library Utilization::
+@end menu
+
+
+@node CLooG Data Structures
+@section CLooG Data Structures Description
+In this section, we describe the data structures used by the loop
+generator to represent and to process a code generation problem.
+
+@menu
+* CloogState::
+* CloogMatrix::
+* CloogDomain::
+* CloogScattering::
+* CloogUnionDomain::
+* CloogStatement::
+* CloogOptions::
+* CloogInput::
+@end menu
+
+
+@node CloogState
+@subsection CloogState
+@example
+@group
+CloogState *cloog_state_malloc(void);
+void cloog_state_free(CloogState *state);
+@end group
+@end example
+
+@noindent The @code{CloogState} structure is (implicitly) needed to perform
+any CLooG operation. It should be created using @code{cloog_state_malloc}
+before any other CLooG objects are created and destroyed using
+@code{cloog_state_free} after all objects have been freed.
+It is allowed to use more than one @code{CloogState} structure at
+the same time, but an object created within the state of a one
+@code{CloogState} structure is not allowed to interact with an object
+created within the state of an other @code{CloogState} structure.
+
+
+@node CloogMatrix
+@subsection CloogMatrix
+
+@noindent The @code{CloogMatrix} structure is equivalent to the PolyLib
+@code{Matrix} data structure (@pxref{Wil93}). This structure is devoted to
+represent a set of constraints.
+
+@example
+@group
+struct cloogmatrix
+@{ unsigned NbRows ; /* Number of rows. */
+ unsigned NbColumns ; /* Number of columns. */
+ cloog_int_t **p; /* Array of pointers to the matrix rows. */
+ cloog_int_t *p_Init; /* Matrix rows contiguously in memory. */
+@};
+typedef struct cloogmatrix CloogMatrix;
+
+CloogMatrix *cloog_matrix_alloc(unsigned NbRows, unsigned NbColumns);
+void cloog_matrix_print(FILE *foo, CloogMatrix *m);
+void cloog_matrix_free(CloogMatrix *matrix);
+@end group
+@end example
+
+@noindent The whole matrix is stored in memory row after row at the
+@code{p_Init} address. @code{p} is an array of pointers where
+@code{p[i]} points to the first element of the @math{i^{th}} row.
+@code{NbRows} and @code{NbColumns} are respectively the number of
+rows and columns of the matrix.
+Each row corresponds to a constraint. The first element of each row is an
+equality/inequality tag. The
+constraint is an equality @math{p(x) = 0} if the first element is 0, but it is
+an inequality @math{p(x) \geq 0} if the first element is 1.
+The next elements are the coefficients of the unknowns,
+followed by the coefficients of the parameters, and finally the constant term.
+For instance, the following three constraints:
+
+@tex
+$$
+\hbox{$ \cases{ -i + m &$= 0$\cr
+ -j + n &$\geq 0$\cr
+ j + i - k &$\geq 0$}$}
+$$
+@end tex
+
+@ifnottex
+@example
+@group
+ -i + m = 0
+ -j + n >= 0
+ i + j - k >= 0
+@end group
+@end example
+@end ifnottex
+
+@noindent would be represented by the following rows:
+
+@example
+@group
+# eq/in i j k m n cst
+ 0 0 -1 0 1 0 0
+ 1 -1 0 0 0 1 0
+ 1 1 1 -1 0 0 0
+@end group
+@end example
+
+@noindent To be able to provide different precision version (CLooG
+supports 32 bits, 64 bits and arbitrary precision through the GMP library),
+the @code{cloog_int_t} type depends on the configuration options (it may be
+@code{long int} for 32 bits version, @code{long long int} for 64 bits version,
+and @code{mpz_t} for multiple precision version).
+
+@node CloogDomain
+@subsection CloogDomain
+@example
+@group
+CloogDomain *cloog_domain_union_read(CloogState *state,
+ FILE *input, int nb_parameters);
+CloogDomain *cloog_domain_from_cloog_matrix(CloogState *state,
+ CloogMatrix *matrix, int nb_par);
+void cloog_domain_free(CloogDomain *domain);
+@end group
+@end example
+
+@noindent @code{CloogDomain} is an opaque type representing a polyhedral
+domain (a union of polyhedra).
+A @code{CloogDomain} can be read
+from a file using @code{cloog_domain_union_read} or
+converted from a @code{CloogMatrix}.
+The input format for @code{cloog_domain_union_read}
+is that of @ref{Domain Representation}.
+The function @code{cloog_domain_from_cloog_matrix} takes a @code{CloogState}, a
+@code{CloogMatrix} and @code{int} as input and returns a pointer to a
+@code{CloogDomain}. @code{matrix} describes the domain and @code{nb_par} is the
+number of parameters in this domain. The input data structures are neither
+modified nor freed.
+The @code{CloogDomain} can be freed using @code{cloog_domain_free}.
+There are also some backend dependent functions for creating
+@code{CloogDomain}s.
+
+@menu
+* CloogDomain/PolyLib::
+* CloogDomain/isl::
+@end menu
+
+@node CloogDomain/PolyLib
+@subsubsection PolyLib
+
+@example
+#include <cloog/polylib/cloog.h>
+CloogDomain *cloog_domain_from_polylib_polyhedron(CloogState *state,
+ Polyhedron *, int nb_par);
+@end example
+@noindent
+The function @code{cloog_domain_from_polylib_polyhedron} takes a PolyLib
+@code{Polyhedron} as input and returns a pointer to a @code{CloogDomain}.
+The @code{nb_par} parameter indicates the number of parameters
+in the domain. The input data structure if neither modified nor freed.
+
+@node CloogDomain/isl
+@subsubsection isl
+
+@example
+#include <cloog/isl/cloog.h>
+CloogDomain *cloog_domain_from_isl_set(struct isl_set *set);
+__isl_give isl_set *isl_set_from_cloog_domain(CloogDomain *domain);
+@end example
+@noindent
+The function @code{cloog_domain_from_isl_set} takes a
+@code{struct isl_set} as input and returns a pointer to a @code{CloogDomain}.
+The function consumes a reference to the given @code{struct isl_set}.
+Similarly, @code{isl_set_from_cloog_domain} consumes a reference
+to a @code{CloogDomain} and returns an @code{isl_set}.
+
+
+@node CloogScattering
+@subsection CloogScattering
+@example
+@group
+CloogScattering *cloog_domain_read_scattering(CloogDomain *domain,
+ FILE *foo);
+CloogScattering *cloog_scattering_from_cloog_matrix(CloogState *state,
+ CloogMatrix *matrix, int nb_scat, int nb_par);
+void cloog_scattering_free(CloogScattering *);
+@end group
+@end example
+
+@noindent
+The @code{CloogScattering} type represents a scattering function.
+A @code{CloogScattering} for a given @code{CloogDomain} can be read
+from a file using @code{cloog_scattering_read} or converted
+from a @code{CloogMatrix} using @code{cloog_scattering_from_cloog_matrix}.
+The function @code{cloog_scattering_from_cloog_matrix} takes a
+@code{CloogState}, a @code{CloogMatrix} and two @code{int}s as input and
+returns a
+pointer to a @code{CloogScattering}.
+@code{matrix} describes the scattering, while @code{nb_scat} and
+@code{nb_par} are the number of scattering dimensions and
+the number of parameters, respectively. The input data structures are
+neither modified nor freed.
+A @code{CloogScattering} can be freed using @code{cloog_scattering_free}.
+There are also some backend dependent functions for creating
+@code{CloogScattering}s.
+
+@menu
+* CloogScattering/PolyLib::
+* CloogScattering/isl::
+@end menu
+
+@node CloogScattering/PolyLib
+@subsubsection PolyLib
+
+@example
+#include <cloog/polylib/cloog.h>
+CloogScattering *cloog_scattering_from_polylib_polyhedron(
+ CloogState *state, Polyhedron *polyhedron, int nb_par);
+@end example
+@noindent
+The function @code{cloog_scattering_from_polylib_polyhedron} takes a PolyLib
+@code{Polyhedron} as input and returns a pointer to a @code{CloogScattering}.
+The @code{nb_par} parameter indicates the number of parameters
+in the domain. The input data structure if neither modified nor freed.
+
+@node CloogScattering/isl
+@subsubsection isl
+
+@example
+#include <cloog/isl/cloog.h>
+CloogScattering *cloog_scattering_from_isl_map(struct isl_map *map);
+@end example
+@noindent
+The function @code{cloog_scattering_from_isl_map} takes a
+@code{struct isl_map} as input and returns a pointer to a @code{CloogScattering}.
+The output dimensions of the @code{struct isl_map} correspond to the
+scattering dimensions, while the input dimensions correspond to the
+domain dimensions.
+The function consumes a reference to the given @code{struct isl_map}.
+
+
+@node CloogUnionDomain
+@subsection CloogUnionDomain
+@example
+@group
+enum cloog_dim_type @{ CLOOG_PARAM, CLOOG_ITER, CLOOG_SCAT @};
+
+CloogUnionDomain *cloog_union_domain_alloc(int nb_par);
+CloogUnionDomain *cloog_union_domain_add_domain(CloogUnionDomain *ud,
+ const char *name, CloogDomain *domain,
+ CloogScattering *scattering, void *usr);
+CloogUnionDomain *cloog_union_domain_set_name(CloogUnionDomain *ud,
+ enum cloog_dim_type type, int index, const char *name);
+void cloog_union_domain_free(CloogUnionDomain *ud);
+@end group
+@end example
+
+@noindent A @code{CloogUnionDomain} structure represents a union
+of scattered named domains. A @code{CloogUnionDomain} is
+initialized by a call to @code{cloog_union_domain_alloc},
+after which domains can be added using @code{cloog_union_domain_add_domain}.
+
+@code{cloog_union_domain_alloc} takes the number of parameters as input.
+@code{cloog_union_domain_add_domain} takes a previously created
+@code{CloogUnionDomain} as input along with an optional name,
+a domain, an optional scattering function and a user pointer.
+The name may be @code{NULL} and is duplicated if it is not.
+If no name is specified, then the statements will be named according
+to the order in which they were added.
+@code{domain} and @code{scattering} are taken over
+by the @code{CloogUnionDomain}. @code{scattering} may be @code{NULL},
+but it must be consistently @code{NULL} or not over all calls
+to @code{cloog_union_domain_add_domain}.
+@code{cloog_union_domain_set_name} can be used to set the names
+of parameters, iterators and scattering dimensions.
+The names of iterators and scattering dimensions can only be set
+after all domains have been added.
+
+There is also a backend dependent function for creating
+@code{CloogUnionDomain}s.
+
+@menu
+* CloogUnionDomain/isl::
+@end menu
+
+@node CloogUnionDomain/isl
+@subsubsection isl
+
+@example
+#include <cloog/isl/cloog.h>
+CloogUnionDomain *cloog_union_domain_from_isl_union_map(
+ __isl_take isl_union_map *umap);
+CloogUnionDomain *cloog_union_domain_from_isl_union_set(
+ __isl_take isl_union_set *uset);
+@end example
+@noindent
+The function @code{cloog_union_domain_from_isl_union_map} takes a
+@code{isl_union_map} as input and returns a pointer
+to a @code{CloogUnionDomain}.
+The input is a mapping from different
+spaces (different tuple names and possibly different dimensions)
+to a common space. The iteration domains are set to the domains
+in each space. The statement names are set to the names of the
+spaces. The parameter names of the result are set to those of
+the input, but the iterator and scattering dimension names are
+left unspecified.
+The function consumes a reference to the given @code{isl_union_map}.
+The function @code{cloog_union_domain_from_isl_union_set} is similar,
+but takes unscattered domains as input.
+
+
+@node CloogStatement
+@subsection CloogStatement
+@example
+@group
+struct cloogstatement
+@{ int number ; /* The statement unique number. */
+ char *name; /* Name of the statement. */
+ void * usr ; /* Pointer for user's convenience. */
+ struct cloogstatement * next ;/* Next element of the linked list. */
+@} ;
+typedef struct cloogstatement CloogStatement ;
+
+CloogStatement *cloog_statement_malloc(CloogState *state);
+void cloog_statement_print(FILE *, CloogStatement *);
+void cloog_statement_free(CloogStatement *);
+@end group
+@end example
+
+@noindent The @code{CloogStatement} structure represents a @code{NULL}
+terminated linked
+list of statements. In CLooG, a statement is only defined by its unique
+number (@code{number}). The user can use the pointer @code{usr} for his
+own convenience to link his own statement representation to the
+corresponding @code{CloogStatement} structure. The whole management of the
+@code{usr} pointer is under the responsibility of the user, in particular,
+CLooG never tries to print, to allocate or to free a memory block pointed
+by @code{usr}.
+
+
+
+@node CloogOptions
+@subsection CloogOptions
+@example
+@group
+struct cloogoptions
+@{ int l ; /* -l option. */
+ int f ; /* -f option. */
+ int strides ; /* -strides option. */
+ int sh ; /* -sh option. */
+ int esp ; /* -esp option. */
+ int fsp ; /* -fsp option. */
+ int otl ; /* -otl option. */
+ int block ; /* -block option. */
+ int cpp ; /* -cpp option. */
+ int compilable ; /* -compilable option. */
+ int language; /* LANGUAGE_C or LANGUAGE_FORTRAN */
+ int save_domains; /* Save unsimplified copy of domain. */
+@} ;
+typedef struct cloogoptions CloogOptions ;
+
+CloogOptions *cloog_options_malloc(CloogState *state);
+void cloog_options_print(FILE *foo, CloogOptions *options);
+void cloog_options_free(CloogOptions *options);
+@end group
+@end example
+
+@noindent The @code{CloogOptions} structure contains all the possible options to
+rule CLooG's behaviour (@pxref{Calling CLooG}).
+As a reminder, the default values are:
+@itemize @bullet
+@item @math{l = -1} (optimize control until the innermost loops),
+@item @math{f = 1} (optimize control from the outermost loops),
+@item @math{strides = 0} (use only unit strides),
+@item @math{sh = 0} (do not simplify convex hulls),
+@item @math{esp = 1} (do not spread complex equalities),
+@item @math{fsp = 1} (start to spread from the first iterators),
+@item @math{otl = 1} (simplify loops running only once).
+@item @math{block = 0} (do not make statement blocks when not necessary).
+@item @math{cpp = 0} (do not generate a compilable part of code using preprocessor).
+@item @math{compilable = 0} (do not generate a compilable code).
+@end itemize
+
+The @code{save_domains} option is only useful for users of the CLooG
+library. This option defaults to 0, but when it is set, the @code{domain}
+field of each @code{clast_user_stmt} will be set to the set of values for the
+scattering dimensions for which this instance of the user statement is executed.
+The @code{domain} field of each @code{clast_for} contains the set of values for
+the scattering dimensions for which an instance of a user statement is executed
+inside the @code{clast_for}. It is only available if the @code{clast_for}
+enumerates a scattering dimension.
+
+@node CloogInput
+@subsection CloogInput
+@example
+@group
+CloogInput *cloog_input_read(FILE *file, CloogOptions *options);
+CloogInput *cloog_input_alloc(CloogDomain *context,
+ CloogUnionDomain *ud);
+void cloog_input_free(CloogInput *input);
+
+void cloog_input_dump_cloog(FILE *, CloogInput *, CloogOptions *);
+@end group
+@end example
+
+@noindent A @code{CloogInput} structure represents the input to CLooG.
+It is essentially a @code{CloogUnionDomain} along with a context
+@code{CloogDomain}. A @code{CloogInput} can be created from
+a @code{CloogDomain} and a @code{CloogUnionDomains} using
+@code{cloog_input_alloc}, or it can be read from a CLooG input
+file using @code{cloog_input_read}. The latter also modifies
+the @code{language} field of the @code{CloogOptions} structure.
+The constructed @code{CloogInput} can be used as input
+to a @code{cloog_clast_create_from_input} call.
+
+A @code{CloogInput} data structure and a @code{CloogOptions} contain
+the same information as a .cloog file. This function dumps the .cloog
+description of the given data structures into a file.
+
+@node Dump CLooG Input File Function
+@subsection Dump CLooG Input File Function
+@example
+@end example
+
+@node CLooG Output
+@section CLooG Output
+
+@noindent
+Given a description of the input,
+an AST corresponding to the @code{CloogInput} can be constructed
+using @code{cloog_clast_create_from_input} and destroyed using
+@code{free_clast_stmt}.
+@example
+struct clast_stmt *cloog_clast_create_from_input(CloogInput *input,
+ CloogOptions *options);
+void free_clast_stmt(struct clast_stmt *s);
+@end example
+@noindent
+@code{clast_stmt} represents a linked list of ``statements''.
+@example
+struct clast_stmt @{
+ const struct clast_stmt_op *op;
+ struct clast_stmt *next;
+@};
+@end example
+@noindent
+The entries in the list are not of type @code{clast_stmt} itself,
+but of some larger type. The following statement types are defined
+by CLooG.
+
+@example
+struct clast_root @{
+ struct clast_stmt stmt;
+ CloogNames * names;
+@};
+struct clast_root *new_clast_root(CloogNames *names);
+
+struct clast_assignment @{
+ struct clast_stmt stmt;
+ const char * LHS;
+ struct clast_expr * RHS;
+@};
+struct clast_assignment *new_clast_assignment(const char *lhs,
+ struct clast_expr *rhs);
+
+struct clast_block @{
+ struct clast_stmt stmt;
+ struct clast_stmt * body;
+@};
+struct clast_block *new_clast_block(void);
+
+struct clast_user_stmt @{
+ struct clast_stmt stmt;
+ CloogDomain * domain;
+ CloogStatement * statement;
+ struct clast_stmt * substitutions;
+@};
+struct clast_user_stmt *new_clast_user_stmt(CloogDomain *domain,
+ CloogStatement *stmt, struct clast_stmt *subs);
+
+struct clast_for @{
+ struct clast_stmt stmt;
+ CloogDomain * domain;
+ const char * iterator;
+ struct clast_expr * LB;
+ struct clast_expr * UB;
+ cloog_int_t stride;
+ struct clast_stmt * body;
+@};
+struct clast_for *new_clast_for(CloogDomain *domain, const char *it,
+ struct clast_expr *LB, struct clast_expr *UB,
+ cloog_int_t stride);
+
+struct clast_guard @{
+ struct clast_stmt stmt;
+ struct clast_stmt * then;
+ int n;
+ struct clast_equation eq[1];
+@};
+struct clast_guard *new_clast_guard(int n);
+@end example
+@noindent
+The @code{clast_stmt} returned by @code{cloog_clast_create}
+is a @code{clast_root}.
+It contains a placeholder for all the variable names that appear
+in the AST and a (list of) nested statement(s).
+
+@noindent
+A @code{clast_assignment} assigns the value given by
+the @code{clast_expr} @code{RHS} to a variable named @code{LHS}.
+
+@noindent
+A @code{clast_block} groups a list of statements into one statement.
+These statements are only generated if the @code{block} option is set,
+@pxref{Statement Block} and @ref{CloogOptions}.
+
+@noindent
+A @code{clast_user_stmt} represents a call to a statement specified
+by the user, @pxref{CloogStatement}.
+@code{substitutions} is a list of @code{clast_assignment} statements
+assigning an expression in terms of the scattering dimensions to
+each of the original iterators in the original order.
+The @code{LHS}s of these assignments are left blank (@code{NULL}).
+The @code{domain} is set to @code{NULL} if the @code{save_domains} option
+is not set. Otherwise, it is set to the set
+of values for the scattering dimensions
+for which this instance of the user statement is executed.
+Note that unless the @code{noscalars} option has been set, the
+constant scattering dimensions may have been removed from this set.
+
+@noindent
+A @code{clast_for} represents a for loop, iterating @code{body} for each
+value of @code{iterator} between @code{LB} and @code{UB} in steps
+of size @code{stride}.
+The @code{domain} is set to @code{NULL} if the @code{save_domains} option is not
+set. Otherwise, it is set to the set of values for the scattering dimensions
+for which a user statement is executed inside this @code{clast_for}. Note that
+unless the @code{noscalars} option has been set, the constant scattering
+dimensions may have been removed from this set.
+
+@noindent
+A @code{clast_guard} represents the guarded execution of the @code{then}
+(list of) statement(s) by a conjunction of @code{n} (in)equalities.
+Each (in)equality is represented by a @code{clast_equation}.
+@example
+struct clast_equation @{
+ struct clast_expr * LHS;
+ struct clast_expr * RHS;
+ int sign;
+@};
+@end example
+@noindent
+The condition expressed by a @code{clast_equation} is
+@code{LHS <= RHS}, @code{LHS == RHS} or @code{LHS >= RHS}
+depending on whether @code{sign} is less than zero, equal
+to zero, or greater than zero.
+
+The dynamic type of a @code{clast_stmt} can be determined
+using the macro @code{CLAST_STMT_IS_A(stmt,type)},
+where @code{stmt} is a pointer to a @code{clast_stmt}
+and @code{type} is one of @code{stmt_root}, @code{stmt_ass},
+@code{stmt_user}, @code{stmt_block}, @code{stmt_for} or
+@code{stmt_guard}.
+Users are allowed to define their own statement types by
+assigning the @code{op} field of the statements a pointer
+to a @code{clast_stmt_op} structure.
+@example
+struct clast_stmt_op @{
+ void (*free)(struct clast_stmt *);
+@};
+@end example
+@noindent
+The @code{free} field of this structure should point
+to a function that frees the user defined statement.
+
+@noindent
+A @code{clast_expr} can be an identifier, a term,
+a binary expression or a reduction.
+@example
+enum clast_expr_type @{
+ clast_expr_name,
+ clast_expr_term,
+ clast_expr_bin,
+ clast_expr_red
+@};
+struct clast_expr @{
+ enum clast_expr_type type;
+@};
+void free_clast_expr(struct clast_expr *e);
+@end example
+
+@noindent
+Identifiers are of subtype @code{clast_name}.
+@example
+struct clast_name @{
+ struct clast_expr expr;
+ const char * name;
+@};
+struct clast_name *new_clast_name(const char *name);
+void free_clast_name(struct clast_name *t);
+@end example
+@noindent
+The character string pointed to by @code{name} is
+assumed to be part of the @code{CloogNames} structure
+in the root of the clast as is therefore not copied.
+
+@noindent
+Terms are of type @code{clast_term}.
+@example
+struct clast_term @{
+ struct clast_expr expr;
+ cloog_int_t val;
+ struct clast_expr *var;
+@};
+struct clast_term *new_clast_term(cloog_int_t c, struct clast_expr *v);
+void free_clast_term(struct clast_term *t);
+@end example
+@noindent
+If @code{var} is set to @code{NULL}, then the term represents
+the integer value @code{val}. Otherwise, it represents
+the term @code{val * var}.
+@code{new_clast_term} simply copies the @code{v} pointer
+without copying the underlying @code{clast_expr}.
+@code{free_clast_term}, on the other hand, recursively frees
+@code{var}.
+
+@noindent
+Binary expressions are of type @code{clast_bin_type} and
+represent either the floor of a division (fdiv),
+the ceil of a division (cdiv), an exact division or
+the remainder of an fdiv.
+@example
+enum clast_bin_type @{ clast_bin_fdiv, clast_bin_cdiv,
+ clast_bin_div, clast_bin_mod @};
+struct clast_binary @{
+ struct clast_expr expr;
+ enum clast_bin_type type;
+ struct clast_expr* LHS;
+ cloog_int_t RHS;
+@};
+struct clast_binary *new_clast_binary(enum clast_bin_type t,
+ struct clast_expr *lhs, cloog_int_t rhs);
+void free_clast_binary(struct clast_binary *b);
+@end example
+
+@noindent
+Reductions are of type @code{clast_reduction} and
+can represent either the sum, the minimum or the maximum
+of its elements.
+@example
+enum clast_red_type @{ clast_red_sum, clast_red_min, clast_red_max @};
+struct clast_reduction @{
+ struct clast_expr expr;
+ enum clast_red_type type;
+ int n;
+ struct clast_expr* elts[1];
+@};
+struct clast_reduction *new_clast_reduction(enum clast_red_type t,
+ int n);
+void free_clast_reduction(struct clast_reduction *r);
+@end example
+
+@node Retrieving version information
+@section Retrieving version information
+CLooG provides static and dynamic version checks to assist on
+including a compatible version of the library.
+A static version check at compile time can be achieved by
+querying the version constants defined in @code{version.h}:
+
+@itemize @bullet
+@item @code{CLOOG_VERSION_MAJOR}
+@item @code{CLOOG_VERSION_MINOR}
+@item @code{CLOOG_VERSION_REVISION}
+@end itemize
+
+This way it is possible to ensure the included headers are of the
+correct version. It is still possible that the installed CLooG
+library version differs from the installed headers.
+In order to avoid this, a dynamic version check is provided with
+the functions:
+
+@example
+@group
+int cloog_version_major(void);
+int cloog_version_minor(void);
+int cloog_version_revision(void);
+@end group
+@end example
+
+By using both the static and the dynamic version check, it is possible
+to match CLooG's header version with the library's version.
+
+@node Example of Library Utilization
+@section Example of Library Utilization
+Here is a basic example showing how it is possible to use the CLooG library,
+assuming that a standard installation has been done.
+The following C program reads a CLooG input file on the standard input,
+then prints the solution on the standard output.
+Options are preselected to the default values of the CLooG software.
+This example is provided in the @code{example} directory of the
+CLooG distribution.
+@example
+/* example.c */
+# include <stdio.h>
+# include <cloog/cloog.h>
+
+int main()
+@{
+ CloogState *state;
+ CloogInput *input;
+ CloogOptions * options ;
+ struct clast_stmt *root;
+
+ /* Setting options and reading program informations. */
+ state = cloog_state_malloc();
+ options = cloog_options_malloc(state);
+ input = cloog_input_read(stdin, options);
+
+ /* Generating and printing the code. */
+ root = cloog_clast_create_from_input(input, options);
+ clast_pprint(stdout, root, 0, options);
+
+ cloog_clast_free(root);
+ cloog_options_free(options) ;
+ cloog_state_free(state);
+ return 0;
+@}
+@end example
+
+@noindent The compilation command could be:
+@example
+gcc example.c -lcloog -o example
+@end example
+@noindent A calling command with the input file test.cloog could be:
+@example
+more test.cloog | ./example
+@end example
+
+
+@c % ******************************** HACKING *********************************
+@c @node Hacking
+@c @chapter Hacking CLooG
+
+@c @menu
+@c * Program organization::
+@c * Special Options::
+@c * CLooG Coding Standards::
+@c @end menu
+
+@c @node Program organization
+@c @section Program organization
+
+@c @node Special Options
+@c @section Special Options
+
+@c @node CLooG Coding Standards
+@c @section CLooG Coding Standards
+
+
+@c % ****************************** INSTALLING ********************************
+@node Installing
+@chapter Installing CLooG
+
+@menu
+* License::
+* Requirements::
+* Basic Installation::
+* Optional Features::
+* Uninstallation::
+@end menu
+
+@node License
+@section License
+First of all, it would be very kind to refer the following paper in any
+publication that result from the use of the CLooG software or its library,
+@pxref{Bas04} (a bibtex entry is provided behind the title page of this
+manual, along with copyright notice, and in the CLooG home
+@code{http://www.CLooG.org}.
+
+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.
+@code{http://www.gnu.org/licenses/lgpl-2.1.html}
+
+Note, though, that if you link CLooG against a GPL library such
+as the PolyLib backend, then the combination becomes GPL too.
+In particular, a CLooG library based on the PolyLib backend
+is GPL version 2 only.
+Since the isl backend is LGPL, linking against it does not affect
+the license of CLooG.
+
+
+@node Requirements
+@section Requirements
+
+CLooG can be used with one of two possible backends,
+one using isl and one using PolyLib.
+The isl library is included in the CLooG distribution,
+while the PolyLib library needs to be obtained separately.
+On the other hand, isl requires GMP, while PolyLib can be
+compiled with or without the use of GMP.
+The user therefore needs to install at least one of
+PolyLib or GMP.
+
+@menu
+* PolyLib::
+* GMP Library::
+@end menu
+
+
+@node PolyLib
+@subsection PolyLib (optional)
+To successfully install CLooG with the PolyLib backend,
+the user first needs to install PolyLib
+version 5.22.1 or above (default 64 bits version is satisfying
+as well as 32 bits or GMP multiple precision version).
+Polylib can be downloaded freely
+at @code{http://icps.u-strasbg.fr/PolyLib/} or
+@code{http://www.irisa.fr/polylib/}. Once downloaded and unpacked
+(e.g. using the @samp{tar -zxvf polylib-5.22.3.tar.gz} command),
+the user can compile
+it by typing the following commands on the PolyLib's root directory:
+
+@itemize @bullet
+@item @code{./configure}
+@item @code{make}
+@item And as root: @code{make install}
+@end itemize
+
+Alternatively, the latest development version can be obtained from the
+git repository:
+@itemize @bullet
+@item @code{git clone git://repo.or.cz/polylib.git}
+@item @code{cd polylib}
+@item @code{./autogen.sh}
+@item @code{./configure}
+@item @code{make}
+@item And as root: @code{make install}
+@end itemize
+
+The PolyLib default installation is @code{/usr/local}. This directory may
+not be inside your library path. To fix the problem, the user should set
+@example
+export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
+@end example
+@noindent if your shell is, e.g., bash or
+@example
+setenv LD_LIBRARY_PATH $LD_LIBRARY_PATH:/usr/local/lib
+@end example
+@noindent if your shell is, e.g., tcsh. Add the line to your .bashrc or .tcshrc (or
+whatever convenient file) to make this change permanent. Another solution
+is to ask PolyLib to install in the standard path by using the prefix
+option of the configure script:
+@samp{./configure --prefix=/usr}.
+
+CLooG makes intensive calls to polyhedral operations, and PolyLib
+functions do the job. Polylib is a free library written in C for the
+manipulation of polyhedra. The library is operating on objects like
+vectors, matrices, lattices, polyhedra, Z-polyhedra, unions of
+polyhedra and a lot of other intermediary structures. It provides
+functions for all the important operations on these structures.
+
+@node GMP Library
+@subsection GMP Library (optional)
+
+To be able to deal with insanely large coefficient, the user will need to
+install the GNU Multiple Precision Library (GMP for short) version 4.1.4
+or above. It can be freely downloaded from @code{http://www.swox.com/gmp}.
+Note that the isl backend currently requires GMP.
+The user can compile GMP by typing the following commands on the GMP root
+directory:
+
+@itemize @bullet
+@item @code{./configure}
+@item @code{make}
+@item And as root: @code{make install}
+@end itemize
+
+The GMP default installation is @code{/usr/local}, the same method to
+fix a library path problem applies as with PolyLib (@pxref{PolyLib}).
+
+If you want to use the PolyLib backend, then
+PolyLib has to be built using the GMP library by specifying the option
+@samp{--with-libgmp=PATH_TO_GMP} to the PolyLib configure script
+(where @code{PATH_TO_GMP} is @code{/usr/local} if you did not change the GMP
+installation directory). Then you have to set the convenient CLooG configure
+script options to build the GMP version (@pxref{Optional Features}).
+
+
+@node Basic Installation
+@section CLooG Basic Installation
+
+Once downloaded and unpacked
+(e.g. using the @samp{tar -zxvf cloog-@value{VERSION}.tar.gz} command),
+you can compile CLooG by typing the following commands on the CLooG's root
+directory:
+
+@itemize @bullet
+@item @code{./configure}
+@item @code{make}
+@item And as root: @code{make install}
+@end itemize
+
+Alternatively, the latest development version can be obtained from the
+git repository:
+@itemize @bullet
+@item @code{git clone git://repo.or.cz/cloog.git}
+@item @code{cd cloog}
+@item @code{./get_submodules.sh}
+@item @code{./autogen.sh}
+@item @code{./configure}
+@item @code{make}
+@item And as root: @code{make install}
+@end itemize
+
+Depending on which backend you want to use and where they
+are located, you may need to pass some
+options to the configure script, @pxref{Optional Features}.
+
+The program binaries and object files can be removed from the
+source code directory by typing @code{make clean}. To also remove the
+files that the @code{configure} script created (so you can compile the
+package for a different kind of computer) type @code{make distclean}.
+
+Both the CLooG software and library have been successfully compiled
+on the following systems:
+@itemize @bullet
+@item PC's under Linux, with the @code{gcc} compiler,
+@item PC's under Windows (Cygwin), with the @code{gcc} compiler,
+@item Sparc and UltraSparc Stations, with the @code{gcc} compiler.
+@end itemize
+
+@node Optional Features
+@section Optional Features
+The @code{configure} shell script attempts to guess correct values for
+various system-dependent variables and user options used during compilation.
+It uses those values to create the @code{Makefile}. Various user options
+are provided by the CLooG's configure script. They are summarized in the
+following list and may be printed by typing @code{./configure --help} in the
+CLooG top-level directory.
+
+@itemize @bullet
+@item By default, the installation directory is @code{/usr/local}:
+@code{make install} will install the package's files in
+@code{/usr/local/bin}, @code{/usr/local/lib} and @code{/usr/local/include}.
+The user can specify an installation prefix other than @code{/usr/local} by
+giving @code{configure} the option @code{--prefix=PATH}.
+
+@item By default, the isl backend will use the version of isl
+that is @code{bundled} together with CLooG.
+Using the @code{--with-isl} option of @code{configure}
+the user can specify that @code{no} isl,
+a previously installed (@code{system}) isl or a @code{build} isl
+should be used.
+In the latter case, the user should also specify the build location
+using @code{--with-isl-builddir=PATH}.
+In case of an installed isl,
+the installation location can be specified using the
+@code{--with-isl-prefix=PATH} and
+@code{--with-isl-exec-prefix=PATH} options of @code{configure}.
+
+@item By default, the PolyLib backend will use an installed
+(@code{system}) PolyLib, if any.
+The installation location can be specified using the
+@code{--with-polylib-prefix=PATH} and
+@code{--with-polylib-exec-prefix=PATH} options of @code{configure}.
+Using the @code{--with-polylib} option of @code{configure}
+the user can specify that @code{no} PolyLib or a @code{build} PolyLib
+should be used.
+In the latter case, the user should also specify the build location
+using @code{--with-polylib-builddir=PATH}.
+
+@item By default, the PolyLib backend of CLooG is built
+in 64bits version if such version of the
+PolyLib is found by @code{configure}. If the only existing version of the
+PolyLib is the 32bits or if the user give to @code{configure} the option
+@code{--with-bits=32}, the 32bits version of CLooG will be compiled. In the
+same way, the option @code{--with-bits=gmp} have to be used to build
+the multiple precision version.
+
+@item By default, @code{configure} will look for the GMP library
+(necessary to build the multiple precision version) in standard
+locations. If necessary, the user can specify the GMP path by giving
+@code{configure} the option @code{--with-gmp-prefix=PATH} and/or
+@code{--with-gmp-exec-prefix=PATH}.
+@end itemize
+
+@node Uninstallation
+@section Uninstallation
+The user can easily remove the CLooG software and library from his system
+by typing (as root if necessary) from the CLooG top-level directory
+@code{make uninstall}.
+
+@c % **************************** DOCUMENTATION ******************************
+@node Documentation
+@chapter Documentation
+The CLooG distribution provides several documentation sources. First, the
+source code itself is as documented as possible. The code comments use a
+Doxygen-compatible presentation (something similar to what JavaDoc does for
+JAVA). The user may install Doxygen
+(see @code{http://www.stack.nl/~dimitri/doxygen}) to automatically
+generate a technical documentation by typing @code{make doc} or
+@code{doxygen ./autoconf/Doxyfile} at the CLooG top-level directory after
+running the configure script (@pxref{Installing}). Doxygen will generate
+documentation sources (in HTML, LaTeX and man) in the @code{doc/source}
+directory of the CLooG distribution.
+
+The Texinfo sources of the present document are also provided in the @code{doc}
+directory. You can build it in either DVI format (by typing
+@code{texi2dvi cloog.texi}) or PDF format
+(by typing @code{texi2pdf cloog.texi}) or HTML format
+(by typing @code{makeinfo --html cloog.texi}, using @code{--no-split}
+option to generate a single HTML file) or info format
+(by typing @code{makeinfo cloog.texi}).
+
+@c % ****************************** REFERENCES ********************************
+@node References
+@chapter References
+
+@itemize
+@item
+@anchor{Bas03a}[Bas03a] C. Bastoul, P. Feautrier. Improving data locality
+by chunking. CC'12 International Conference on Compiler Construction,
+LNCS 2622, pages 320-335, Warsaw, april 2003.
+
+@item
+@anchor{Bas03b}[Bas03b] C. Bastoul. Efficient code generation for automatic
+parallelization and optimization. ISPDC'03 IEEE International Symposium on
+Parallel and Distributed Computing, pages 23-30, Ljubljana, october 2003.
+
+@item
+@anchor{Bas04}[Bas04] C. Bastoul. Code Generation in the Polyhedral Model
+Is Easier Than You Think. PACT'13 IEEE International Conference on Parallel
+Architecture and Compilation Techniques, pages 7-16, Juan-les-Pins,
+september 2004.
+
+@item
+@anchor{Fea92}[Fea92] P. Feautrier Some efficient solutions to the affine
+scheduling problem, part II: multidimensional time.
+International Journal of Parallel Programming, 21(6):389--420, December 1992.
+
+@item
+@anchor{Gri04}[Gri04] M. Griebl. Automatic parallelization of loop programs
+for distributed memory architectures. Habilitation Thesis. Facult@"at f@"ur
+Mathematik und Informatik, Universit@"at Passau, 2004.
+@emph{http://www.infosun.fmi.uni-passau.de/cl/loopo/}
+
+@item
+@anchor{Qui00}[Qui00] F. Quiller@'e, S. Rajopadhye, and D. Wilde.
+Generation of efficient nested loops from polyhedra.
+International Journal of Parallel Programming, 28(5):469-498,
+october 2000.
+
+@item
+@anchor{Wil93}[Wil93] Doran K. Wilde.
+A library for doing polyhedral operations.
+Technical Report 785, IRISA, Rennes, France, 1993.
+
+@end itemize
+
+
+
+
+@c % /*************************************************************************
+@c % * PART VI: END OF THE DOCUMENT *
+@c % *************************************************************************/
+@c @unnumbered Index
+
+@c @printindex cp
+
+@bye