Home | History | Annotate | Line # | Download | only in gcc
graphite.h revision 1.4
      1  1.3  mrg /* Graphite polyhedral representation.
      2  1.3  mrg    Copyright (C) 2009-2016 Free Software Foundation, Inc.
      3  1.3  mrg    Contributed by Sebastian Pop <sebastian.pop (at) amd.com> and
      4  1.3  mrg    Tobias Grosser <grosser (at) fim.uni-passau.de>.
      5  1.1  mrg 
      6  1.1  mrg This file is part of GCC.
      7  1.1  mrg 
      8  1.1  mrg GCC is free software; you can redistribute it and/or modify
      9  1.1  mrg it under the terms of the GNU General Public License as published by
     10  1.1  mrg the Free Software Foundation; either version 3, or (at your option)
     11  1.1  mrg any later version.
     12  1.1  mrg 
     13  1.1  mrg GCC is distributed in the hope that it will be useful,
     14  1.1  mrg but WITHOUT ANY WARRANTY; without even the implied warranty of
     15  1.1  mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16  1.1  mrg GNU General Public License for more details.
     17  1.1  mrg 
     18  1.1  mrg You should have received a copy of the GNU General Public License
     19  1.1  mrg along with GCC; see the file COPYING3.  If not see
     20  1.1  mrg <http://www.gnu.org/licenses/>.  */
     21  1.1  mrg 
     22  1.3  mrg #ifndef GCC_GRAPHITE_POLY_H
     23  1.3  mrg #define GCC_GRAPHITE_POLY_H
     24  1.1  mrg 
     25  1.3  mrg #include "sese.h"
     26  1.3  mrg #include <isl/options.h>
     27  1.3  mrg #include <isl/ctx.h>
     28  1.3  mrg #include <isl/val_gmp.h>
     29  1.3  mrg #include <isl/set.h>
     30  1.3  mrg #include <isl/union_set.h>
     31  1.3  mrg #include <isl/map.h>
     32  1.3  mrg #include <isl/union_map.h>
     33  1.3  mrg #include <isl/aff.h>
     34  1.3  mrg #include <isl/constraint.h>
     35  1.3  mrg #include <isl/flow.h>
     36  1.3  mrg #include <isl/ilp.h>
     37  1.3  mrg #include <isl/schedule.h>
     38  1.3  mrg #include <isl/ast_build.h>
     39  1.3  mrg 
     40  1.3  mrg #ifdef HAVE_ISL_OPTIONS_SET_SCHEDULE_SERIALIZE_SCCS
     41  1.3  mrg /* isl 0.15 or later.  */
     42  1.3  mrg #include <isl/schedule_node.h>
     43  1.4  mrg #include <isl/id.h>
     44  1.4  mrg #include <isl/space.h>
     45  1.3  mrg 
     46  1.3  mrg #else
     47  1.3  mrg /* isl 0.14 or 0.13.  */
     48  1.3  mrg # define isl_stat int
     49  1.3  mrg # define isl_stat_ok 0
     50  1.3  mrg #endif
     51  1.3  mrg 
     52  1.3  mrg typedef struct poly_dr *poly_dr_p;
     53  1.3  mrg 
     54  1.3  mrg typedef struct poly_bb *poly_bb_p;
     55  1.3  mrg 
     56  1.3  mrg typedef struct scop *scop_p;
     57  1.3  mrg 
     58  1.3  mrg typedef unsigned graphite_dim_t;
     59  1.3  mrg 
     60  1.3  mrg static inline graphite_dim_t scop_nb_params (scop_p);
     61  1.3  mrg 
     62  1.3  mrg /* A data reference can write or read some memory or we
     63  1.3  mrg    just know it may write some memory.  */
     64  1.3  mrg enum poly_dr_type
     65  1.3  mrg {
     66  1.3  mrg   PDR_READ,
     67  1.3  mrg   /* PDR_MAY_READs are represented using PDR_READS.  This does not
     68  1.3  mrg      limit the expressiveness.  */
     69  1.3  mrg   PDR_WRITE,
     70  1.3  mrg   PDR_MAY_WRITE
     71  1.3  mrg };
     72  1.3  mrg 
     73  1.3  mrg struct poly_dr
     74  1.3  mrg {
     75  1.3  mrg   /* An identifier for this PDR.  */
     76  1.3  mrg   int id;
     77  1.3  mrg 
     78  1.3  mrg   /* The number of data refs identical to this one in the PBB.  */
     79  1.3  mrg   int nb_refs;
     80  1.3  mrg 
     81  1.3  mrg   /* A pointer to the gimple stmt containing this reference.  */
     82  1.3  mrg   gimple *stmt;
     83  1.3  mrg 
     84  1.3  mrg   /* A pointer to the PBB that contains this data reference.  */
     85  1.3  mrg   poly_bb_p pbb;
     86  1.3  mrg 
     87  1.3  mrg   enum poly_dr_type type;
     88  1.3  mrg 
     89  1.3  mrg   /* The access polyhedron contains the polyhedral space this data
     90  1.3  mrg      reference will access.
     91  1.3  mrg 
     92  1.3  mrg      The polyhedron contains these dimensions:
     93  1.3  mrg 
     94  1.3  mrg      - The alias set (a):
     95  1.3  mrg      Every memory access is classified in at least one alias set.
     96  1.3  mrg 
     97  1.3  mrg      - The subscripts (s_0, ..., s_n):
     98  1.3  mrg      The memory is accessed using zero or more subscript dimensions.
     99  1.3  mrg 
    100  1.3  mrg      - The iteration domain (variables and parameters)
    101  1.3  mrg 
    102  1.3  mrg      Do not hardcode the dimensions.  Use the following accessor functions:
    103  1.3  mrg      - pdr_alias_set_dim
    104  1.3  mrg      - pdr_subscript_dim
    105  1.3  mrg      - pdr_iterator_dim
    106  1.3  mrg      - pdr_parameter_dim
    107  1.3  mrg 
    108  1.3  mrg      Example:
    109  1.3  mrg 
    110  1.3  mrg      | int A[1335][123];
    111  1.3  mrg      | int *p = malloc ();
    112  1.3  mrg      |
    113  1.3  mrg      | k = ...
    114  1.3  mrg      | for i
    115  1.3  mrg      |   {
    116  1.3  mrg      |     if (unknown_function ())
    117  1.3  mrg      |       p = A;
    118  1.3  mrg      |       ... = p[?][?];
    119  1.3  mrg      | 	   for j
    120  1.3  mrg      |       A[i][j+k] = m;
    121  1.3  mrg      |   }
    122  1.3  mrg 
    123  1.3  mrg      The data access A[i][j+k] in alias set "5" is described like this:
    124  1.3  mrg 
    125  1.3  mrg      | i   j   k   a  s0  s1   1
    126  1.3  mrg      | 0   0   0   1   0   0  -5     =  0
    127  1.3  mrg      |-1   0   0   0   1   0   0     =  0
    128  1.3  mrg      | 0  -1  -1   0   0   1   0     =  0
    129  1.3  mrg      | 0   0   0   0   1   0   0     >= 0  # The last four lines describe the
    130  1.3  mrg      | 0   0   0   0   0   1   0     >= 0  # array size.
    131  1.3  mrg      | 0   0   0   0  -1   0 1335    >= 0
    132  1.3  mrg      | 0   0   0   0   0  -1 123     >= 0
    133  1.3  mrg 
    134  1.3  mrg      The pointer "*p" in alias set "5" and "7" is described as a union of
    135  1.3  mrg      polyhedron:
    136  1.3  mrg 
    137  1.3  mrg 
    138  1.3  mrg      | i   k   a  s0   1
    139  1.3  mrg      | 0   0   1   0  -5   =  0
    140  1.3  mrg      | 0   0   0   1   0   >= 0
    141  1.3  mrg 
    142  1.3  mrg      "or"
    143  1.3  mrg 
    144  1.3  mrg      | i   k   a  s0   1
    145  1.3  mrg      | 0   0   1   0  -7   =  0
    146  1.3  mrg      | 0   0   0   1   0   >= 0
    147  1.3  mrg 
    148  1.3  mrg      "*p" accesses all of the object allocated with 'malloc'.
    149  1.3  mrg 
    150  1.3  mrg      The scalar data access "m" is represented as an array with zero subscript
    151  1.3  mrg      dimensions.
    152  1.3  mrg 
    153  1.3  mrg      | i   j   k   a   1
    154  1.3  mrg      | 0   0   0  -1   15  = 0
    155  1.3  mrg 
    156  1.3  mrg      The difference between the graphite internal format for access data and
    157  1.3  mrg      the OpenSop format is in the order of columns.
    158  1.3  mrg      Instead of having:
    159  1.3  mrg 
    160  1.3  mrg      | i   j   k   a  s0  s1   1
    161  1.3  mrg      | 0   0   0   1   0   0  -5     =  0
    162  1.3  mrg      |-1   0   0   0   1   0   0     =  0
    163  1.3  mrg      | 0  -1  -1   0   0   1   0     =  0
    164  1.3  mrg      | 0   0   0   0   1   0   0     >= 0  # The last four lines describe the
    165  1.3  mrg      | 0   0   0   0   0   1   0     >= 0  # array size.
    166  1.3  mrg      | 0   0   0   0  -1   0 1335    >= 0
    167  1.3  mrg      | 0   0   0   0   0  -1 123     >= 0
    168  1.3  mrg 
    169  1.3  mrg      In OpenScop we have:
    170  1.3  mrg 
    171  1.3  mrg      | a  s0  s1   i   j   k   1
    172  1.3  mrg      | 1   0   0   0   0   0  -5     =  0
    173  1.3  mrg      | 0   1   0  -1   0   0   0     =  0
    174  1.3  mrg      | 0   0   1   0  -1  -1   0     =  0
    175  1.3  mrg      | 0   1   0   0   0   0   0     >= 0  # The last four lines describe the
    176  1.3  mrg      | 0   0   1   0   0   0   0     >= 0  # array size.
    177  1.3  mrg      | 0  -1   0   0   0   0 1335    >= 0
    178  1.3  mrg      | 0   0  -1   0   0   0 123     >= 0
    179  1.3  mrg 
    180  1.3  mrg      The OpenScop access function is printed as follows:
    181  1.3  mrg 
    182  1.3  mrg      | 1  # The number of disjunct components in a union of access functions.
    183  1.3  mrg      | R C O I L P  # Described bellow.
    184  1.3  mrg      | a  s0  s1   i   j   k   1
    185  1.3  mrg      | 1   0   0   0   0   0  -5     =  0
    186  1.3  mrg      | 0   1   0  -1   0   0   0     =  0
    187  1.3  mrg      | 0   0   1   0  -1  -1   0     =  0
    188  1.3  mrg      | 0   1   0   0   0   0   0     >= 0  # The last four lines describe the
    189  1.3  mrg      | 0   0   1   0   0   0   0     >= 0  # array size.
    190  1.3  mrg      | 0  -1   0   0   0   0 1335    >= 0
    191  1.3  mrg      | 0   0  -1   0   0   0 123     >= 0
    192  1.3  mrg 
    193  1.3  mrg      Where:
    194  1.3  mrg      - R: Number of rows.
    195  1.3  mrg      - C: Number of columns.
    196  1.3  mrg      - O: Number of output dimensions = alias set + number of subscripts.
    197  1.3  mrg      - I: Number of input dimensions (iterators).
    198  1.3  mrg      - L: Number of local (existentially quantified) dimensions.
    199  1.3  mrg      - P: Number of parameters.
    200  1.3  mrg 
    201  1.3  mrg      In the example, the vector "R C O I L P" is "7 7 3 2 0 1".  */
    202  1.3  mrg   isl_map *accesses;
    203  1.3  mrg   isl_set *subscript_sizes;
    204  1.3  mrg };
    205  1.3  mrg 
    206  1.3  mrg #define PDR_ID(PDR) (PDR->id)
    207  1.3  mrg #define PDR_NB_REFS(PDR) (PDR->nb_refs)
    208  1.3  mrg #define PDR_PBB(PDR) (PDR->pbb)
    209  1.3  mrg #define PDR_TYPE(PDR) (PDR->type)
    210  1.3  mrg #define PDR_ACCESSES(PDR) (NULL)
    211  1.3  mrg 
    212  1.3  mrg void new_poly_dr (poly_bb_p, gimple *, enum poly_dr_type,
    213  1.3  mrg 		  isl_map *, isl_set *);
    214  1.3  mrg void debug_pdr (poly_dr_p);
    215  1.3  mrg void print_pdr (FILE *, poly_dr_p);
    216  1.3  mrg 
    217  1.3  mrg static inline bool
    218  1.3  mrg pdr_read_p (poly_dr_p pdr)
    219  1.3  mrg {
    220  1.3  mrg   return PDR_TYPE (pdr) == PDR_READ;
    221  1.3  mrg }
    222  1.3  mrg 
    223  1.3  mrg /* Returns true when PDR is a "write".  */
    224  1.3  mrg 
    225  1.3  mrg static inline bool
    226  1.3  mrg pdr_write_p (poly_dr_p pdr)
    227  1.3  mrg {
    228  1.3  mrg   return PDR_TYPE (pdr) == PDR_WRITE;
    229  1.3  mrg }
    230  1.3  mrg 
    231  1.3  mrg /* Returns true when PDR is a "may write".  */
    232  1.3  mrg 
    233  1.3  mrg static inline bool
    234  1.3  mrg pdr_may_write_p (poly_dr_p pdr)
    235  1.3  mrg {
    236  1.3  mrg   return PDR_TYPE (pdr) == PDR_MAY_WRITE;
    237  1.3  mrg }
    238  1.3  mrg 
    239  1.3  mrg /* POLY_BB represents a blackbox in the polyhedral model.  */
    240  1.3  mrg 
    241  1.3  mrg struct poly_bb
    242  1.3  mrg {
    243  1.3  mrg   /* Pointer to a basic block or a statement in the compiler.  */
    244  1.3  mrg   gimple_poly_bb_p black_box;
    245  1.3  mrg 
    246  1.3  mrg   /* Pointer to the SCOP containing this PBB.  */
    247  1.3  mrg   scop_p scop;
    248  1.3  mrg 
    249  1.3  mrg   /* The iteration domain of this bb.  The layout of this polyhedron
    250  1.3  mrg      is I|G with I the iteration domain, G the context parameters.
    251  1.3  mrg 
    252  1.3  mrg      Example:
    253  1.3  mrg 
    254  1.3  mrg      for (i = a - 7*b + 8; i <= 3*a + 13*b + 20; i++)
    255  1.3  mrg        for (j = 2; j <= 2*i + 5; j++)
    256  1.3  mrg          for (k = 0; k <= 5; k++)
    257  1.3  mrg            S (i,j,k)
    258  1.3  mrg 
    259  1.3  mrg      Loop iterators: i, j, k
    260  1.3  mrg      Parameters: a, b
    261  1.3  mrg 
    262  1.3  mrg      | i >=  a -  7b +  8
    263  1.3  mrg      | i <= 3a + 13b + 20
    264  1.3  mrg      | j >= 2
    265  1.3  mrg      | j <= 2i + 5
    266  1.3  mrg      | k >= 0
    267  1.3  mrg      | k <= 5
    268  1.3  mrg 
    269  1.3  mrg      The number of variables in the DOMAIN may change and is not
    270  1.3  mrg      related to the number of loops in the original code.  */
    271  1.3  mrg   isl_set *domain;
    272  1.3  mrg #ifdef HAVE_ISL_OPTIONS_SET_SCHEDULE_SERIALIZE_SCCS
    273  1.3  mrg   isl_set *iterators;
    274  1.3  mrg #else
    275  1.3  mrg   /* The original scattering.  */
    276  1.3  mrg   isl_map *schedule;
    277  1.3  mrg 
    278  1.3  mrg   /* The transformed scattering.  */
    279  1.3  mrg   isl_map *transformed;
    280  1.3  mrg 
    281  1.3  mrg   /* A copy of the transformed scattering.  */
    282  1.3  mrg   isl_map *saved;
    283  1.3  mrg #endif
    284  1.3  mrg 
    285  1.3  mrg   /* The data references we access.  */
    286  1.3  mrg   vec<poly_dr_p> drs;
    287  1.3  mrg 
    288  1.3  mrg   /* The last basic block generated for this pbb.  */
    289  1.3  mrg   basic_block new_bb;
    290  1.3  mrg };
    291  1.3  mrg 
    292  1.3  mrg #define PBB_BLACK_BOX(PBB) ((gimple_poly_bb_p) PBB->black_box)
    293  1.3  mrg #define PBB_SCOP(PBB) (PBB->scop)
    294  1.3  mrg #define PBB_DRS(PBB) (PBB->drs)
    295  1.3  mrg 
    296  1.3  mrg extern poly_bb_p new_poly_bb (scop_p, gimple_poly_bb_p);
    297  1.3  mrg extern void print_pbb_domain (FILE *, poly_bb_p);
    298  1.3  mrg extern void print_pbb (FILE *, poly_bb_p);
    299  1.3  mrg extern void print_scop_context (FILE *, scop_p);
    300  1.3  mrg extern void print_scop (FILE *, scop_p);
    301  1.3  mrg extern void debug_pbb_domain (poly_bb_p);
    302  1.3  mrg extern void debug_pbb (poly_bb_p);
    303  1.3  mrg extern void print_pdrs (FILE *, poly_bb_p);
    304  1.3  mrg extern void debug_pdrs (poly_bb_p);
    305  1.3  mrg extern void debug_scop_context (scop_p);
    306  1.3  mrg extern void debug_scop (scop_p);
    307  1.3  mrg extern void print_scop_params (FILE *, scop_p);
    308  1.3  mrg extern void debug_scop_params (scop_p);
    309  1.3  mrg extern void print_iteration_domain (FILE *, poly_bb_p);
    310  1.3  mrg extern void print_iteration_domains (FILE *, scop_p);
    311  1.3  mrg extern void debug_iteration_domain (poly_bb_p);
    312  1.3  mrg extern void debug_iteration_domains (scop_p);
    313  1.3  mrg extern void print_isl_set (FILE *, isl_set *);
    314  1.3  mrg extern void print_isl_map (FILE *, isl_map *);
    315  1.3  mrg extern void print_isl_union_map (FILE *, isl_union_map *);
    316  1.3  mrg extern void print_isl_aff (FILE *, isl_aff *);
    317  1.3  mrg extern void print_isl_constraint (FILE *, isl_constraint *);
    318  1.3  mrg extern void print_isl_schedule (FILE *, isl_schedule *);
    319  1.3  mrg extern void debug_isl_schedule (isl_schedule *);
    320  1.3  mrg extern void print_isl_ast (FILE *, isl_ast_node *);
    321  1.3  mrg extern void debug_isl_ast (isl_ast_node *);
    322  1.3  mrg extern void debug_isl_set (isl_set *);
    323  1.3  mrg extern void debug_isl_map (isl_map *);
    324  1.3  mrg extern void debug_isl_union_map (isl_union_map *);
    325  1.3  mrg extern void debug_isl_aff (isl_aff *);
    326  1.3  mrg extern void debug_isl_constraint (isl_constraint *);
    327  1.3  mrg extern void debug_gmp_value (mpz_t);
    328  1.3  mrg extern void debug_scop_pbb (scop_p scop, int i);
    329  1.3  mrg extern void print_schedule_ast (FILE *, __isl_keep isl_schedule *, scop_p);
    330  1.3  mrg extern void debug_schedule_ast (__isl_keep isl_schedule *, scop_p);
    331  1.3  mrg 
    332  1.3  mrg /* The basic block of the PBB.  */
    333  1.3  mrg 
    334  1.3  mrg static inline basic_block
    335  1.3  mrg pbb_bb (poly_bb_p pbb)
    336  1.3  mrg {
    337  1.3  mrg   return GBB_BB (PBB_BLACK_BOX (pbb));
    338  1.3  mrg }
    339  1.3  mrg 
    340  1.3  mrg static inline int
    341  1.3  mrg pbb_index (poly_bb_p pbb)
    342  1.3  mrg {
    343  1.3  mrg   return pbb_bb (pbb)->index;
    344  1.3  mrg }
    345  1.3  mrg 
    346  1.3  mrg /* The loop of the PBB.  */
    347  1.3  mrg 
    348  1.3  mrg static inline loop_p
    349  1.3  mrg pbb_loop (poly_bb_p pbb)
    350  1.3  mrg {
    351  1.3  mrg   return gbb_loop (PBB_BLACK_BOX (pbb));
    352  1.3  mrg }
    353  1.3  mrg 
    354  1.3  mrg /* The scop that contains the PDR.  */
    355  1.3  mrg 
    356  1.3  mrg static inline scop_p
    357  1.3  mrg pdr_scop (poly_dr_p pdr)
    358  1.3  mrg {
    359  1.3  mrg   return PBB_SCOP (PDR_PBB (pdr));
    360  1.3  mrg }
    361  1.3  mrg 
    362  1.3  mrg /* Set black box of PBB to BLACKBOX.  */
    363  1.3  mrg 
    364  1.3  mrg static inline void
    365  1.3  mrg pbb_set_black_box (poly_bb_p pbb, gimple_poly_bb_p black_box)
    366  1.3  mrg {
    367  1.3  mrg   pbb->black_box = black_box;
    368  1.3  mrg }
    369  1.3  mrg 
    370  1.3  mrg /* A helper structure to keep track of data references, polyhedral BBs, and
    371  1.3  mrg    alias sets.  */
    372  1.3  mrg 
    373  1.3  mrg struct dr_info
    374  1.3  mrg {
    375  1.3  mrg   enum {
    376  1.3  mrg     invalid_alias_set = -1
    377  1.3  mrg   };
    378  1.3  mrg   /* The data reference.  */
    379  1.3  mrg   data_reference_p dr;
    380  1.3  mrg 
    381  1.3  mrg   /* The polyhedral BB containing this DR.  */
    382  1.3  mrg   poly_bb_p pbb;
    383  1.3  mrg 
    384  1.3  mrg   /* ALIAS_SET is the SCC number assigned by a graph_dfs of the alias graph.
    385  1.3  mrg      -1 is an invalid alias set.  */
    386  1.3  mrg   int alias_set;
    387  1.3  mrg 
    388  1.3  mrg   /* Construct a DR_INFO from a data reference DR, an ALIAS_SET, and a PBB.  */
    389  1.3  mrg   dr_info (data_reference_p dr, poly_bb_p pbb,
    390  1.3  mrg 	   int alias_set = invalid_alias_set)
    391  1.3  mrg     : dr (dr), pbb (pbb), alias_set (alias_set) {}
    392  1.3  mrg };
    393  1.3  mrg 
    394  1.3  mrg /* A SCOP is a Static Control Part of the program, simple enough to be
    395  1.3  mrg    represented in polyhedral form.  */
    396  1.3  mrg struct scop
    397  1.3  mrg {
    398  1.3  mrg   /* A SCOP is defined as a SESE region.  */
    399  1.3  mrg   sese_info_p scop_info;
    400  1.3  mrg 
    401  1.3  mrg   /* Number of parameters in SCoP.  */
    402  1.3  mrg   graphite_dim_t nb_params;
    403  1.3  mrg 
    404  1.3  mrg   /* All the basic blocks in this scop that contain memory references
    405  1.3  mrg      and that will be represented as statements in the polyhedral
    406  1.3  mrg      representation.  */
    407  1.3  mrg   vec<poly_bb_p> pbbs;
    408  1.3  mrg 
    409  1.3  mrg   /* All the data references in this scop.  */
    410  1.3  mrg   vec<dr_info> drs;
    411  1.3  mrg 
    412  1.3  mrg   /* The context describes known restrictions concerning the parameters
    413  1.3  mrg      and relations in between the parameters.
    414  1.3  mrg 
    415  1.3  mrg   void f (int8_t a, uint_16_t b) {
    416  1.3  mrg     c = 2 a + b;
    417  1.3  mrg     ...
    418  1.3  mrg   }
    419  1.3  mrg 
    420  1.3  mrg   Here we can add these restrictions to the context:
    421  1.3  mrg 
    422  1.3  mrg   -128 >= a >= 127
    423  1.3  mrg      0 >= b >= 65,535
    424  1.3  mrg      c = 2a + b  */
    425  1.3  mrg   isl_set *param_context;
    426  1.3  mrg 
    427  1.3  mrg   /* The context used internally by isl.  */
    428  1.3  mrg   isl_ctx *isl_context;
    429  1.3  mrg 
    430  1.3  mrg #ifdef HAVE_ISL_OPTIONS_SET_SCHEDULE_SERIALIZE_SCCS
    431  1.3  mrg   /* SCoP original schedule.  */
    432  1.3  mrg   isl_schedule *original_schedule;
    433  1.3  mrg 
    434  1.3  mrg   /* SCoP transformed schedule.  */
    435  1.3  mrg   isl_schedule *transformed_schedule;
    436  1.3  mrg #else
    437  1.3  mrg   /* SCoP final schedule.  */
    438  1.3  mrg   isl_schedule *schedule;
    439  1.3  mrg #endif
    440  1.3  mrg 
    441  1.3  mrg   /* The data dependence relation among the data references in this scop.  */
    442  1.3  mrg   isl_union_map *dependence;
    443  1.3  mrg };
    444  1.3  mrg 
    445  1.3  mrg extern scop_p new_scop (edge, edge);
    446  1.3  mrg extern void free_scop (scop_p);
    447  1.3  mrg extern gimple_poly_bb_p new_gimple_poly_bb (basic_block, vec<data_reference_p>,
    448  1.3  mrg 					    vec<scalar_use>, vec<tree>);
    449  1.3  mrg extern bool apply_poly_transforms (scop_p);
    450  1.3  mrg 
    451  1.3  mrg /* Set the region of SCOP to REGION.  */
    452  1.3  mrg 
    453  1.3  mrg static inline void
    454  1.3  mrg scop_set_region (scop_p scop, sese_info_p region)
    455  1.3  mrg {
    456  1.3  mrg   scop->scop_info = region;
    457  1.3  mrg }
    458  1.3  mrg 
    459  1.3  mrg /* Returns the number of parameters for SCOP.  */
    460  1.3  mrg 
    461  1.3  mrg static inline graphite_dim_t
    462  1.3  mrg scop_nb_params (scop_p scop)
    463  1.3  mrg {
    464  1.3  mrg   return scop->nb_params;
    465  1.3  mrg }
    466  1.3  mrg 
    467  1.3  mrg /* Set the number of params of SCOP to NB_PARAMS.  */
    468  1.3  mrg 
    469  1.3  mrg static inline void
    470  1.3  mrg scop_set_nb_params (scop_p scop, graphite_dim_t nb_params)
    471  1.3  mrg {
    472  1.3  mrg   scop->nb_params = nb_params;
    473  1.3  mrg }
    474  1.3  mrg 
    475  1.3  mrg #ifdef HAVE_ISL_OPTIONS_SET_SCHEDULE_SERIALIZE_SCCS
    476  1.3  mrg extern void scop_get_dependences (scop_p scop);
    477  1.3  mrg #else
    478  1.3  mrg extern isl_union_map *scop_get_dependences (scop_p scop);
    479  1.3  mrg #endif
    480  1.3  mrg 
    481  1.3  mrg bool
    482  1.3  mrg carries_deps (__isl_keep isl_union_map *schedule,
    483  1.3  mrg 	      __isl_keep isl_union_map *deps,
    484  1.3  mrg 	      int depth);
    485  1.3  mrg 
    486  1.3  mrg extern bool build_poly_scop (scop_p);
    487  1.3  mrg extern bool graphite_regenerate_ast_isl (scop_p);
    488  1.3  mrg extern void build_scops (vec<scop_p> *);
    489  1.3  mrg extern void dot_all_sese (FILE *, vec<sese_l> &);
    490  1.3  mrg extern void dot_sese (sese_l &);
    491  1.3  mrg extern void dot_cfg ();
    492  1.3  mrg 
    493  1.3  mrg #endif
    494