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