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