1 /* Graphite polyhedral representation.
2 Copyright (C) 2009, 2010 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/>. */
23 #include "coretypes.h"
29 #include "basic-block.h"
30 #include "diagnostic.h"
31 #include "tree-pretty-print.h"
32 #include "gimple-pretty-print.h"
33 #include "tree-flow.h"
35 #include "tree-dump.h"
38 #include "tree-chrec.h"
39 #include "tree-data-ref.h"
40 #include "tree-scalar-evolution.h"
41 #include "tree-pass.h"
43 #include "value-prof.h"
44 #include "pointer-set.h"
51 #include "graphite-ppl.h"
53 #include "graphite-poly.h"
54 #include "graphite-dependences.h"
55 #include "graphite-cloog-util.h"
57 #define OPENSCOP_MAX_STRING 256
59 /* Return the maximal loop depth in SCOP. */
62 scop_max_loop_depth (scop_p scop)
68 FOR_EACH_VEC_ELT (poly_bb_p, SCOP_BBS (scop), i, pbb)
70 int nb_loops = pbb_dim_iter_domain (pbb);
71 if (max_nb_loops < nb_loops)
72 max_nb_loops = nb_loops;
78 /* Extend the scattering matrix of PBB to MAX_SCATTERING scattering
82 extend_scattering (poly_bb_p pbb, int max_scattering)
84 ppl_dimension_type nb_old_dims, nb_new_dims;
86 ppl_Coefficient_t coef;
89 nb_added_dims = max_scattering - pbb_nb_scattering_transform (pbb);
92 ppl_new_Coefficient (&coef);
93 ppl_assign_Coefficient_from_mpz_t (coef, one);
95 gcc_assert (nb_added_dims >= 0);
97 nb_old_dims = pbb_nb_scattering_transform (pbb) + pbb_dim_iter_domain (pbb)
98 + scop_nb_params (PBB_SCOP (pbb));
99 nb_new_dims = nb_old_dims + nb_added_dims;
101 ppl_insert_dimensions (PBB_TRANSFORMED_SCATTERING (pbb),
102 pbb_nb_scattering_transform (pbb), nb_added_dims);
103 PBB_NB_SCATTERING_TRANSFORM (pbb) += nb_added_dims;
105 /* Add identity matrix for the added dimensions. */
106 for (i = max_scattering - nb_added_dims; i < max_scattering; i++)
108 ppl_Constraint_t cstr;
109 ppl_Linear_Expression_t expr;
111 ppl_new_Linear_Expression_with_dimension (&expr, nb_new_dims);
112 ppl_Linear_Expression_add_to_coefficient (expr, i, coef);
113 ppl_new_Constraint (&cstr, expr, PPL_CONSTRAINT_TYPE_EQUAL);
114 ppl_Polyhedron_add_constraint (PBB_TRANSFORMED_SCATTERING (pbb), cstr);
115 ppl_delete_Constraint (cstr);
116 ppl_delete_Linear_Expression (expr);
119 ppl_delete_Coefficient (coef);
123 /* All scattering matrices in SCOP will have the same number of scattering
127 unify_scattering_dimensions (scop_p scop)
131 graphite_dim_t max_scattering = 0;
133 FOR_EACH_VEC_ELT (poly_bb_p, SCOP_BBS (scop), i, pbb)
134 max_scattering = MAX (pbb_nb_scattering_transform (pbb), max_scattering);
136 FOR_EACH_VEC_ELT (poly_bb_p, SCOP_BBS (scop), i, pbb)
137 extend_scattering (pbb, max_scattering);
139 return max_scattering;
142 /* Print to FILE the pdr PH in OpenScop format. NB_SUBSCRIPTS is the number
143 of subscripts in PH, ALIAS_SET_DIM is the dimension of the alias set and
144 NB_PARAMS is the number of parameters in PH. */
147 openscop_print_pdr_polyhedron (FILE *file, ppl_const_Polyhedron_t ph,
148 int nb_subscripts, int alias_set_dimension,
151 int input, locals, output;
152 ppl_dimension_type alias_set_dim = (ppl_dimension_type) alias_set_dimension;
153 ppl_dimension_type sub_dim_last = alias_set_dim + nb_subscripts;
154 ppl_dimension_type *map, i, ph_space_dim = sub_dim_last + 1;
155 ppl_Polyhedron_t pph;
157 ppl_new_C_Polyhedron_from_C_Polyhedron (&pph, ph);
159 map = (ppl_dimension_type *) XNEWVEC (ppl_dimension_type, ph_space_dim);
161 for (i = 0; i < alias_set_dim - 1; i++)
162 map[i] = nb_subscripts + 1 + i;
164 for (i = alias_set_dim - 1; i < sub_dim_last; i++)
165 map[i] = i - alias_set_dim + 1;
167 ppl_Polyhedron_map_space_dimensions (pph, map, ph_space_dim - 1);
170 input = alias_set_dim - nb_params - 1;
172 /* According to OpenScop specification, the alias set column is a part of
173 the output columns. */
174 output = nb_subscripts + 1;
176 openscop_print_polyhedron_matrix (file, pph, output, input, locals, nb_params);
179 /* Print to FILE the powerset PDR. NB_SUBSCRIPTS is the number of subscripts
180 in PDR, ALIAS_SET_DIM is the dimension of the alias set in PDR and
181 NB_PARAMS is the number of parameters in PDR. */
184 openscop_print_pdr_powerset (FILE *file,
185 ppl_Pointset_Powerset_C_Polyhedron_t ps,
191 ppl_Pointset_Powerset_C_Polyhedron_iterator_t it, end;
193 ppl_new_Pointset_Powerset_C_Polyhedron_iterator (&it);
194 ppl_new_Pointset_Powerset_C_Polyhedron_iterator (&end);
196 ppl_Pointset_Powerset_C_Polyhedron_size (ps, &nb_disjuncts);
197 fprintf (file, "%d\n", (int) nb_disjuncts);
199 for (ppl_Pointset_Powerset_C_Polyhedron_iterator_begin (ps, it),
200 ppl_Pointset_Powerset_C_Polyhedron_iterator_end (ps, end);
201 !ppl_Pointset_Powerset_C_Polyhedron_iterator_equal_test (it, end);
202 ppl_Pointset_Powerset_C_Polyhedron_iterator_increment (it))
204 ppl_const_Polyhedron_t ph;
206 ppl_Pointset_Powerset_C_Polyhedron_iterator_dereference (it, &ph);
207 openscop_print_pdr_polyhedron (file, ph, nb_subscripts, alias_set_dim,
211 ppl_delete_Pointset_Powerset_C_Polyhedron_iterator (it);
212 ppl_delete_Pointset_Powerset_C_Polyhedron_iterator (end);
215 /* Print to FILE the powerset PS in its OpenScop matrix form. */
218 openscop_print_powerset_matrix (FILE *file,
219 ppl_Pointset_Powerset_C_Polyhedron_t ps,
220 int output, int input, int locals,
224 ppl_Pointset_Powerset_C_Polyhedron_iterator_t it, end;
226 ppl_new_Pointset_Powerset_C_Polyhedron_iterator (&it);
227 ppl_new_Pointset_Powerset_C_Polyhedron_iterator (&end);
229 ppl_Pointset_Powerset_C_Polyhedron_size (ps, &nb_disjuncts);
230 fprintf (file, "%d\n", (int) nb_disjuncts);
232 for (ppl_Pointset_Powerset_C_Polyhedron_iterator_begin (ps, it),
233 ppl_Pointset_Powerset_C_Polyhedron_iterator_end (ps, end);
234 !ppl_Pointset_Powerset_C_Polyhedron_iterator_equal_test (it, end);
235 ppl_Pointset_Powerset_C_Polyhedron_iterator_increment (it))
237 ppl_const_Polyhedron_t ph;
239 ppl_Pointset_Powerset_C_Polyhedron_iterator_dereference (it, &ph);
240 openscop_print_polyhedron_matrix (file, ph, output, input, locals,
244 ppl_delete_Pointset_Powerset_C_Polyhedron_iterator (it);
245 ppl_delete_Pointset_Powerset_C_Polyhedron_iterator (end);
248 /* Prints to FILE the scattering function of PBB in OpenScop format, at some
252 openscop_print_scattering_function_1 (FILE *file, poly_bb_p pbb, int verbosity)
255 ppl_const_Polyhedron_t ph;
259 fprintf (file, "# scattering bb_%d (\n", pbb_index (pbb));
260 fprintf (file, "#eq");
262 for (i = 0; i < pbb_nb_scattering_transform (pbb); i++)
263 fprintf (file, " s%d", (int) i);
265 for (i = 0; i < pbb_nb_local_vars (pbb); i++)
266 fprintf (file, " lv%d", (int) i);
268 for (i = 0; i < pbb_dim_iter_domain (pbb); i++)
269 fprintf (file, " i%d", (int) i);
271 for (i = 0; i < pbb_nb_params (pbb); i++)
272 fprintf (file, " p%d", (int) i);
274 fprintf (file, " cst\n");
277 /* Number of disjunct components. Remove this when
278 PBB_TRANSFORMED_SCATTERING will be a pointset_powerset. */
279 fprintf (file, "1\n");
281 ph = PBB_TRANSFORMED_SCATTERING (pbb)
282 ? PBB_TRANSFORMED_SCATTERING (pbb)
283 : PBB_ORIGINAL_SCATTERING (pbb);
285 openscop_print_polyhedron_matrix (file, ph,
286 pbb_nb_scattering_transform (pbb),
287 pbb_dim_iter_domain (pbb),
288 pbb_nb_local_vars (pbb),
289 pbb_nb_params (pbb));
292 fprintf (file, "#)\n");
295 /* Prints to FILE the scattering function of PBB, at some VERBOSITY
299 print_scattering_function_1 (FILE *file, poly_bb_p pbb, int verbosity)
305 fprintf (file, "# scattering bb_%d (\n", pbb_index (pbb));
306 fprintf (file, "#eq");
308 for (i = 0; i < pbb_nb_scattering_transform (pbb); i++)
309 fprintf (file, " s%d", (int) i);
311 for (i = 0; i < pbb_nb_local_vars (pbb); i++)
312 fprintf (file, " lv%d", (int) i);
314 for (i = 0; i < pbb_dim_iter_domain (pbb); i++)
315 fprintf (file, " i%d", (int) i);
317 for (i = 0; i < pbb_nb_params (pbb); i++)
318 fprintf (file, " p%d", (int) i);
320 fprintf (file, " cst\n");
323 /* Number of disjunct components. Remove this when
324 PBB_TRANSFORMED_SCATTERING will be a pointset_powerset. */
325 fprintf (file, "1\n");
326 ppl_print_polyhedron_matrix (file, PBB_TRANSFORMED_SCATTERING (pbb)
327 ? PBB_TRANSFORMED_SCATTERING (pbb)
328 : PBB_ORIGINAL_SCATTERING (pbb));
331 fprintf (file, "#)\n");
334 /* Prints to FILE the scattering function of PBB, at some VERBOSITY
338 print_scattering_function (FILE *file, poly_bb_p pbb, int verbosity)
340 if (!PBB_TRANSFORMED (pbb))
343 if (PBB_TRANSFORMED_SCATTERING (pbb)
344 || PBB_ORIGINAL_SCATTERING (pbb))
347 fprintf (file, "# Scattering function is provided\n");
349 fprintf (file, "1\n");
354 fprintf (file, "# Scattering function is not provided\n");
356 fprintf (file, "0\n");
360 openscop_print_scattering_function_1 (file, pbb, verbosity);
363 fprintf (file, "# Scattering names are not provided\n");
365 fprintf (file, "0\n");
369 /* Prints to FILE the iteration domain of PBB, at some VERBOSITY
373 print_iteration_domain (FILE *file, poly_bb_p pbb, int verbosity)
375 print_pbb_domain (file, pbb, verbosity);
378 /* Prints to FILE the scattering functions of every PBB of SCOP. */
381 print_scattering_functions (FILE *file, scop_p scop, int verbosity)
386 FOR_EACH_VEC_ELT (poly_bb_p, SCOP_BBS (scop), i, pbb)
387 print_scattering_function (file, pbb, verbosity);
390 /* Prints to FILE the iteration domains of every PBB of SCOP, at some
394 print_iteration_domains (FILE *file, scop_p scop, int verbosity)
399 FOR_EACH_VEC_ELT (poly_bb_p, SCOP_BBS (scop), i, pbb)
400 print_iteration_domain (file, pbb, verbosity);
403 /* Prints to STDERR the scattering function of PBB, at some VERBOSITY
407 debug_scattering_function (poly_bb_p pbb, int verbosity)
409 print_scattering_function (stderr, pbb, verbosity);
412 /* Prints to STDERR the iteration domain of PBB, at some VERBOSITY
416 debug_iteration_domain (poly_bb_p pbb, int verbosity)
418 print_iteration_domain (stderr, pbb, verbosity);
421 /* Prints to STDERR the scattering functions of every PBB of SCOP, at
422 some VERBOSITY level. */
425 debug_scattering_functions (scop_p scop, int verbosity)
427 print_scattering_functions (stderr, scop, verbosity);
430 /* Prints to STDERR the iteration domains of every PBB of SCOP, at
431 some VERBOSITY level. */
434 debug_iteration_domains (scop_p scop, int verbosity)
436 print_iteration_domains (stderr, scop, verbosity);
439 /* Read N integer from FILE. */
442 openscop_read_N_int (FILE *file, int N)
444 char s[OPENSCOP_MAX_STRING];
446 int i, *res = (int *) xmalloc (OPENSCOP_MAX_STRING * sizeof (int));
448 /* Skip blank and commented lines. */
449 while (fgets (s, sizeof s, file) == (char *) 0
456 for (i = 0; i < N; i++)
458 sscanf (str, "%d", &res[i]);
460 /* Jump the integer that was read. */
461 while ((*str) && !ISSPACE (*str) && (*str != '#'))
465 while ((*str) && ISSPACE (*str) && (*str != '#'))
472 /* Read one integer from FILE. */
475 openscop_read_one_int (FILE *file)
477 int *x = openscop_read_N_int (file, 1);
484 /* Read N string from FILE. */
487 openscop_read_N_string (FILE *file, int N)
490 char str[OPENSCOP_MAX_STRING];
491 char *tmp = (char *) xmalloc (sizeof (char) * OPENSCOP_MAX_STRING);
494 /* Skip blank and commented lines. */
495 while (fgets (str, sizeof str, file) == (char *) 0
503 for (i = 0; i < N; i++)
505 /* Read the first word. */
506 for (; (*s) && (!ISSPACE (*s)) && (*s != '#'); ++count)
513 while ((*s) && ISSPACE (*s) && (*s != '#'))
522 /* Read one string from FILE. */
525 openscop_read_one_string (FILE *file)
527 return openscop_read_N_string (file, 1);
530 /* Read from FILE the powerset PS in its OpenScop matrix form. OUTPUT is the
531 number of output dimensions, INPUT is the number of input dimensions,
532 LOCALS is the number of existentially quantified variables and PARAMS is
533 the number of parameters. */
536 openscop_read_powerset_matrix (FILE *file,
537 ppl_Pointset_Powerset_C_Polyhedron_t *ps,
538 int *output, int *input, int *locals,
543 nb_disjuncts = openscop_read_one_int (file);
545 for (i = 0; i < nb_disjuncts; i++)
549 openscop_read_polyhedron_matrix (file, &ph, output, input, locals,
554 ppl_new_Pointset_Powerset_C_Polyhedron_from_C_Polyhedron (ps, ph);
556 ppl_Pointset_Powerset_C_Polyhedron_add_disjunct (*ps, ph);
560 /* Read a scattering function from FILE and save it to PBB. Return whether
561 the scattering function was provided or not. */
564 graphite_read_scatt (FILE *file, poly_bb_p pbb)
566 bool scattering_provided = false;
567 int output, input, locals, params;
568 ppl_Polyhedron_t newp;
570 if (openscop_read_one_int (file) > 0)
572 /* Read number of disjunct components. */
573 openscop_read_one_int (file);
575 /* Read scattering function. */
576 openscop_read_polyhedron_matrix (file, &newp, &output, &input,
578 store_scattering (PBB_SCOP (pbb));
579 PBB_TRANSFORMED (pbb) = poly_scattering_new ();
580 PBB_TRANSFORMED_SCATTERING (pbb) = newp;
581 PBB_NB_LOCAL_VARIABLES (pbb) = locals;
583 /* New scattering dimension. */
584 PBB_NB_SCATTERING_TRANSFORM (pbb) = output;
586 scattering_provided = true;
589 return scattering_provided;
592 /* Read a scop file. Return true if the scop is transformed. */
595 graphite_read_scop_file (FILE *file, scop_p scop)
597 char *tmp, *language;
598 size_t i, j, nb_statements, nbr, nbw;
599 int input, output, locals, params;
600 ppl_Pointset_Powerset_C_Polyhedron_t ps;
602 bool transform_done = false;
604 /* Ensure that the file is in OpenScop format. */
605 tmp = openscop_read_N_string (file, 2);
607 if (strcmp (tmp, "SCoP 1"))
609 error ("The file is not in OpenScop format.\n");
615 /* Read the language. */
616 language = openscop_read_one_string (file);
618 if (strcmp (language, "Gimple"))
620 error ("The language is not recognized\n");
626 /* Read the context but do not use it. */
627 openscop_read_powerset_matrix (file, &ps, &input, &output, &locals, ¶ms);
629 if ((size_t) params != scop->nb_params)
631 error ("Parameters number in the scop file is different from the"
632 " internal scop parameter number.");
636 /* Read parameter names if provided. */
637 if (openscop_read_one_int (file))
638 openscop_read_N_string (file, scop->nb_params);
640 nb_statements = openscop_read_one_int (file);
642 if (nb_statements != VEC_length (poly_bb_p, SCOP_BBS (scop)))
644 error ("Number of statements in the OpenScop file does not match"
645 " the graphite internal statements number.");
649 for (i = 0; VEC_iterate (poly_bb_p, SCOP_BBS (scop), i, pbb); i++)
651 /* Read iteration domain. */
652 openscop_read_powerset_matrix (file, &ps, &input, &output, &locals,
655 /* Read scattering. */
656 transform_done = graphite_read_scatt (file, pbb);
658 /* Scattering names. */
659 openscop_read_one_int (file);
661 /* Read access functions. */
662 if (openscop_read_one_int (file) > 0)
664 nbr = openscop_read_one_int (file);
666 /* Read access functions. */
667 for (j = 0; j < nbr; j++)
668 openscop_read_powerset_matrix (file, &ps, &input, &output, &locals,
671 nbw = openscop_read_one_int (file);
673 /* Write access functions. */
674 for (j = 0; j < nbw; j++)
675 openscop_read_powerset_matrix (file, &ps, &input, &output, &locals,
679 /* Statement body. */
680 openscop_read_one_int (file);
683 return transform_done;
686 /* Initialize and return a file that will be used to write a scop. SCOP_NUMBER
687 is a sequential number (identifier) used to differentiate scop files.
688 Examples of the generated file names: dump_base_name.0.graphite,
689 dump_base_name.1.graphite, dump_base_name.2.graphite, etc. */
692 init_graphite_out_file (int scop_number)
694 FILE *graphite_out_file;
695 int len = strlen (dump_base_name);
696 char *dumpname = XNEWVEC (char, len + 25);
697 char *s_scop_number = XNEWVEC (char, 15);
699 memcpy (dumpname, dump_base_name, len + 1);
700 strip_off_ending (dumpname, len);
701 sprintf (s_scop_number, ".%d", scop_number);
702 strcat (dumpname, s_scop_number);
703 strcat (dumpname, ".graphite");
704 graphite_out_file = fopen (dumpname, "w+b");
706 if (graphite_out_file == 0)
707 fatal_error ("can%'t open %s for writing: %m", dumpname);
711 return graphite_out_file;
714 /* Open and return a file used for scop reading. SCOP_NUMBER is a sequential
715 number (identifier) used to differentiate scop files. Examples of the
716 generated file names: dump_base_name.0.graphite, dump_base_name.1.graphite,
717 dump_base_name.2.graphite, etc. */
720 init_graphite_in_file (int scop_number)
722 FILE *graphite_in_file;
723 int len = strlen (dump_base_name);
724 char *dumpname = XNEWVEC (char, len + 25);
725 char *s_scop_number = XNEWVEC (char, 15);
727 memcpy (dumpname, dump_base_name, len + 1);
728 strip_off_ending (dumpname, len);
729 sprintf (s_scop_number, ".%d", scop_number);
730 strcat (dumpname, s_scop_number);
731 strcat (dumpname, ".graphite");
732 graphite_in_file = fopen (dumpname, "r+b");
734 if (graphite_in_file == 0)
735 fatal_error ("can%'t open %s for reading: %m", dumpname);
739 return graphite_in_file;
742 /* Apply graphite transformations to all the basic blocks of SCOP. */
745 apply_poly_transforms (scop_p scop)
747 bool transform_done = false;
749 static size_t file_scop_number = 0;
751 /* This feature is only enabled in the Graphite branch. */
754 graphite_file = init_graphite_in_file (file_scop_number);
755 transform_done |= graphite_read_scop_file (graphite_file, scop);
756 gcc_assert (graphite_legal_transform (scop));
760 /* Generate code even if we did not apply any real transformation.
761 This also allows to check the performance for the identity
762 transformation: GIMPLE -> GRAPHITE -> GIMPLE
763 Keep in mind that CLooG optimizes in control, so the loop structure
764 may change, even if we only use -fgraphite-identity. */
765 if (flag_graphite_identity)
766 transform_done = true;
768 if (flag_loop_parallelize_all)
769 transform_done = true;
772 transform_done |= scop_do_block (scop);
775 if (flag_loop_strip_mine)
776 transform_done |= scop_do_strip_mine (scop);
778 if (flag_loop_interchange)
779 transform_done |= scop_do_interchange (scop);
782 /* This feature is only enabled in the Graphite branch. */
785 graphite_file = init_graphite_out_file (file_scop_number);
786 print_scop (graphite_file, scop, 1);
790 return transform_done;
793 /* Returns true when it PDR1 is a duplicate of PDR2: same PBB, and
794 their ACCESSES, TYPE, and NB_SUBSCRIPTS are the same. */
797 can_collapse_pdrs (poly_dr_p pdr1, poly_dr_p pdr2)
800 ppl_Pointset_Powerset_C_Polyhedron_t af1, af2, diff;
802 if (PDR_PBB (pdr1) != PDR_PBB (pdr2)
803 || PDR_NB_SUBSCRIPTS (pdr1) != PDR_NB_SUBSCRIPTS (pdr2)
804 || PDR_TYPE (pdr1) != PDR_TYPE (pdr2))
807 af1 = PDR_ACCESSES (pdr1);
808 af2 = PDR_ACCESSES (pdr2);
809 ppl_new_Pointset_Powerset_C_Polyhedron_from_Pointset_Powerset_C_Polyhedron
811 ppl_Pointset_Powerset_C_Polyhedron_difference_assign (diff, af2);
813 res = ppl_Pointset_Powerset_C_Polyhedron_is_empty (diff);
814 ppl_delete_Pointset_Powerset_C_Polyhedron (diff);
818 /* Removes duplicated data references in PBB. */
821 pbb_remove_duplicate_pdrs (poly_bb_p pbb)
824 poly_dr_p pdr1, pdr2;
825 unsigned n = VEC_length (poly_dr_p, PBB_DRS (pbb));
826 VEC (poly_dr_p, heap) *collapsed = VEC_alloc (poly_dr_p, heap, n);
828 FOR_EACH_VEC_ELT (poly_dr_p, PBB_DRS (pbb), i, pdr1)
829 FOR_EACH_VEC_ELT (poly_dr_p, collapsed, j, pdr2)
830 if (!can_collapse_pdrs (pdr1, pdr2))
831 VEC_quick_push (poly_dr_p, collapsed, pdr1);
833 VEC_free (poly_dr_p, heap, collapsed);
834 PBB_PDR_DUPLICATES_REMOVED (pbb) = true;
837 /* Create a new polyhedral data reference and add it to PBB. It is
838 defined by its ACCESSES, its TYPE, and the number of subscripts
842 new_poly_dr (poly_bb_p pbb, int dr_base_object_set,
843 ppl_Pointset_Powerset_C_Polyhedron_t accesses,
844 enum poly_dr_type type, void *cdr, graphite_dim_t nb_subscripts)
847 poly_dr_p pdr = XNEW (struct poly_dr);
850 PDR_BASE_OBJECT_SET (pdr) = dr_base_object_set;
851 PDR_NB_REFS (pdr) = 1;
853 PDR_ACCESSES (pdr) = accesses;
854 PDR_TYPE (pdr) = type;
856 PDR_NB_SUBSCRIPTS (pdr) = nb_subscripts;
857 VEC_safe_push (poly_dr_p, heap, PBB_DRS (pbb), pdr);
860 /* Free polyhedral data reference PDR. */
863 free_poly_dr (poly_dr_p pdr)
865 ppl_delete_Pointset_Powerset_C_Polyhedron (PDR_ACCESSES (pdr));
869 /* Create a new polyhedral black box. */
872 new_poly_bb (scop_p scop, void *black_box, bool reduction)
874 poly_bb_p pbb = XNEW (struct poly_bb);
876 PBB_DOMAIN (pbb) = NULL;
877 PBB_SCOP (pbb) = scop;
878 pbb_set_black_box (pbb, black_box);
879 PBB_TRANSFORMED (pbb) = NULL;
880 PBB_SAVED (pbb) = NULL;
881 PBB_ORIGINAL (pbb) = NULL;
882 PBB_DRS (pbb) = VEC_alloc (poly_dr_p, heap, 3);
883 PBB_IS_REDUCTION (pbb) = reduction;
884 PBB_PDR_DUPLICATES_REMOVED (pbb) = false;
885 VEC_safe_push (poly_bb_p, heap, SCOP_BBS (scop), pbb);
888 /* Free polyhedral black box. */
891 free_poly_bb (poly_bb_p pbb)
896 ppl_delete_Pointset_Powerset_C_Polyhedron (PBB_DOMAIN (pbb));
898 if (PBB_TRANSFORMED (pbb))
899 poly_scattering_free (PBB_TRANSFORMED (pbb));
902 poly_scattering_free (PBB_SAVED (pbb));
904 if (PBB_ORIGINAL (pbb))
905 poly_scattering_free (PBB_ORIGINAL (pbb));
908 FOR_EACH_VEC_ELT (poly_dr_p, PBB_DRS (pbb), i, pdr)
911 VEC_free (poly_dr_p, heap, PBB_DRS (pbb));
916 print_pdr_access_layout (FILE *file, poly_bb_p pbb, poly_dr_p pdr)
920 fprintf (file, "# eq");
922 fprintf (file, " alias");
924 for (i = 0; i < PDR_NB_SUBSCRIPTS (pdr); i++)
925 fprintf (file, " sub%d", (int) i);
927 for (i = 0; i < pbb_dim_iter_domain (pbb); i++)
928 fprintf (file, " i%d", (int) i);
930 for (i = 0; i < pbb_nb_params (pbb); i++)
931 fprintf (file, " p%d", (int) i);
933 fprintf (file, " cst\n");
936 /* Prints to FILE the polyhedral data reference PDR, at some VERBOSITY
940 print_pdr (FILE *file, poly_dr_p pdr, int verbosity)
946 fprintf (file, "# pdr_%d (", PDR_ID (pdr));
948 switch (PDR_TYPE (pdr))
951 fprintf (file, "read \n");
955 fprintf (file, "write \n");
959 fprintf (file, "may_write \n");
966 dump_data_reference (file, (data_reference_p) PDR_CDR (pdr));
971 fprintf (file, "# data accesses (\n");
972 print_pdr_access_layout (file, PDR_PBB (pdr), pdr);
975 alias_set_dim = pdr_alias_set_dim (pdr) + 1;
977 openscop_print_pdr_powerset (file,
979 PDR_NB_SUBSCRIPTS (pdr),
981 pbb_nb_params (PDR_PBB (pdr)));
984 fprintf (file, "#)\n");
987 fprintf (file, "#)\n");
990 /* Prints to STDERR the polyhedral data reference PDR, at some
994 debug_pdr (poly_dr_p pdr, int verbosity)
996 print_pdr (stderr, pdr, verbosity);
999 /* Creates a new SCOP containing REGION. */
1002 new_scop (void *region)
1004 scop_p scop = XNEW (struct scop);
1006 SCOP_CONTEXT (scop) = NULL;
1007 scop_set_region (scop, region);
1008 SCOP_BBS (scop) = VEC_alloc (poly_bb_p, heap, 3);
1009 SCOP_ORIGINAL_PDDRS (scop) = htab_create (10, hash_poly_ddr_p,
1010 eq_poly_ddr_p, free_poly_ddr);
1011 SCOP_ORIGINAL_SCHEDULE (scop) = NULL;
1012 SCOP_TRANSFORMED_SCHEDULE (scop) = NULL;
1013 SCOP_SAVED_SCHEDULE (scop) = NULL;
1014 POLY_SCOP_P (scop) = false;
1022 free_scop (scop_p scop)
1027 FOR_EACH_VEC_ELT (poly_bb_p, SCOP_BBS (scop), i, pbb)
1030 VEC_free (poly_bb_p, heap, SCOP_BBS (scop));
1032 if (SCOP_CONTEXT (scop))
1033 ppl_delete_Pointset_Powerset_C_Polyhedron (SCOP_CONTEXT (scop));
1035 htab_delete (SCOP_ORIGINAL_PDDRS (scop));
1036 free_lst (SCOP_ORIGINAL_SCHEDULE (scop));
1037 free_lst (SCOP_TRANSFORMED_SCHEDULE (scop));
1038 free_lst (SCOP_SAVED_SCHEDULE (scop));
1042 /* Print to FILE the domain of PBB in OpenScop format, at some VERBOSITY
1046 openscop_print_pbb_domain (FILE *file, poly_bb_p pbb, int verbosity)
1049 gimple_bb_p gbb = PBB_BLACK_BOX (pbb);
1051 if (!PBB_DOMAIN (pbb))
1056 fprintf (file, "\n# Iteration domain of bb_%d (\n", GBB_BB (gbb)->index);
1057 fprintf (file, "#eq");
1059 for (i = 0; i < pbb_dim_iter_domain (pbb); i++)
1060 fprintf (file, " i%d", (int) i);
1062 for (i = 0; i < pbb_nb_params (pbb); i++)
1063 fprintf (file, " p%d", (int) i);
1065 fprintf (file, " cst\n");
1068 if (PBB_DOMAIN (pbb))
1069 openscop_print_powerset_matrix (file, PBB_DOMAIN (pbb),
1070 pbb_dim_iter_domain (pbb),
1073 pbb_nb_params (pbb));
1075 fprintf (file, "0\n");
1078 fprintf (file, "#)\n");
1081 /* Print to FILE the domain of PBB, at some VERBOSITY level. */
1084 print_pbb_domain (FILE *file, poly_bb_p pbb, int verbosity)
1087 gimple_bb_p gbb = PBB_BLACK_BOX (pbb);
1089 if (!PBB_DOMAIN (pbb))
1094 fprintf (file, "# Iteration domain of bb_%d (\n", GBB_BB (gbb)->index);
1095 fprintf (file, "# eq");
1097 for (i = 0; i < pbb_dim_iter_domain (pbb); i++)
1098 fprintf (file, " i%d", (int) i);
1100 for (i = 0; i < pbb_nb_params (pbb); i++)
1101 fprintf (file, " p%d", (int) i);
1103 fprintf (file, " cst\n");
1106 if (PBB_DOMAIN (pbb))
1107 ppl_print_powerset_matrix (file, PBB_DOMAIN (pbb));
1109 fprintf (file, "0\n");
1112 fprintf (file, "#)\n");
1115 /* Dump the cases of a graphite basic block GBB on FILE. */
1118 dump_gbb_cases (FILE *file, gimple_bb_p gbb)
1122 VEC (gimple, heap) *cases;
1127 cases = GBB_CONDITION_CASES (gbb);
1128 if (VEC_empty (gimple, cases))
1131 fprintf (file, "# cases bb_%d (\n", GBB_BB (gbb)->index);
1133 FOR_EACH_VEC_ELT (gimple, cases, i, stmt)
1135 fprintf (file, "# ");
1136 print_gimple_stmt (file, stmt, 0, 0);
1139 fprintf (file, "#)\n");
1142 /* Dump conditions of a graphite basic block GBB on FILE. */
1145 dump_gbb_conditions (FILE *file, gimple_bb_p gbb)
1149 VEC (gimple, heap) *conditions;
1154 conditions = GBB_CONDITIONS (gbb);
1155 if (VEC_empty (gimple, conditions))
1158 fprintf (file, "# conditions bb_%d (\n", GBB_BB (gbb)->index);
1160 FOR_EACH_VEC_ELT (gimple, conditions, i, stmt)
1162 fprintf (file, "# ");
1163 print_gimple_stmt (file, stmt, 0, 0);
1166 fprintf (file, "#)\n");
1169 /* Print to FILE all the data references of PBB, at some VERBOSITY
1173 print_pdrs (FILE *file, poly_bb_p pbb, int verbosity)
1180 if (VEC_length (poly_dr_p, PBB_DRS (pbb)) == 0)
1183 fprintf (file, "# Access informations are not provided\n");\
1184 fprintf (file, "0\n");
1189 fprintf (file, "# Data references (\n");
1192 fprintf (file, "# Access informations are provided\n");
1193 fprintf (file, "1\n");
1195 FOR_EACH_VEC_ELT (poly_dr_p, PBB_DRS (pbb), i, pdr)
1196 if (PDR_TYPE (pdr) == PDR_READ)
1202 fprintf (file, "# Read data references (\n");
1205 fprintf (file, "# Read access informations\n");
1206 fprintf (file, "%d\n", nb_reads);
1208 FOR_EACH_VEC_ELT (poly_dr_p, PBB_DRS (pbb), i, pdr)
1209 if (PDR_TYPE (pdr) == PDR_READ)
1210 print_pdr (file, pdr, verbosity);
1213 fprintf (file, "#)\n");
1216 fprintf (file, "# Write data references (\n");
1219 fprintf (file, "# Write access informations\n");
1220 fprintf (file, "%d\n", nb_writes);
1222 FOR_EACH_VEC_ELT (poly_dr_p, PBB_DRS (pbb), i, pdr)
1223 if (PDR_TYPE (pdr) != PDR_READ)
1224 print_pdr (file, pdr, verbosity);
1227 fprintf (file, "#)\n");
1230 fprintf (file, "#)\n");
1233 /* Print to STDERR all the data references of PBB. */
1236 debug_pdrs (poly_bb_p pbb, int verbosity)
1238 print_pdrs (stderr, pbb, verbosity);
1241 /* Print to FILE the body of PBB, at some VERBOSITY level.
1242 If statement_body_provided is false statement body is not printed. */
1245 print_pbb_body (FILE *file, poly_bb_p pbb, int verbosity,
1246 bool statement_body_provided)
1249 fprintf (file, "# Body (\n");
1251 if (!statement_body_provided)
1254 fprintf (file, "# Statement body is not provided\n");
1256 fprintf (file, "0\n");
1259 fprintf (file, "#)\n");
1264 fprintf (file, "# Statement body is provided\n");
1265 fprintf (file, "1\n");
1268 fprintf (file, "# Original iterator names\n# Iterator names are not provided yet.\n");
1271 fprintf (file, "# Statement body\n");
1273 fprintf (file, "{\n");
1274 dump_bb (pbb_bb (pbb), file, 0);
1275 fprintf (file, "}\n");
1278 fprintf (file, "#)\n");
1281 /* Print to FILE the domain and scattering function of PBB, at some
1285 print_pbb (FILE *file, poly_bb_p pbb, int verbosity)
1289 fprintf (file, "# pbb_%d (\n", pbb_index (pbb));
1290 dump_gbb_conditions (file, PBB_BLACK_BOX (pbb));
1291 dump_gbb_cases (file, PBB_BLACK_BOX (pbb));
1294 openscop_print_pbb_domain (file, pbb, verbosity);
1295 print_scattering_function (file, pbb, verbosity);
1296 print_pdrs (file, pbb, verbosity);
1297 print_pbb_body (file, pbb, verbosity, false);
1300 fprintf (file, "#)\n");
1303 /* Print to FILE the parameters of SCOP, at some VERBOSITY level. */
1306 print_scop_params (FILE *file, scop_p scop, int verbosity)
1312 fprintf (file, "# parameters (\n");
1314 if (VEC_length (tree, SESE_PARAMS (SCOP_REGION (scop))))
1317 fprintf (file, "# Parameter names are provided\n");
1319 fprintf (file, "1\n");
1322 fprintf (file, "# Parameter names\n");
1327 fprintf (file, "# Parameter names are not provided\n");
1328 fprintf (file, "0\n");
1331 FOR_EACH_VEC_ELT (tree, SESE_PARAMS (SCOP_REGION (scop)), i, t)
1333 print_generic_expr (file, t, 0);
1334 fprintf (file, " ");
1337 fprintf (file, "\n");
1340 fprintf (file, "#)\n");
1343 /* Print to FILE the context of SCoP in OpenScop format, at some VERBOSITY
1347 openscop_print_scop_context (FILE *file, scop_p scop, int verbosity)
1353 fprintf (file, "# Context (\n");
1354 fprintf (file, "#eq");
1356 for (i = 0; i < scop_nb_params (scop); i++)
1357 fprintf (file, " p%d", (int) i);
1359 fprintf (file, " cst\n");
1362 if (SCOP_CONTEXT (scop))
1363 openscop_print_powerset_matrix (file, SCOP_CONTEXT (scop), 0, 0, 0,
1364 scop_nb_params (scop));
1366 fprintf (file, "0 %d 0 0 0 %d\n", (int) scop_nb_params (scop) + 2,
1367 (int) scop_nb_params (scop));
1370 fprintf (file, "# )\n");
1373 /* Print to FILE the context of SCoP, at some VERBOSITY level. */
1376 print_scop_context (FILE *file, scop_p scop, int verbosity)
1382 fprintf (file, "# Context (\n");
1383 fprintf (file, "#eq");
1385 for (i = 0; i < scop_nb_params (scop); i++)
1386 fprintf (file, " p%d", (int) i);
1388 fprintf (file, " cst\n");
1391 if (SCOP_CONTEXT (scop))
1392 ppl_print_powerset_matrix (file, SCOP_CONTEXT (scop));
1394 fprintf (file, "0 %d\n", (int) scop_nb_params (scop) + 2);
1397 fprintf (file, "# )\n");
1400 /* Print to FILE the SCOP, at some VERBOSITY level. */
1403 print_scop (FILE *file, scop_p scop, int verbosity)
1408 fprintf (file, "SCoP 1\n#(\n");
1409 fprintf (file, "# Language\nGimple\n");
1410 openscop_print_scop_context (file, scop, verbosity);
1411 print_scop_params (file, scop, verbosity);
1414 fprintf (file, "# Number of statements\n");
1416 fprintf (file, "%d\n",VEC_length (poly_bb_p, SCOP_BBS (scop)));
1418 FOR_EACH_VEC_ELT (poly_bb_p, SCOP_BBS (scop), i, pbb)
1419 print_pbb (file, pbb, verbosity);
1423 fprintf (file, "# original_lst (\n");
1424 print_lst (file, SCOP_ORIGINAL_SCHEDULE (scop), 0);
1425 fprintf (file, "\n#)\n");
1427 fprintf (file, "# transformed_lst (\n");
1428 print_lst (file, SCOP_TRANSFORMED_SCHEDULE (scop), 0);
1429 fprintf (file, "\n#)\n");
1432 fprintf (file, "#)\n");
1435 /* Print to FILE the input file that CLooG would expect as input, at
1436 some VERBOSITY level. */
1439 print_cloog (FILE *file, scop_p scop, int verbosity)
1444 fprintf (file, "# SCoP (generated by GCC/Graphite\n");
1446 fprintf (file, "# CLooG output language\n");
1447 fprintf (file, "c\n");
1449 print_scop_context (file, scop, verbosity);
1450 print_scop_params (file, scop, verbosity);
1453 fprintf (file, "# Number of statements\n");
1455 fprintf (file, "%d\n", VEC_length (poly_bb_p, SCOP_BBS (scop)));
1457 FOR_EACH_VEC_ELT (poly_bb_p, SCOP_BBS (scop), i, pbb)
1460 fprintf (file, "# pbb_%d (\n", pbb_index (pbb));
1462 print_pbb_domain (file, pbb, verbosity);
1463 fprintf (file, "0 0 0");
1466 fprintf (file, "# For future CLooG options.\n");
1468 fprintf (file, "\n");
1471 fprintf (file, "#)\n");
1474 fprintf (file, "0");
1476 fprintf (file, "# Don't set the iterator names.\n");
1478 fprintf (file, "\n");
1481 fprintf (file, "# Number of scattering functions\n");
1483 fprintf (file, "%d\n", VEC_length (poly_bb_p, SCOP_BBS (scop)));
1484 unify_scattering_dimensions (scop);
1486 FOR_EACH_VEC_ELT (poly_bb_p, SCOP_BBS (scop), i, pbb)
1488 if (!PBB_TRANSFORMED (pbb)
1489 || !(PBB_TRANSFORMED_SCATTERING (pbb)
1490 || PBB_ORIGINAL_SCATTERING (pbb)))
1494 fprintf (file, "# pbb_%d (\n", pbb_index (pbb));
1496 print_scattering_function_1 (file, pbb, verbosity);
1499 fprintf (file, "#)\n");
1502 fprintf (file, "0");
1504 fprintf (file, "# Don't set the scattering dimension names.\n");
1506 fprintf (file, "\n");
1508 fprintf (file, "#)\n");
1511 /* Print to STDERR the domain of PBB, at some VERBOSITY level. */
1514 debug_pbb_domain (poly_bb_p pbb, int verbosity)
1516 print_pbb_domain (stderr, pbb, verbosity);
1519 /* Print to FILE the domain and scattering function of PBB, at some
1523 debug_pbb (poly_bb_p pbb, int verbosity)
1525 print_pbb (stderr, pbb, verbosity);
1528 /* Print to STDERR the context of SCOP, at some VERBOSITY level. */
1531 debug_scop_context (scop_p scop, int verbosity)
1533 print_scop_context (stderr, scop, verbosity);
1536 /* Print to STDERR the SCOP, at some VERBOSITY level. */
1539 debug_scop (scop_p scop, int verbosity)
1541 print_scop (stderr, scop, verbosity);
1544 /* Print to STDERR the SCOP under CLooG format, at some VERBOSITY
1548 debug_cloog (scop_p scop, int verbosity)
1550 print_cloog (stderr, scop, verbosity);
1553 /* Print to STDERR the parameters of SCOP, at some VERBOSITY
1557 debug_scop_params (scop_p scop, int verbosity)
1559 print_scop_params (stderr, scop, verbosity);
1563 /* The dimension in the transformed scattering polyhedron of PBB
1564 containing the scattering iterator for the loop at depth LOOP_DEPTH. */
1567 psct_scattering_dim_for_loop_depth (poly_bb_p pbb, graphite_dim_t loop_depth)
1569 ppl_const_Constraint_System_t pcs;
1570 ppl_Constraint_System_const_iterator_t cit, cend;
1571 ppl_const_Constraint_t cstr;
1572 ppl_Polyhedron_t ph = PBB_TRANSFORMED_SCATTERING (pbb);
1573 ppl_dimension_type iter = psct_iterator_dim (pbb, loop_depth);
1574 ppl_Linear_Expression_t expr;
1575 ppl_Coefficient_t coef;
1580 ppl_new_Coefficient (&coef);
1581 ppl_Polyhedron_get_constraints (ph, &pcs);
1582 ppl_new_Constraint_System_const_iterator (&cit);
1583 ppl_new_Constraint_System_const_iterator (&cend);
1585 for (ppl_Constraint_System_begin (pcs, cit),
1586 ppl_Constraint_System_end (pcs, cend);
1587 !ppl_Constraint_System_const_iterator_equal_test (cit, cend);
1588 ppl_Constraint_System_const_iterator_increment (cit))
1590 ppl_Constraint_System_const_iterator_dereference (cit, &cstr);
1591 ppl_new_Linear_Expression_from_Constraint (&expr, cstr);
1592 ppl_Linear_Expression_coefficient (expr, iter, coef);
1593 ppl_Coefficient_to_mpz_t (coef, val);
1595 if (mpz_sgn (val) == 0)
1597 ppl_delete_Linear_Expression (expr);
1601 for (i = 0; i < pbb_nb_scattering_transform (pbb); i++)
1603 ppl_dimension_type scatter = psct_scattering_dim (pbb, i);
1605 ppl_Linear_Expression_coefficient (expr, scatter, coef);
1606 ppl_Coefficient_to_mpz_t (coef, val);
1608 if (mpz_sgn (val) != 0)
1611 ppl_delete_Linear_Expression (expr);
1612 ppl_delete_Coefficient (coef);
1613 ppl_delete_Constraint_System_const_iterator (cit);
1614 ppl_delete_Constraint_System_const_iterator (cend);
1624 /* Returns the number of iterations NITER of the loop around PBB at
1625 depth LOOP_DEPTH. */
1628 pbb_number_of_iterations (poly_bb_p pbb,
1629 graphite_dim_t loop_depth,
1632 ppl_Linear_Expression_t le;
1633 ppl_dimension_type dim;
1635 ppl_Pointset_Powerset_C_Polyhedron_space_dimension (PBB_DOMAIN (pbb), &dim);
1636 ppl_new_Linear_Expression_with_dimension (&le, dim);
1637 ppl_set_coef (le, pbb_iterator_dim (pbb, loop_depth), 1);
1638 mpz_set_si (niter, -1);
1639 ppl_max_for_le_pointset (PBB_DOMAIN (pbb), le, niter);
1640 ppl_delete_Linear_Expression (le);
1643 /* Returns the number of iterations NITER of the loop around PBB at
1644 time(scattering) dimension TIME_DEPTH. */
1647 pbb_number_of_iterations_at_time (poly_bb_p pbb,
1648 graphite_dim_t time_depth,
1651 ppl_Pointset_Powerset_C_Polyhedron_t ext_domain, sctr;
1652 ppl_Linear_Expression_t le;
1653 ppl_dimension_type dim;
1655 /* Takes together domain and scattering polyhedrons, and composes
1656 them into the bigger polyhedron that has the following format:
1658 t0..t_{n-1} | l0..l_{nlcl-1} | i0..i_{niter-1} | g0..g_{nparm-1}
1661 | t0..t_{n-1} are time dimensions (scattering dimensions)
1662 | l0..l_{nclc-1} are local variables in scattering function
1663 | i0..i_{niter-1} are original iteration variables
1664 | g0..g_{nparam-1} are global parameters. */
1666 ppl_new_Pointset_Powerset_C_Polyhedron_from_C_Polyhedron (&sctr,
1667 PBB_TRANSFORMED_SCATTERING (pbb));
1669 /* Extend the iteration domain with the scattering dimensions:
1670 0..0 | 0..0 | i0..i_{niter-1} | g0..g_{nparm-1}. */
1671 ppl_new_Pointset_Powerset_C_Polyhedron_from_Pointset_Powerset_C_Polyhedron
1672 (&ext_domain, PBB_DOMAIN (pbb));
1673 ppl_insert_dimensions_pointset (ext_domain, 0,
1674 pbb_nb_scattering_transform (pbb)
1675 + pbb_nb_local_vars (pbb));
1677 /* Add to sctr the extended domain. */
1678 ppl_Pointset_Powerset_C_Polyhedron_intersection_assign (sctr, ext_domain);
1680 /* Extract the number of iterations. */
1681 ppl_Pointset_Powerset_C_Polyhedron_space_dimension (sctr, &dim);
1682 ppl_new_Linear_Expression_with_dimension (&le, dim);
1683 ppl_set_coef (le, time_depth, 1);
1684 mpz_set_si (niter, -1);
1685 ppl_max_for_le_pointset (sctr, le, niter);
1687 ppl_delete_Linear_Expression (le);
1688 ppl_delete_Pointset_Powerset_C_Polyhedron (sctr);
1689 ppl_delete_Pointset_Powerset_C_Polyhedron (ext_domain);
1692 /* Translates LOOP to LST. */
1695 loop_to_lst (loop_p loop, VEC (poly_bb_p, heap) *bbs, int *i)
1698 VEC (lst_p, heap) *seq = VEC_alloc (lst_p, heap, 5);
1700 for (; VEC_iterate (poly_bb_p, bbs, *i, pbb); (*i)++)
1703 basic_block bb = GBB_BB (PBB_BLACK_BOX (pbb));
1705 if (bb->loop_father == loop)
1706 stmt = new_lst_stmt (pbb);
1707 else if (flow_bb_inside_loop_p (loop, bb))
1709 loop_p next = loop->inner;
1711 while (next && !flow_bb_inside_loop_p (next, bb))
1714 stmt = loop_to_lst (next, bbs, i);
1719 return new_lst_loop (seq);
1722 VEC_safe_push (lst_p, heap, seq, stmt);
1725 return new_lst_loop (seq);
1728 /* Reads the original scattering of the SCOP and returns an LST
1732 scop_to_lst (scop_p scop)
1735 int i, n = VEC_length (poly_bb_p, SCOP_BBS (scop));
1736 VEC (lst_p, heap) *seq = VEC_alloc (lst_p, heap, 5);
1737 sese region = SCOP_REGION (scop);
1739 for (i = 0; i < n; i++)
1741 poly_bb_p pbb = VEC_index (poly_bb_p, SCOP_BBS (scop), i);
1742 loop_p loop = outermost_loop_in_sese (region, GBB_BB (PBB_BLACK_BOX (pbb)));
1744 if (loop_in_sese_p (loop, region))
1745 res = loop_to_lst (loop, SCOP_BBS (scop), &i);
1747 res = new_lst_stmt (pbb);
1749 VEC_safe_push (lst_p, heap, seq, res);
1752 res = new_lst_loop (seq);
1753 SCOP_ORIGINAL_SCHEDULE (scop) = res;
1754 SCOP_TRANSFORMED_SCHEDULE (scop) = copy_lst (res);
1757 /* Print to FILE on a new line COLUMN white spaces. */
1760 lst_indent_to (FILE *file, int column)
1765 fprintf (file, "\n#");
1767 for (i = 0; i < column; i++)
1768 fprintf (file, " ");
1771 /* Print LST to FILE with INDENT spaces of indentation. */
1774 print_lst (FILE *file, lst_p lst, int indent)
1779 lst_indent_to (file, indent);
1781 if (LST_LOOP_P (lst))
1786 if (LST_LOOP_FATHER (lst))
1787 fprintf (file, "%d (loop", lst_dewey_number (lst));
1789 fprintf (file, "#(root");
1791 FOR_EACH_VEC_ELT (lst_p, LST_SEQ (lst), i, l)
1792 print_lst (file, l, indent + 2);
1794 fprintf (file, ")");
1797 fprintf (file, "%d stmt_%d", lst_dewey_number (lst), pbb_index (LST_PBB (lst)));
1800 /* Print LST to STDERR. */
1803 debug_lst (lst_p lst)
1805 print_lst (stderr, lst, 0);
1808 /* Pretty print to FILE the loop statement tree LST in DOT format. */
1811 dot_lst_1 (FILE *file, lst_p lst)
1816 if (LST_LOOP_P (lst))
1821 if (!LST_LOOP_FATHER (lst))
1822 fprintf (file, "L -> L_%d_%d\n",
1824 lst_dewey_number (lst));
1826 fprintf (file, "L_%d_%d -> L_%d_%d\n",
1827 lst_depth (LST_LOOP_FATHER (lst)),
1828 lst_dewey_number (LST_LOOP_FATHER (lst)),
1830 lst_dewey_number (lst));
1832 FOR_EACH_VEC_ELT (lst_p, LST_SEQ (lst), i, l)
1833 dot_lst_1 (file, l);
1837 fprintf (file, "L_%d_%d -> S_%d\n",
1838 lst_depth (LST_LOOP_FATHER (lst)),
1839 lst_dewey_number (LST_LOOP_FATHER (lst)),
1840 pbb_index (LST_PBB (lst)));
1844 /* Display the LST using dotty. */
1849 /* When debugging, enable the following code. This cannot be used
1850 in production compilers because it calls "system". */
1852 FILE *stream = fopen ("/tmp/lst.dot", "w");
1853 gcc_assert (stream);
1855 fputs ("digraph all {\n", stream);
1856 dot_lst_1 (stream, lst);
1857 fputs ("}\n\n", stream);
1860 system ("dotty /tmp/lst.dot &");
1862 fputs ("digraph all {\n", stderr);
1863 dot_lst_1 (stderr, lst);
1864 fputs ("}\n\n", stderr);