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;
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 /* Apply graphite transformations to all the basic blocks of SCOP. */
689 apply_poly_transforms (scop_p scop)
691 bool transform_done = false;
693 /* This feature is only enabled in the Graphite branch. */
696 transform_done |= graphite_read_scop_file (dump_file, scop);
697 gcc_assert (graphite_legal_transform (scop));
700 /* Generate code even if we did not apply any real transformation.
701 This also allows to check the performance for the identity
702 transformation: GIMPLE -> GRAPHITE -> GIMPLE
703 Keep in mind that CLooG optimizes in control, so the loop structure
704 may change, even if we only use -fgraphite-identity. */
705 if (flag_graphite_identity)
706 transform_done = true;
708 if (flag_loop_parallelize_all)
709 transform_done = true;
712 transform_done |= scop_do_block (scop);
715 if (flag_loop_strip_mine)
716 transform_done |= scop_do_strip_mine (scop);
718 if (flag_loop_interchange)
719 transform_done |= scop_do_interchange (scop);
722 /* This feature is only enabled in the Graphite branch. */
724 print_scop (dump_file, scop, 1);
726 return transform_done;
729 /* Returns true when it PDR1 is a duplicate of PDR2: same PBB, and
730 their ACCESSES, TYPE, and NB_SUBSCRIPTS are the same. */
733 can_collapse_pdrs (poly_dr_p pdr1, poly_dr_p pdr2)
736 ppl_Pointset_Powerset_C_Polyhedron_t af1, af2, diff;
738 if (PDR_PBB (pdr1) != PDR_PBB (pdr2)
739 || PDR_NB_SUBSCRIPTS (pdr1) != PDR_NB_SUBSCRIPTS (pdr2)
740 || PDR_TYPE (pdr1) != PDR_TYPE (pdr2))
743 af1 = PDR_ACCESSES (pdr1);
744 af2 = PDR_ACCESSES (pdr2);
745 ppl_new_Pointset_Powerset_C_Polyhedron_from_Pointset_Powerset_C_Polyhedron
747 ppl_Pointset_Powerset_C_Polyhedron_difference_assign (diff, af2);
749 res = ppl_Pointset_Powerset_C_Polyhedron_is_empty (diff);
750 ppl_delete_Pointset_Powerset_C_Polyhedron (diff);
754 /* Removes duplicated data references in PBB. */
757 pbb_remove_duplicate_pdrs (poly_bb_p pbb)
760 poly_dr_p pdr1, pdr2;
761 unsigned n = VEC_length (poly_dr_p, PBB_DRS (pbb));
762 VEC (poly_dr_p, heap) *collapsed = VEC_alloc (poly_dr_p, heap, n);
764 FOR_EACH_VEC_ELT (poly_dr_p, PBB_DRS (pbb), i, pdr1)
765 FOR_EACH_VEC_ELT (poly_dr_p, collapsed, j, pdr2)
766 if (!can_collapse_pdrs (pdr1, pdr2))
767 VEC_quick_push (poly_dr_p, collapsed, pdr1);
769 VEC_free (poly_dr_p, heap, collapsed);
770 PBB_PDR_DUPLICATES_REMOVED (pbb) = true;
773 /* Create a new polyhedral data reference and add it to PBB. It is
774 defined by its ACCESSES, its TYPE, and the number of subscripts
778 new_poly_dr (poly_bb_p pbb, int dr_base_object_set,
779 ppl_Pointset_Powerset_C_Polyhedron_t accesses,
780 enum poly_dr_type type, void *cdr, graphite_dim_t nb_subscripts)
783 poly_dr_p pdr = XNEW (struct poly_dr);
786 PDR_BASE_OBJECT_SET (pdr) = dr_base_object_set;
787 PDR_NB_REFS (pdr) = 1;
789 PDR_ACCESSES (pdr) = accesses;
790 PDR_TYPE (pdr) = type;
792 PDR_NB_SUBSCRIPTS (pdr) = nb_subscripts;
793 VEC_safe_push (poly_dr_p, heap, PBB_DRS (pbb), pdr);
796 /* Free polyhedral data reference PDR. */
799 free_poly_dr (poly_dr_p pdr)
801 ppl_delete_Pointset_Powerset_C_Polyhedron (PDR_ACCESSES (pdr));
805 /* Create a new polyhedral black box. */
808 new_poly_bb (scop_p scop, void *black_box, bool reduction)
810 poly_bb_p pbb = XNEW (struct poly_bb);
812 PBB_DOMAIN (pbb) = NULL;
813 PBB_SCOP (pbb) = scop;
814 pbb_set_black_box (pbb, black_box);
815 PBB_TRANSFORMED (pbb) = NULL;
816 PBB_SAVED (pbb) = NULL;
817 PBB_ORIGINAL (pbb) = NULL;
818 PBB_DRS (pbb) = VEC_alloc (poly_dr_p, heap, 3);
819 PBB_IS_REDUCTION (pbb) = reduction;
820 PBB_PDR_DUPLICATES_REMOVED (pbb) = false;
821 VEC_safe_push (poly_bb_p, heap, SCOP_BBS (scop), pbb);
824 /* Free polyhedral black box. */
827 free_poly_bb (poly_bb_p pbb)
832 ppl_delete_Pointset_Powerset_C_Polyhedron (PBB_DOMAIN (pbb));
834 if (PBB_TRANSFORMED (pbb))
835 poly_scattering_free (PBB_TRANSFORMED (pbb));
838 poly_scattering_free (PBB_SAVED (pbb));
840 if (PBB_ORIGINAL (pbb))
841 poly_scattering_free (PBB_ORIGINAL (pbb));
844 FOR_EACH_VEC_ELT (poly_dr_p, PBB_DRS (pbb), i, pdr)
847 VEC_free (poly_dr_p, heap, PBB_DRS (pbb));
852 print_pdr_access_layout (FILE *file, poly_bb_p pbb, poly_dr_p pdr)
856 fprintf (file, "# eq");
858 fprintf (file, " alias");
860 for (i = 0; i < PDR_NB_SUBSCRIPTS (pdr); i++)
861 fprintf (file, " sub%d", (int) i);
863 for (i = 0; i < pbb_dim_iter_domain (pbb); i++)
864 fprintf (file, " i%d", (int) i);
866 for (i = 0; i < pbb_nb_params (pbb); i++)
867 fprintf (file, " p%d", (int) i);
869 fprintf (file, " cst\n");
872 /* Prints to FILE the polyhedral data reference PDR, at some VERBOSITY
876 print_pdr (FILE *file, poly_dr_p pdr, int verbosity)
882 fprintf (file, "# pdr_%d (", PDR_ID (pdr));
884 switch (PDR_TYPE (pdr))
887 fprintf (file, "read \n");
891 fprintf (file, "write \n");
895 fprintf (file, "may_write \n");
902 dump_data_reference (file, (data_reference_p) PDR_CDR (pdr));
907 fprintf (file, "# data accesses (\n");
908 print_pdr_access_layout (file, PDR_PBB (pdr), pdr);
911 alias_set_dim = pdr_alias_set_dim (pdr) + 1;
913 openscop_print_pdr_powerset (file,
915 PDR_NB_SUBSCRIPTS (pdr),
917 pbb_nb_params (PDR_PBB (pdr)));
920 fprintf (file, "#)\n");
923 fprintf (file, "#)\n");
926 /* Prints to STDERR the polyhedral data reference PDR, at some
930 debug_pdr (poly_dr_p pdr, int verbosity)
932 print_pdr (stderr, pdr, verbosity);
935 /* Creates a new SCOP containing REGION. */
938 new_scop (void *region)
940 scop_p scop = XNEW (struct scop);
942 SCOP_CONTEXT (scop) = NULL;
943 scop_set_region (scop, region);
944 SCOP_BBS (scop) = VEC_alloc (poly_bb_p, heap, 3);
945 SCOP_ORIGINAL_PDDRS (scop) = htab_create (10, hash_poly_ddr_p,
946 eq_poly_ddr_p, free_poly_ddr);
947 SCOP_ORIGINAL_SCHEDULE (scop) = NULL;
948 SCOP_TRANSFORMED_SCHEDULE (scop) = NULL;
949 SCOP_SAVED_SCHEDULE (scop) = NULL;
950 POLY_SCOP_P (scop) = false;
958 free_scop (scop_p scop)
963 FOR_EACH_VEC_ELT (poly_bb_p, SCOP_BBS (scop), i, pbb)
966 VEC_free (poly_bb_p, heap, SCOP_BBS (scop));
968 if (SCOP_CONTEXT (scop))
969 ppl_delete_Pointset_Powerset_C_Polyhedron (SCOP_CONTEXT (scop));
971 htab_delete (SCOP_ORIGINAL_PDDRS (scop));
972 free_lst (SCOP_ORIGINAL_SCHEDULE (scop));
973 free_lst (SCOP_TRANSFORMED_SCHEDULE (scop));
974 free_lst (SCOP_SAVED_SCHEDULE (scop));
978 /* Print to FILE the domain of PBB in OpenScop format, at some VERBOSITY
982 openscop_print_pbb_domain (FILE *file, poly_bb_p pbb, int verbosity)
985 gimple_bb_p gbb = PBB_BLACK_BOX (pbb);
987 if (!PBB_DOMAIN (pbb))
992 fprintf (file, "\n# Iteration domain of bb_%d (\n", GBB_BB (gbb)->index);
993 fprintf (file, "#eq");
995 for (i = 0; i < pbb_dim_iter_domain (pbb); i++)
996 fprintf (file, " i%d", (int) i);
998 for (i = 0; i < pbb_nb_params (pbb); i++)
999 fprintf (file, " p%d", (int) i);
1001 fprintf (file, " cst\n");
1004 if (PBB_DOMAIN (pbb))
1005 openscop_print_powerset_matrix (file, PBB_DOMAIN (pbb),
1006 pbb_dim_iter_domain (pbb),
1009 pbb_nb_params (pbb));
1011 fprintf (file, "0\n");
1014 fprintf (file, "#)\n");
1017 /* Print to FILE the domain of PBB, at some VERBOSITY level. */
1020 print_pbb_domain (FILE *file, poly_bb_p pbb, int verbosity)
1023 gimple_bb_p gbb = PBB_BLACK_BOX (pbb);
1025 if (!PBB_DOMAIN (pbb))
1030 fprintf (file, "# Iteration domain of bb_%d (\n", GBB_BB (gbb)->index);
1031 fprintf (file, "# eq");
1033 for (i = 0; i < pbb_dim_iter_domain (pbb); i++)
1034 fprintf (file, " i%d", (int) i);
1036 for (i = 0; i < pbb_nb_params (pbb); i++)
1037 fprintf (file, " p%d", (int) i);
1039 fprintf (file, " cst\n");
1042 if (PBB_DOMAIN (pbb))
1043 ppl_print_powerset_matrix (file, PBB_DOMAIN (pbb));
1045 fprintf (file, "0\n");
1048 fprintf (file, "#)\n");
1051 /* Dump the cases of a graphite basic block GBB on FILE. */
1054 dump_gbb_cases (FILE *file, gimple_bb_p gbb)
1058 VEC (gimple, heap) *cases;
1063 cases = GBB_CONDITION_CASES (gbb);
1064 if (VEC_empty (gimple, cases))
1067 fprintf (file, "# cases bb_%d (\n", GBB_BB (gbb)->index);
1069 FOR_EACH_VEC_ELT (gimple, cases, i, stmt)
1071 fprintf (file, "# ");
1072 print_gimple_stmt (file, stmt, 0, 0);
1075 fprintf (file, "#)\n");
1078 /* Dump conditions of a graphite basic block GBB on FILE. */
1081 dump_gbb_conditions (FILE *file, gimple_bb_p gbb)
1085 VEC (gimple, heap) *conditions;
1090 conditions = GBB_CONDITIONS (gbb);
1091 if (VEC_empty (gimple, conditions))
1094 fprintf (file, "# conditions bb_%d (\n", GBB_BB (gbb)->index);
1096 FOR_EACH_VEC_ELT (gimple, conditions, i, stmt)
1098 fprintf (file, "# ");
1099 print_gimple_stmt (file, stmt, 0, 0);
1102 fprintf (file, "#)\n");
1105 /* Print to FILE all the data references of PBB, at some VERBOSITY
1109 print_pdrs (FILE *file, poly_bb_p pbb, int verbosity)
1116 if (VEC_length (poly_dr_p, PBB_DRS (pbb)) == 0)
1119 fprintf (file, "# Access informations are not provided\n");\
1120 fprintf (file, "0\n");
1125 fprintf (file, "# Data references (\n");
1128 fprintf (file, "# Access informations are provided\n");
1129 fprintf (file, "1\n");
1131 FOR_EACH_VEC_ELT (poly_dr_p, PBB_DRS (pbb), i, pdr)
1132 if (PDR_TYPE (pdr) == PDR_READ)
1138 fprintf (file, "# Read data references (\n");
1141 fprintf (file, "# Read access informations\n");
1142 fprintf (file, "%d\n", nb_reads);
1144 FOR_EACH_VEC_ELT (poly_dr_p, PBB_DRS (pbb), i, pdr)
1145 if (PDR_TYPE (pdr) == PDR_READ)
1146 print_pdr (file, pdr, verbosity);
1149 fprintf (file, "#)\n");
1152 fprintf (file, "# Write data references (\n");
1155 fprintf (file, "# Write access informations\n");
1156 fprintf (file, "%d\n", nb_writes);
1158 FOR_EACH_VEC_ELT (poly_dr_p, PBB_DRS (pbb), i, pdr)
1159 if (PDR_TYPE (pdr) != PDR_READ)
1160 print_pdr (file, pdr, verbosity);
1163 fprintf (file, "#)\n");
1166 fprintf (file, "#)\n");
1169 /* Print to STDERR all the data references of PBB. */
1172 debug_pdrs (poly_bb_p pbb, int verbosity)
1174 print_pdrs (stderr, pbb, verbosity);
1177 /* Print to FILE the body of PBB, at some VERBOSITY level.
1178 If statement_body_provided is false statement body is not printed. */
1181 print_pbb_body (FILE *file, poly_bb_p pbb, int verbosity,
1182 bool statement_body_provided)
1185 fprintf (file, "# Body (\n");
1187 if (!statement_body_provided)
1190 fprintf (file, "# Statement body is not provided\n");
1192 fprintf (file, "0\n");
1197 fprintf (file, "# Statement body is provided\n");
1198 fprintf (file, "1\n");
1201 fprintf (file, "# Original iterator names\n# Iterator names are not provided yet.\n");
1204 fprintf (file, "# Statement body\n");
1206 fprintf (file, "{\n");
1207 dump_bb (pbb_bb (pbb), file, 0);
1208 fprintf (file, "}\n");
1211 fprintf (file, "#)\n");
1214 /* Print to FILE the domain and scattering function of PBB, at some
1218 print_pbb (FILE *file, poly_bb_p pbb, int verbosity)
1222 fprintf (file, "# pbb_%d (\n", pbb_index (pbb));
1223 dump_gbb_conditions (file, PBB_BLACK_BOX (pbb));
1224 dump_gbb_cases (file, PBB_BLACK_BOX (pbb));
1227 openscop_print_pbb_domain (file, pbb, verbosity);
1228 print_scattering_function (file, pbb, verbosity);
1229 print_pdrs (file, pbb, verbosity);
1230 print_pbb_body (file, pbb, verbosity, false);
1233 fprintf (file, "#)\n");
1236 /* Print to FILE the parameters of SCOP, at some VERBOSITY level. */
1239 print_scop_params (FILE *file, scop_p scop, int verbosity)
1245 fprintf (file, "# parameters (\n");
1247 if (VEC_length (tree, SESE_PARAMS (SCOP_REGION (scop))))
1250 fprintf (file, "# Parameter names are provided\n");
1252 fprintf (file, "1\n");
1255 fprintf (file, "# Parameter names\n");
1260 fprintf (file, "# Parameter names are not provided\n");
1261 fprintf (file, "0\n");
1264 FOR_EACH_VEC_ELT (tree, SESE_PARAMS (SCOP_REGION (scop)), i, t)
1266 print_generic_expr (file, t, 0);
1267 fprintf (file, " ");
1270 fprintf (file, "\n");
1273 fprintf (file, "#)\n");
1276 /* Print to FILE the context of SCoP in OpenScop format, at some VERBOSITY
1280 openscop_print_scop_context (FILE *file, scop_p scop, int verbosity)
1286 fprintf (file, "# Context (\n");
1287 fprintf (file, "#eq");
1289 for (i = 0; i < scop_nb_params (scop); i++)
1290 fprintf (file, " p%d", (int) i);
1292 fprintf (file, " cst\n");
1295 if (SCOP_CONTEXT (scop))
1296 openscop_print_powerset_matrix (file, SCOP_CONTEXT (scop), 0, 0, 0,
1297 scop_nb_params (scop));
1299 fprintf (file, "0 %d 0 0 0 %d\n", (int) scop_nb_params (scop) + 2,
1300 (int) scop_nb_params (scop));
1303 fprintf (file, "# )\n");
1306 /* Print to FILE the context of SCoP, at some VERBOSITY level. */
1309 print_scop_context (FILE *file, scop_p scop, int verbosity)
1315 fprintf (file, "# Context (\n");
1316 fprintf (file, "#eq");
1318 for (i = 0; i < scop_nb_params (scop); i++)
1319 fprintf (file, " p%d", (int) i);
1321 fprintf (file, " cst\n");
1324 if (SCOP_CONTEXT (scop))
1325 ppl_print_powerset_matrix (file, SCOP_CONTEXT (scop));
1327 fprintf (file, "0 %d\n", (int) scop_nb_params (scop) + 2);
1330 fprintf (file, "# )\n");
1333 /* Print to FILE the SCOP header: context, parameters, and statements
1337 print_scop_header (FILE *file, scop_p scop, int verbosity)
1339 fprintf (file, "SCoP 1\n#(\n");
1340 fprintf (file, "# Language\nGimple\n");
1341 openscop_print_scop_context (file, scop, verbosity);
1342 print_scop_params (file, scop, verbosity);
1345 fprintf (file, "# Number of statements\n");
1347 fprintf (file, "%d\n",VEC_length (poly_bb_p, SCOP_BBS (scop)));
1350 /* Print to FILE the SCOP, at some VERBOSITY level. */
1353 print_scop (FILE *file, scop_p scop, int verbosity)
1358 print_scop_header (file, scop, verbosity);
1360 FOR_EACH_VEC_ELT (poly_bb_p, SCOP_BBS (scop), i, pbb)
1361 print_pbb (file, pbb, verbosity);
1365 fprintf (file, "# original_lst (\n");
1366 print_lst (file, SCOP_ORIGINAL_SCHEDULE (scop), 0);
1367 fprintf (file, "\n#)\n");
1369 fprintf (file, "# transformed_lst (\n");
1370 print_lst (file, SCOP_TRANSFORMED_SCHEDULE (scop), 0);
1371 fprintf (file, "\n#)\n");
1374 fprintf (file, "#)\n");
1377 /* Print to FILE the input file that CLooG would expect as input, at
1378 some VERBOSITY level. */
1381 print_cloog (FILE *file, scop_p scop, int verbosity)
1386 fprintf (file, "# SCoP (generated by GCC/Graphite\n");
1388 fprintf (file, "# CLooG output language\n");
1389 fprintf (file, "c\n");
1391 print_scop_context (file, scop, verbosity);
1392 print_scop_params (file, scop, verbosity);
1395 fprintf (file, "# Number of statements\n");
1397 fprintf (file, "%d\n", VEC_length (poly_bb_p, SCOP_BBS (scop)));
1399 FOR_EACH_VEC_ELT (poly_bb_p, SCOP_BBS (scop), i, pbb)
1402 fprintf (file, "# pbb_%d (\n", pbb_index (pbb));
1404 print_pbb_domain (file, pbb, verbosity);
1405 fprintf (file, "0 0 0");
1408 fprintf (file, "# For future CLooG options.\n");
1410 fprintf (file, "\n");
1413 fprintf (file, "#)\n");
1416 fprintf (file, "0");
1418 fprintf (file, "# Don't set the iterator names.\n");
1420 fprintf (file, "\n");
1423 fprintf (file, "# Number of scattering functions\n");
1425 fprintf (file, "%d\n", VEC_length (poly_bb_p, SCOP_BBS (scop)));
1426 unify_scattering_dimensions (scop);
1428 FOR_EACH_VEC_ELT (poly_bb_p, SCOP_BBS (scop), i, pbb)
1430 if (!PBB_TRANSFORMED (pbb)
1431 || !(PBB_TRANSFORMED_SCATTERING (pbb)
1432 || PBB_ORIGINAL_SCATTERING (pbb)))
1436 fprintf (file, "# pbb_%d (\n", pbb_index (pbb));
1438 print_scattering_function_1 (file, pbb, verbosity);
1441 fprintf (file, "#)\n");
1444 fprintf (file, "0");
1446 fprintf (file, "# Don't set the scattering dimension names.\n");
1448 fprintf (file, "\n");
1450 fprintf (file, "#)\n");
1453 /* Print to STDERR the domain of PBB, at some VERBOSITY level. */
1456 debug_pbb_domain (poly_bb_p pbb, int verbosity)
1458 print_pbb_domain (stderr, pbb, verbosity);
1461 /* Print to FILE the domain and scattering function of PBB, at some
1465 debug_pbb (poly_bb_p pbb, int verbosity)
1467 print_pbb (stderr, pbb, verbosity);
1470 /* Print to STDERR the context of SCOP, at some VERBOSITY level. */
1473 debug_scop_context (scop_p scop, int verbosity)
1475 print_scop_context (stderr, scop, verbosity);
1478 /* Print to STDERR the SCOP, at some VERBOSITY level. */
1481 debug_scop (scop_p scop, int verbosity)
1483 print_scop (stderr, scop, verbosity);
1486 /* Print to STDERR the SCOP under CLooG format, at some VERBOSITY
1490 debug_cloog (scop_p scop, int verbosity)
1492 print_cloog (stderr, scop, verbosity);
1495 /* Print to STDERR the parameters of SCOP, at some VERBOSITY
1499 debug_scop_params (scop_p scop, int verbosity)
1501 print_scop_params (stderr, scop, verbosity);
1505 /* The dimension in the transformed scattering polyhedron of PBB
1506 containing the scattering iterator for the loop at depth LOOP_DEPTH. */
1509 psct_scattering_dim_for_loop_depth (poly_bb_p pbb, graphite_dim_t loop_depth)
1511 ppl_const_Constraint_System_t pcs;
1512 ppl_Constraint_System_const_iterator_t cit, cend;
1513 ppl_const_Constraint_t cstr;
1514 ppl_Polyhedron_t ph = PBB_TRANSFORMED_SCATTERING (pbb);
1515 ppl_dimension_type iter = psct_iterator_dim (pbb, loop_depth);
1516 ppl_Linear_Expression_t expr;
1517 ppl_Coefficient_t coef;
1522 ppl_new_Coefficient (&coef);
1523 ppl_Polyhedron_get_constraints (ph, &pcs);
1524 ppl_new_Constraint_System_const_iterator (&cit);
1525 ppl_new_Constraint_System_const_iterator (&cend);
1527 for (ppl_Constraint_System_begin (pcs, cit),
1528 ppl_Constraint_System_end (pcs, cend);
1529 !ppl_Constraint_System_const_iterator_equal_test (cit, cend);
1530 ppl_Constraint_System_const_iterator_increment (cit))
1532 ppl_Constraint_System_const_iterator_dereference (cit, &cstr);
1533 ppl_new_Linear_Expression_from_Constraint (&expr, cstr);
1534 ppl_Linear_Expression_coefficient (expr, iter, coef);
1535 ppl_Coefficient_to_mpz_t (coef, val);
1537 if (mpz_sgn (val) == 0)
1539 ppl_delete_Linear_Expression (expr);
1543 for (i = 0; i < pbb_nb_scattering_transform (pbb); i++)
1545 ppl_dimension_type scatter = psct_scattering_dim (pbb, i);
1547 ppl_Linear_Expression_coefficient (expr, scatter, coef);
1548 ppl_Coefficient_to_mpz_t (coef, val);
1550 if (mpz_sgn (val) != 0)
1553 ppl_delete_Linear_Expression (expr);
1554 ppl_delete_Coefficient (coef);
1555 ppl_delete_Constraint_System_const_iterator (cit);
1556 ppl_delete_Constraint_System_const_iterator (cend);
1566 /* Returns the number of iterations NITER of the loop around PBB at
1567 depth LOOP_DEPTH. */
1570 pbb_number_of_iterations (poly_bb_p pbb,
1571 graphite_dim_t loop_depth,
1574 ppl_Linear_Expression_t le;
1575 ppl_dimension_type dim;
1577 ppl_Pointset_Powerset_C_Polyhedron_space_dimension (PBB_DOMAIN (pbb), &dim);
1578 ppl_new_Linear_Expression_with_dimension (&le, dim);
1579 ppl_set_coef (le, pbb_iterator_dim (pbb, loop_depth), 1);
1580 mpz_set_si (niter, -1);
1581 ppl_max_for_le_pointset (PBB_DOMAIN (pbb), le, niter);
1582 ppl_delete_Linear_Expression (le);
1585 /* Returns the number of iterations NITER of the loop around PBB at
1586 time(scattering) dimension TIME_DEPTH. */
1589 pbb_number_of_iterations_at_time (poly_bb_p pbb,
1590 graphite_dim_t time_depth,
1593 ppl_Pointset_Powerset_C_Polyhedron_t ext_domain, sctr;
1594 ppl_Linear_Expression_t le;
1595 ppl_dimension_type dim;
1597 /* Takes together domain and scattering polyhedrons, and composes
1598 them into the bigger polyhedron that has the following format:
1600 t0..t_{n-1} | l0..l_{nlcl-1} | i0..i_{niter-1} | g0..g_{nparm-1}
1603 | t0..t_{n-1} are time dimensions (scattering dimensions)
1604 | l0..l_{nclc-1} are local variables in scattering function
1605 | i0..i_{niter-1} are original iteration variables
1606 | g0..g_{nparam-1} are global parameters. */
1608 ppl_new_Pointset_Powerset_C_Polyhedron_from_C_Polyhedron (&sctr,
1609 PBB_TRANSFORMED_SCATTERING (pbb));
1611 /* Extend the iteration domain with the scattering dimensions:
1612 0..0 | 0..0 | i0..i_{niter-1} | g0..g_{nparm-1}. */
1613 ppl_new_Pointset_Powerset_C_Polyhedron_from_Pointset_Powerset_C_Polyhedron
1614 (&ext_domain, PBB_DOMAIN (pbb));
1615 ppl_insert_dimensions_pointset (ext_domain, 0,
1616 pbb_nb_scattering_transform (pbb)
1617 + pbb_nb_local_vars (pbb));
1619 /* Add to sctr the extended domain. */
1620 ppl_Pointset_Powerset_C_Polyhedron_intersection_assign (sctr, ext_domain);
1622 /* Extract the number of iterations. */
1623 ppl_Pointset_Powerset_C_Polyhedron_space_dimension (sctr, &dim);
1624 ppl_new_Linear_Expression_with_dimension (&le, dim);
1625 ppl_set_coef (le, time_depth, 1);
1626 mpz_set_si (niter, -1);
1627 ppl_max_for_le_pointset (sctr, le, niter);
1629 ppl_delete_Linear_Expression (le);
1630 ppl_delete_Pointset_Powerset_C_Polyhedron (sctr);
1631 ppl_delete_Pointset_Powerset_C_Polyhedron (ext_domain);
1634 /* Translates LOOP to LST. */
1637 loop_to_lst (loop_p loop, VEC (poly_bb_p, heap) *bbs, int *i)
1640 VEC (lst_p, heap) *seq = VEC_alloc (lst_p, heap, 5);
1642 for (; VEC_iterate (poly_bb_p, bbs, *i, pbb); (*i)++)
1645 basic_block bb = GBB_BB (PBB_BLACK_BOX (pbb));
1647 if (bb->loop_father == loop)
1648 stmt = new_lst_stmt (pbb);
1649 else if (flow_bb_inside_loop_p (loop, bb))
1651 loop_p next = loop->inner;
1653 while (next && !flow_bb_inside_loop_p (next, bb))
1656 stmt = loop_to_lst (next, bbs, i);
1661 return new_lst_loop (seq);
1664 VEC_safe_push (lst_p, heap, seq, stmt);
1667 return new_lst_loop (seq);
1670 /* Reads the original scattering of the SCOP and returns an LST
1674 scop_to_lst (scop_p scop)
1677 int i, n = VEC_length (poly_bb_p, SCOP_BBS (scop));
1678 VEC (lst_p, heap) *seq = VEC_alloc (lst_p, heap, 5);
1679 sese region = SCOP_REGION (scop);
1681 for (i = 0; i < n; i++)
1683 poly_bb_p pbb = VEC_index (poly_bb_p, SCOP_BBS (scop), i);
1684 loop_p loop = outermost_loop_in_sese (region, GBB_BB (PBB_BLACK_BOX (pbb)));
1686 if (loop_in_sese_p (loop, region))
1687 res = loop_to_lst (loop, SCOP_BBS (scop), &i);
1689 res = new_lst_stmt (pbb);
1691 VEC_safe_push (lst_p, heap, seq, res);
1694 res = new_lst_loop (seq);
1695 SCOP_ORIGINAL_SCHEDULE (scop) = res;
1696 SCOP_TRANSFORMED_SCHEDULE (scop) = copy_lst (res);
1699 /* Print to FILE on a new line COLUMN white spaces. */
1702 lst_indent_to (FILE *file, int column)
1707 fprintf (file, "\n#");
1709 for (i = 0; i < column; i++)
1710 fprintf (file, " ");
1713 /* Print LST to FILE with INDENT spaces of indentation. */
1716 print_lst (FILE *file, lst_p lst, int indent)
1721 lst_indent_to (file, indent);
1723 if (LST_LOOP_P (lst))
1728 if (LST_LOOP_FATHER (lst))
1729 fprintf (file, "%d (loop", lst_dewey_number (lst));
1731 fprintf (file, "#(root");
1733 FOR_EACH_VEC_ELT (lst_p, LST_SEQ (lst), i, l)
1734 print_lst (file, l, indent + 2);
1736 fprintf (file, ")");
1739 fprintf (file, "%d stmt_%d", lst_dewey_number (lst), pbb_index (LST_PBB (lst)));
1742 /* Print LST to STDERR. */
1745 debug_lst (lst_p lst)
1747 print_lst (stderr, lst, 0);
1750 /* Pretty print to FILE the loop statement tree LST in DOT format. */
1753 dot_lst_1 (FILE *file, lst_p lst)
1758 if (LST_LOOP_P (lst))
1763 if (!LST_LOOP_FATHER (lst))
1764 fprintf (file, "L -> L_%d_%d\n",
1766 lst_dewey_number (lst));
1768 fprintf (file, "L_%d_%d -> L_%d_%d\n",
1769 lst_depth (LST_LOOP_FATHER (lst)),
1770 lst_dewey_number (LST_LOOP_FATHER (lst)),
1772 lst_dewey_number (lst));
1774 FOR_EACH_VEC_ELT (lst_p, LST_SEQ (lst), i, l)
1775 dot_lst_1 (file, l);
1779 fprintf (file, "L_%d_%d -> S_%d\n",
1780 lst_depth (LST_LOOP_FATHER (lst)),
1781 lst_dewey_number (LST_LOOP_FATHER (lst)),
1782 pbb_index (LST_PBB (lst)));
1786 /* Display the LST using dotty. */
1791 /* When debugging, enable the following code. This cannot be used
1792 in production compilers because it calls "system". */
1795 FILE *stream = fopen ("/tmp/lst.dot", "w");
1796 gcc_assert (stream);
1798 fputs ("digraph all {\n", stream);
1799 dot_lst_1 (stream, lst);
1800 fputs ("}\n\n", stream);
1803 x = system ("dotty /tmp/lst.dot &");
1805 fputs ("digraph all {\n", stderr);
1806 dot_lst_1 (stderr, lst);
1807 fputs ("}\n\n", stderr);