1 /* Graphite polyhedral representation.
2 Copyright (C) 2009-2015 Free Software Foundation, Inc.
3 Contributed by Sebastian Pop <sebastian.pop@amd.com> and
4 Tobias Grosser <grosser@fim.uni-passau.de>.
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
13 GCC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
22 #ifndef GCC_GRAPHITE_POLY_H
23 #define GCC_GRAPHITE_POLY_H
27 #ifndef HAVE_ISL_OPTIONS_SET_SCHEDULE_SERIALIZE_SCCS
29 # define isl_stat_ok 0
32 typedef struct poly_dr
*poly_dr_p
;
34 typedef struct poly_bb
*poly_bb_p
;
36 typedef struct scop
*scop_p
;
38 typedef unsigned graphite_dim_t
;
40 static inline graphite_dim_t
scop_nb_params (scop_p
);
42 /* A data reference can write or read some memory or we
43 just know it may write some memory. */
47 /* PDR_MAY_READs are represented using PDR_READS. This does not
48 limit the expressiveness. */
55 /* An identifier for this PDR. */
58 /* The number of data refs identical to this one in the PBB. */
61 /* A pointer to compiler's data reference description. */
64 /* A pointer to the PBB that contains this data reference. */
67 enum poly_dr_type type
;
69 /* The access polyhedron contains the polyhedral space this data
70 reference will access.
72 The polyhedron contains these dimensions:
75 Every memory access is classified in at least one alias set.
77 - The subscripts (s_0, ..., s_n):
78 The memory is accessed using zero or more subscript dimensions.
80 - The iteration domain (variables and parameters)
82 Do not hardcode the dimensions. Use the following accessor functions:
96 | if (unknown_function ())
103 The data access A[i][j+k] in alias set "5" is described like this:
108 | 0 -1 -1 0 0 1 0 = 0
109 | 0 0 0 0 1 0 0 >= 0 # The last four lines describe the
110 | 0 0 0 0 0 1 0 >= 0 # array size.
111 | 0 0 0 0 -1 0 1335 >= 0
112 | 0 0 0 0 0 -1 123 >= 0
114 The pointer "*p" in alias set "5" and "7" is described as a union of
128 "*p" accesses all of the object allocated with 'malloc'.
130 The scalar data access "m" is represented as an array with zero subscript
136 The difference between the graphite internal format for access data and
137 the OpenSop format is in the order of columns.
143 | 0 -1 -1 0 0 1 0 = 0
144 | 0 0 0 0 1 0 0 >= 0 # The last four lines describe the
145 | 0 0 0 0 0 1 0 >= 0 # array size.
146 | 0 0 0 0 -1 0 1335 >= 0
147 | 0 0 0 0 0 -1 123 >= 0
154 | 0 0 1 0 -1 -1 0 = 0
155 | 0 1 0 0 0 0 0 >= 0 # The last four lines describe the
156 | 0 0 1 0 0 0 0 >= 0 # array size.
157 | 0 -1 0 0 0 0 1335 >= 0
158 | 0 0 -1 0 0 0 123 >= 0
160 The OpenScop access function is printed as follows:
162 | 1 # The number of disjunct components in a union of access functions.
163 | R C O I L P # Described bellow.
167 | 0 0 1 0 -1 -1 0 = 0
168 | 0 1 0 0 0 0 0 >= 0 # The last four lines describe the
169 | 0 0 1 0 0 0 0 >= 0 # array size.
170 | 0 -1 0 0 0 0 1335 >= 0
171 | 0 0 -1 0 0 0 123 >= 0
175 - C: Number of columns.
176 - O: Number of output dimensions = alias set + number of subscripts.
177 - I: Number of input dimensions (iterators).
178 - L: Number of local (existentially quantified) dimensions.
179 - P: Number of parameters.
181 In the example, the vector "R C O I L P" is "7 7 3 2 0 1". */
183 isl_set
*subscript_sizes
;
185 /* Data reference's base object set number, we must assure 2 pdrs are in the
186 same base object set before dependency checking. */
187 int dr_base_object_set
;
189 /* The number of subscripts. */
190 graphite_dim_t nb_subscripts
;
193 #define PDR_ID(PDR) (PDR->id)
194 #define PDR_NB_REFS(PDR) (PDR->nb_refs)
195 #define PDR_CDR(PDR) (PDR->compiler_dr)
196 #define PDR_PBB(PDR) (PDR->pbb)
197 #define PDR_TYPE(PDR) (PDR->type)
198 #define PDR_ACCESSES(PDR) (NULL)
199 #define PDR_BASE_OBJECT_SET(PDR) (PDR->dr_base_object_set)
200 #define PDR_NB_SUBSCRIPTS(PDR) (PDR->nb_subscripts)
202 void new_poly_dr (poly_bb_p
, int, enum poly_dr_type
, void *,
203 graphite_dim_t
, isl_map
*, isl_set
*);
204 void free_poly_dr (poly_dr_p
);
205 void debug_pdr (poly_dr_p
, int);
206 void print_pdr (FILE *, poly_dr_p
, int);
209 pdr_read_p (poly_dr_p pdr
)
211 return PDR_TYPE (pdr
) == PDR_READ
;
214 /* Returns true when PDR is a "write". */
217 pdr_write_p (poly_dr_p pdr
)
219 return PDR_TYPE (pdr
) == PDR_WRITE
;
222 /* Returns true when PDR is a "may write". */
225 pdr_may_write_p (poly_dr_p pdr
)
227 return PDR_TYPE (pdr
) == PDR_MAY_WRITE
;
230 /* POLY_BB represents a blackbox in the polyhedral model. */
234 /* Pointer to a basic block or a statement in the compiler. */
237 /* Pointer to the SCOP containing this PBB. */
240 /* The iteration domain of this bb. The layout of this polyhedron
241 is I|G with I the iteration domain, G the context parameters.
245 for (i = a - 7*b + 8; i <= 3*a + 13*b + 20; i++)
246 for (j = 2; j <= 2*i + 5; j++)
247 for (k = 0; k <= 5; k++)
250 Loop iterators: i, j, k
260 The number of variables in the DOMAIN may change and is not
261 related to the number of loops in the original code. */
264 /* The data references we access. */
267 /* The original scattering. */
270 /* The transformed scattering. */
271 isl_map
*transformed
;
273 /* A copy of the transformed scattering. */
276 /* True when this PBB contains only a reduction statement. */
280 #define PBB_BLACK_BOX(PBB) ((gimple_bb_p) PBB->black_box)
281 #define PBB_SCOP(PBB) (PBB->scop)
282 #define PBB_DRS(PBB) (PBB->drs)
283 #define PBB_IS_REDUCTION(PBB) (PBB->is_reduction)
285 extern poly_bb_p
new_poly_bb (scop_p
, void *);
286 extern void free_poly_bb (poly_bb_p
);
287 extern void debug_loop_vec (poly_bb_p
);
288 extern void print_pbb_domain (FILE *, poly_bb_p
, int);
289 extern void print_pbb (FILE *, poly_bb_p
, int);
290 extern void print_scop_context (FILE *, scop_p
, int);
291 extern void print_scop (FILE *, scop_p
, int);
292 extern void debug_pbb_domain (poly_bb_p
, int);
293 extern void debug_pbb (poly_bb_p
, int);
294 extern void print_pdrs (FILE *, poly_bb_p
, int);
295 extern void debug_pdrs (poly_bb_p
, int);
296 extern void debug_scop_context (scop_p
, int);
297 extern void debug_scop (scop_p
, int);
298 extern void print_scop_params (FILE *, scop_p
, int);
299 extern void debug_scop_params (scop_p
, int);
300 extern void print_iteration_domain (FILE *, poly_bb_p
, int);
301 extern void print_iteration_domains (FILE *, scop_p
, int);
302 extern void debug_iteration_domain (poly_bb_p
, int);
303 extern void debug_iteration_domains (scop_p
, int);
304 extern void print_isl_set (FILE *, isl_set
*);
305 extern void print_isl_map (FILE *, isl_map
*);
306 extern void print_isl_aff (FILE *, isl_aff
*);
307 extern void print_isl_constraint (FILE *, isl_constraint
*);
308 extern void debug_isl_set (isl_set
*);
309 extern void debug_isl_map (isl_map
*);
310 extern void debug_isl_aff (isl_aff
*);
311 extern void debug_isl_constraint (isl_constraint
*);
312 extern int scop_do_interchange (scop_p
);
313 extern int scop_do_strip_mine (scop_p
, int);
314 extern bool scop_do_block (scop_p
);
315 extern bool flatten_all_loops (scop_p
);
316 extern bool optimize_isl (scop_p
);
317 extern void pbb_number_of_iterations_at_time (poly_bb_p
, graphite_dim_t
, mpz_t
);
318 extern void debug_gmp_value (mpz_t
);
320 /* Returns a gimple_bb from BB. */
322 static inline gimple_bb_p
323 gbb_from_bb (basic_block bb
)
325 return (gimple_bb_p
) bb
->aux
;
328 /* The poly_bb of the BB. */
330 static inline poly_bb_p
331 pbb_from_bb (basic_block bb
)
333 return GBB_PBB (gbb_from_bb (bb
));
336 /* The basic block of the PBB. */
338 static inline basic_block
339 pbb_bb (poly_bb_p pbb
)
341 return GBB_BB (PBB_BLACK_BOX (pbb
));
345 pbb_index (poly_bb_p pbb
)
347 return pbb_bb (pbb
)->index
;
350 /* The loop of the PBB. */
353 pbb_loop (poly_bb_p pbb
)
355 return gbb_loop (PBB_BLACK_BOX (pbb
));
358 /* The scop that contains the PDR. */
361 pdr_scop (poly_dr_p pdr
)
363 return PBB_SCOP (PDR_PBB (pdr
));
366 /* Set black box of PBB to BLACKBOX. */
369 pbb_set_black_box (poly_bb_p pbb
, void *black_box
)
371 pbb
->black_box
= black_box
;
374 /* A SCOP is a Static Control Part of the program, simple enough to be
375 represented in polyhedral form. */
378 /* A SCOP is defined as a SESE region. */
381 /* Number of parameters in SCoP. */
382 graphite_dim_t nb_params
;
384 /* All the basic blocks in this scop that contain memory references
385 and that will be represented as statements in the polyhedral
389 /* The context describes known restrictions concerning the parameters
390 and relations in between the parameters.
392 void f (int8_t a, uint_16_t b) {
397 Here we can add these restrictions to the context:
404 /* The context used internally by ISL. */
407 /* The original dependence relations:
408 RAW are read after write dependences,
409 WAR are write after read dependences,
410 WAW are write after write dependences. */
411 isl_union_map
*must_raw
, *may_raw
, *must_raw_no_source
, *may_raw_no_source
,
412 *must_war
, *may_war
, *must_war_no_source
, *may_war_no_source
,
413 *must_waw
, *may_waw
, *must_waw_no_source
, *may_waw_no_source
;
415 /* True when the scop has been converted to its polyhedral
420 #define SCOP_BBS(S) (S->bbs)
421 #define SCOP_REGION(S) (S->region)
422 #define SCOP_CONTEXT(S) (NULL)
423 #define POLY_SCOP_P(S) (S->poly_scop_p)
425 extern scop_p
new_scop (sese
);
426 extern void free_scop (scop_p
);
427 extern void free_scops (vec
<scop_p
> );
428 extern void print_generated_program (FILE *, scop_p
);
429 extern void debug_generated_program (scop_p
);
430 extern int unify_scattering_dimensions (scop_p
);
431 extern bool apply_poly_transforms (scop_p
);
432 extern bool graphite_legal_transform (scop_p
);
434 /* Set the region of SCOP to REGION. */
437 scop_set_region (scop_p scop
, sese region
)
439 scop
->region
= region
;
442 /* Returns the number of parameters for SCOP. */
444 static inline graphite_dim_t
445 scop_nb_params (scop_p scop
)
447 return scop
->nb_params
;
450 /* Set the number of params of SCOP to NB_PARAMS. */
453 scop_set_nb_params (scop_p scop
, graphite_dim_t nb_params
)
455 scop
->nb_params
= nb_params
;
458 bool graphite_legal_transform (scop_p
);
459 __isl_give isl_union_map
*extend_schedule (__isl_take isl_union_map
*);
462 compute_deps (scop_p scop
, vec
<poly_bb_p
> pbbs
,
463 isl_union_map
**must_raw
,
464 isl_union_map
**may_raw
,
465 isl_union_map
**must_raw_no_source
,
466 isl_union_map
**may_raw_no_source
,
467 isl_union_map
**must_war
,
468 isl_union_map
**may_war
,
469 isl_union_map
**must_war_no_source
,
470 isl_union_map
**may_war_no_source
,
471 isl_union_map
**must_waw
,
472 isl_union_map
**may_waw
,
473 isl_union_map
**must_waw_no_source
,
474 isl_union_map
**may_waw_no_source
);
477 scop_get_dependences (scop_p scop
);
480 carries_deps (__isl_keep isl_union_map
*schedule
,
481 __isl_keep isl_union_map
*deps
,