xref: /dflybsd-src/contrib/gcc-4.7/gcc/graphite-poly.c (revision 04febcfb30580676d3e95f58a16c5137ee478b32)
1*e4b17023SJohn Marino /* Graphite polyhedral representation.
2*e4b17023SJohn Marino    Copyright (C) 2009, 2010 Free Software Foundation, Inc.
3*e4b17023SJohn Marino    Contributed by Sebastian Pop <sebastian.pop@amd.com> and
4*e4b17023SJohn Marino    Tobias Grosser <grosser@fim.uni-passau.de>.
5*e4b17023SJohn Marino 
6*e4b17023SJohn Marino This file is part of GCC.
7*e4b17023SJohn Marino 
8*e4b17023SJohn Marino GCC is free software; you can redistribute it and/or modify
9*e4b17023SJohn Marino it under the terms of the GNU General Public License as published by
10*e4b17023SJohn Marino the Free Software Foundation; either version 3, or (at your option)
11*e4b17023SJohn Marino any later version.
12*e4b17023SJohn Marino 
13*e4b17023SJohn Marino GCC is distributed in the hope that it will be useful,
14*e4b17023SJohn Marino but WITHOUT ANY WARRANTY; without even the implied warranty of
15*e4b17023SJohn Marino MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16*e4b17023SJohn Marino GNU General Public License for more details.
17*e4b17023SJohn Marino 
18*e4b17023SJohn Marino You should have received a copy of the GNU General Public License
19*e4b17023SJohn Marino along with GCC; see the file COPYING3.  If not see
20*e4b17023SJohn Marino <http://www.gnu.org/licenses/>.  */
21*e4b17023SJohn Marino #include "config.h"
22*e4b17023SJohn Marino #include "system.h"
23*e4b17023SJohn Marino #include "coretypes.h"
24*e4b17023SJohn Marino #include "diagnostic-core.h"
25*e4b17023SJohn Marino #include "tree-flow.h"
26*e4b17023SJohn Marino #include "tree-dump.h"
27*e4b17023SJohn Marino #include "gimple-pretty-print.h"
28*e4b17023SJohn Marino #include "cfgloop.h"
29*e4b17023SJohn Marino #include "tree-chrec.h"
30*e4b17023SJohn Marino #include "tree-data-ref.h"
31*e4b17023SJohn Marino #include "tree-scalar-evolution.h"
32*e4b17023SJohn Marino #include "sese.h"
33*e4b17023SJohn Marino 
34*e4b17023SJohn Marino #ifdef HAVE_cloog
35*e4b17023SJohn Marino #include "ppl_c.h"
36*e4b17023SJohn Marino #include "graphite-ppl.h"
37*e4b17023SJohn Marino #include "graphite-poly.h"
38*e4b17023SJohn Marino #include "graphite-dependences.h"
39*e4b17023SJohn Marino #include "graphite-cloog-util.h"
40*e4b17023SJohn Marino 
41*e4b17023SJohn Marino #define OPENSCOP_MAX_STRING 256
42*e4b17023SJohn Marino 
43*e4b17023SJohn Marino /* Return the maximal loop depth in SCOP.  */
44*e4b17023SJohn Marino 
45*e4b17023SJohn Marino int
scop_max_loop_depth(scop_p scop)46*e4b17023SJohn Marino scop_max_loop_depth (scop_p scop)
47*e4b17023SJohn Marino {
48*e4b17023SJohn Marino   int i;
49*e4b17023SJohn Marino   poly_bb_p pbb;
50*e4b17023SJohn Marino   int max_nb_loops = 0;
51*e4b17023SJohn Marino 
52*e4b17023SJohn Marino   FOR_EACH_VEC_ELT (poly_bb_p, SCOP_BBS (scop), i, pbb)
53*e4b17023SJohn Marino     {
54*e4b17023SJohn Marino       int nb_loops = pbb_dim_iter_domain (pbb);
55*e4b17023SJohn Marino       if (max_nb_loops < nb_loops)
56*e4b17023SJohn Marino         max_nb_loops = nb_loops;
57*e4b17023SJohn Marino     }
58*e4b17023SJohn Marino 
59*e4b17023SJohn Marino   return max_nb_loops;
60*e4b17023SJohn Marino }
61*e4b17023SJohn Marino 
62*e4b17023SJohn Marino /* Extend the scattering matrix of PBB to MAX_SCATTERING scattering
63*e4b17023SJohn Marino    dimensions.  */
64*e4b17023SJohn Marino 
65*e4b17023SJohn Marino static void
extend_scattering(poly_bb_p pbb,int max_scattering)66*e4b17023SJohn Marino extend_scattering (poly_bb_p pbb, int max_scattering)
67*e4b17023SJohn Marino {
68*e4b17023SJohn Marino   ppl_dimension_type nb_old_dims, nb_new_dims;
69*e4b17023SJohn Marino   int nb_added_dims, i;
70*e4b17023SJohn Marino   ppl_Coefficient_t coef;
71*e4b17023SJohn Marino   mpz_t one;
72*e4b17023SJohn Marino 
73*e4b17023SJohn Marino   nb_added_dims = max_scattering - pbb_nb_scattering_transform (pbb);
74*e4b17023SJohn Marino   mpz_init (one);
75*e4b17023SJohn Marino   mpz_set_si (one, 1);
76*e4b17023SJohn Marino   ppl_new_Coefficient (&coef);
77*e4b17023SJohn Marino   ppl_assign_Coefficient_from_mpz_t (coef, one);
78*e4b17023SJohn Marino 
79*e4b17023SJohn Marino   gcc_assert (nb_added_dims >= 0);
80*e4b17023SJohn Marino 
81*e4b17023SJohn Marino   nb_old_dims = pbb_nb_scattering_transform (pbb) + pbb_dim_iter_domain (pbb)
82*e4b17023SJohn Marino     + scop_nb_params (PBB_SCOP (pbb));
83*e4b17023SJohn Marino   nb_new_dims = nb_old_dims + nb_added_dims;
84*e4b17023SJohn Marino 
85*e4b17023SJohn Marino   ppl_insert_dimensions (PBB_TRANSFORMED_SCATTERING (pbb),
86*e4b17023SJohn Marino 			 pbb_nb_scattering_transform (pbb), nb_added_dims);
87*e4b17023SJohn Marino   PBB_NB_SCATTERING_TRANSFORM (pbb) += nb_added_dims;
88*e4b17023SJohn Marino 
89*e4b17023SJohn Marino   /* Add identity matrix for the added dimensions.  */
90*e4b17023SJohn Marino   for (i = max_scattering - nb_added_dims; i < max_scattering; i++)
91*e4b17023SJohn Marino     {
92*e4b17023SJohn Marino       ppl_Constraint_t cstr;
93*e4b17023SJohn Marino       ppl_Linear_Expression_t expr;
94*e4b17023SJohn Marino 
95*e4b17023SJohn Marino       ppl_new_Linear_Expression_with_dimension (&expr, nb_new_dims);
96*e4b17023SJohn Marino       ppl_Linear_Expression_add_to_coefficient (expr, i, coef);
97*e4b17023SJohn Marino       ppl_new_Constraint (&cstr, expr, PPL_CONSTRAINT_TYPE_EQUAL);
98*e4b17023SJohn Marino       ppl_Polyhedron_add_constraint (PBB_TRANSFORMED_SCATTERING (pbb), cstr);
99*e4b17023SJohn Marino       ppl_delete_Constraint (cstr);
100*e4b17023SJohn Marino       ppl_delete_Linear_Expression (expr);
101*e4b17023SJohn Marino     }
102*e4b17023SJohn Marino 
103*e4b17023SJohn Marino   ppl_delete_Coefficient (coef);
104*e4b17023SJohn Marino   mpz_clear (one);
105*e4b17023SJohn Marino }
106*e4b17023SJohn Marino 
107*e4b17023SJohn Marino /* All scattering matrices in SCOP will have the same number of scattering
108*e4b17023SJohn Marino    dimensions.  */
109*e4b17023SJohn Marino 
110*e4b17023SJohn Marino int
unify_scattering_dimensions(scop_p scop)111*e4b17023SJohn Marino unify_scattering_dimensions (scop_p scop)
112*e4b17023SJohn Marino {
113*e4b17023SJohn Marino   int i;
114*e4b17023SJohn Marino   poly_bb_p pbb;
115*e4b17023SJohn Marino   graphite_dim_t max_scattering = 0;
116*e4b17023SJohn Marino 
117*e4b17023SJohn Marino   FOR_EACH_VEC_ELT (poly_bb_p, SCOP_BBS (scop), i, pbb)
118*e4b17023SJohn Marino     max_scattering = MAX (pbb_nb_scattering_transform (pbb), max_scattering);
119*e4b17023SJohn Marino 
120*e4b17023SJohn Marino   FOR_EACH_VEC_ELT (poly_bb_p, SCOP_BBS (scop), i, pbb)
121*e4b17023SJohn Marino     extend_scattering (pbb, max_scattering);
122*e4b17023SJohn Marino 
123*e4b17023SJohn Marino   return max_scattering;
124*e4b17023SJohn Marino }
125*e4b17023SJohn Marino 
126*e4b17023SJohn Marino /* Print to FILE the pdr PH in OpenScop format.  NB_SUBSCRIPTS is the number
127*e4b17023SJohn Marino    of subscripts in PH, ALIAS_SET_DIM is the dimension of the alias set and
128*e4b17023SJohn Marino    NB_PARAMS is the number of parameters in PH.  */
129*e4b17023SJohn Marino 
130*e4b17023SJohn Marino static void
openscop_print_pdr_polyhedron(FILE * file,ppl_const_Polyhedron_t ph,int nb_subscripts,int alias_set_dimension,int nb_params)131*e4b17023SJohn Marino openscop_print_pdr_polyhedron (FILE *file, ppl_const_Polyhedron_t ph,
132*e4b17023SJohn Marino 			       int nb_subscripts, int alias_set_dimension,
133*e4b17023SJohn Marino 			       int nb_params)
134*e4b17023SJohn Marino {
135*e4b17023SJohn Marino   int input, locals, output;
136*e4b17023SJohn Marino   ppl_dimension_type alias_set_dim = (ppl_dimension_type) alias_set_dimension;
137*e4b17023SJohn Marino   ppl_dimension_type sub_dim_last = alias_set_dim + nb_subscripts;
138*e4b17023SJohn Marino   ppl_dimension_type *map, i, ph_space_dim = sub_dim_last + 1;
139*e4b17023SJohn Marino   ppl_Polyhedron_t pph;
140*e4b17023SJohn Marino 
141*e4b17023SJohn Marino   ppl_new_C_Polyhedron_from_C_Polyhedron (&pph, ph);
142*e4b17023SJohn Marino 
143*e4b17023SJohn Marino   map = (ppl_dimension_type *) XNEWVEC (ppl_dimension_type, ph_space_dim);
144*e4b17023SJohn Marino 
145*e4b17023SJohn Marino   for (i = 0; i < alias_set_dim - 1; i++)
146*e4b17023SJohn Marino     map[i] = nb_subscripts + 1 + i;
147*e4b17023SJohn Marino 
148*e4b17023SJohn Marino   for (i = alias_set_dim - 1; i < sub_dim_last; i++)
149*e4b17023SJohn Marino     map[i] = i - alias_set_dim + 1;
150*e4b17023SJohn Marino 
151*e4b17023SJohn Marino   ppl_Polyhedron_map_space_dimensions (pph, map, ph_space_dim - 1);
152*e4b17023SJohn Marino 
153*e4b17023SJohn Marino   locals = 0;
154*e4b17023SJohn Marino   input = alias_set_dim - nb_params - 1;
155*e4b17023SJohn Marino 
156*e4b17023SJohn Marino   /* According to OpenScop specification, the alias set column is a part of
157*e4b17023SJohn Marino      the output columns.  */
158*e4b17023SJohn Marino   output = nb_subscripts + 1;
159*e4b17023SJohn Marino 
160*e4b17023SJohn Marino   openscop_print_polyhedron_matrix (file, pph, output, input, locals, nb_params);
161*e4b17023SJohn Marino }
162*e4b17023SJohn Marino 
163*e4b17023SJohn Marino /* Print to FILE the powerset PDR.  NB_SUBSCRIPTS is the number of subscripts
164*e4b17023SJohn Marino    in PDR, ALIAS_SET_DIM is the dimension of the alias set in PDR and
165*e4b17023SJohn Marino    NB_PARAMS is the number of parameters in PDR.  */
166*e4b17023SJohn Marino 
167*e4b17023SJohn Marino static void
openscop_print_pdr_powerset(FILE * file,ppl_Pointset_Powerset_C_Polyhedron_t ps,int nb_subscripts,int alias_set_dim,int nb_params)168*e4b17023SJohn Marino openscop_print_pdr_powerset (FILE *file,
169*e4b17023SJohn Marino 			     ppl_Pointset_Powerset_C_Polyhedron_t ps,
170*e4b17023SJohn Marino 			     int nb_subscripts,
171*e4b17023SJohn Marino 			     int alias_set_dim,
172*e4b17023SJohn Marino 			     int nb_params)
173*e4b17023SJohn Marino {
174*e4b17023SJohn Marino   size_t nb_disjuncts;
175*e4b17023SJohn Marino   ppl_Pointset_Powerset_C_Polyhedron_iterator_t it, end;
176*e4b17023SJohn Marino 
177*e4b17023SJohn Marino   ppl_new_Pointset_Powerset_C_Polyhedron_iterator (&it);
178*e4b17023SJohn Marino   ppl_new_Pointset_Powerset_C_Polyhedron_iterator (&end);
179*e4b17023SJohn Marino 
180*e4b17023SJohn Marino   ppl_Pointset_Powerset_C_Polyhedron_size (ps, &nb_disjuncts);
181*e4b17023SJohn Marino   fprintf (file, "%d\n", (int) nb_disjuncts);
182*e4b17023SJohn Marino 
183*e4b17023SJohn Marino   for (ppl_Pointset_Powerset_C_Polyhedron_iterator_begin (ps, it),
184*e4b17023SJohn Marino        ppl_Pointset_Powerset_C_Polyhedron_iterator_end (ps, end);
185*e4b17023SJohn Marino        !ppl_Pointset_Powerset_C_Polyhedron_iterator_equal_test (it, end);
186*e4b17023SJohn Marino        ppl_Pointset_Powerset_C_Polyhedron_iterator_increment (it))
187*e4b17023SJohn Marino     {
188*e4b17023SJohn Marino       ppl_const_Polyhedron_t ph;
189*e4b17023SJohn Marino 
190*e4b17023SJohn Marino       ppl_Pointset_Powerset_C_Polyhedron_iterator_dereference (it, &ph);
191*e4b17023SJohn Marino       openscop_print_pdr_polyhedron (file, ph, nb_subscripts, alias_set_dim,
192*e4b17023SJohn Marino 				     nb_params);
193*e4b17023SJohn Marino     }
194*e4b17023SJohn Marino 
195*e4b17023SJohn Marino   ppl_delete_Pointset_Powerset_C_Polyhedron_iterator (it);
196*e4b17023SJohn Marino   ppl_delete_Pointset_Powerset_C_Polyhedron_iterator (end);
197*e4b17023SJohn Marino }
198*e4b17023SJohn Marino 
199*e4b17023SJohn Marino /* Print to FILE the powerset PS in its OpenScop matrix form.  */
200*e4b17023SJohn Marino 
201*e4b17023SJohn Marino static void
openscop_print_powerset_matrix(FILE * file,ppl_Pointset_Powerset_C_Polyhedron_t ps,int output,int input,int locals,int params)202*e4b17023SJohn Marino openscop_print_powerset_matrix (FILE *file,
203*e4b17023SJohn Marino 				ppl_Pointset_Powerset_C_Polyhedron_t ps,
204*e4b17023SJohn Marino 				int output, int input, int locals,
205*e4b17023SJohn Marino 				int params)
206*e4b17023SJohn Marino {
207*e4b17023SJohn Marino   size_t nb_disjuncts;
208*e4b17023SJohn Marino   ppl_Pointset_Powerset_C_Polyhedron_iterator_t it, end;
209*e4b17023SJohn Marino 
210*e4b17023SJohn Marino   ppl_new_Pointset_Powerset_C_Polyhedron_iterator (&it);
211*e4b17023SJohn Marino   ppl_new_Pointset_Powerset_C_Polyhedron_iterator (&end);
212*e4b17023SJohn Marino 
213*e4b17023SJohn Marino   ppl_Pointset_Powerset_C_Polyhedron_size (ps, &nb_disjuncts);
214*e4b17023SJohn Marino   fprintf (file, "%d\n", (int) nb_disjuncts);
215*e4b17023SJohn Marino 
216*e4b17023SJohn Marino   for (ppl_Pointset_Powerset_C_Polyhedron_iterator_begin (ps, it),
217*e4b17023SJohn Marino        ppl_Pointset_Powerset_C_Polyhedron_iterator_end (ps, end);
218*e4b17023SJohn Marino        !ppl_Pointset_Powerset_C_Polyhedron_iterator_equal_test (it, end);
219*e4b17023SJohn Marino        ppl_Pointset_Powerset_C_Polyhedron_iterator_increment (it))
220*e4b17023SJohn Marino     {
221*e4b17023SJohn Marino       ppl_const_Polyhedron_t ph;
222*e4b17023SJohn Marino 
223*e4b17023SJohn Marino       ppl_Pointset_Powerset_C_Polyhedron_iterator_dereference (it, &ph);
224*e4b17023SJohn Marino       openscop_print_polyhedron_matrix (file, ph, output, input, locals,
225*e4b17023SJohn Marino 				        params);
226*e4b17023SJohn Marino     }
227*e4b17023SJohn Marino 
228*e4b17023SJohn Marino   ppl_delete_Pointset_Powerset_C_Polyhedron_iterator (it);
229*e4b17023SJohn Marino   ppl_delete_Pointset_Powerset_C_Polyhedron_iterator (end);
230*e4b17023SJohn Marino }
231*e4b17023SJohn Marino 
232*e4b17023SJohn Marino /* Prints to FILE the scattering function of PBB in OpenScop format, at some
233*e4b17023SJohn Marino    VERBOSITY level.  */
234*e4b17023SJohn Marino 
235*e4b17023SJohn Marino static void
openscop_print_scattering_function_1(FILE * file,poly_bb_p pbb,int verbosity)236*e4b17023SJohn Marino openscop_print_scattering_function_1 (FILE *file, poly_bb_p pbb, int verbosity)
237*e4b17023SJohn Marino {
238*e4b17023SJohn Marino   graphite_dim_t i;
239*e4b17023SJohn Marino   ppl_const_Polyhedron_t ph;
240*e4b17023SJohn Marino 
241*e4b17023SJohn Marino   if (verbosity > 0)
242*e4b17023SJohn Marino     {
243*e4b17023SJohn Marino       fprintf (file, "# scattering bb_%d (\n", pbb_index (pbb));
244*e4b17023SJohn Marino       fprintf (file, "#eq");
245*e4b17023SJohn Marino 
246*e4b17023SJohn Marino       for (i = 0; i < pbb_nb_scattering_transform (pbb); i++)
247*e4b17023SJohn Marino 	fprintf (file, "     s%d", (int) i);
248*e4b17023SJohn Marino 
249*e4b17023SJohn Marino       for (i = 0; i < pbb_nb_local_vars (pbb); i++)
250*e4b17023SJohn Marino 	fprintf (file, "    lv%d", (int) i);
251*e4b17023SJohn Marino 
252*e4b17023SJohn Marino       for (i = 0; i < pbb_dim_iter_domain (pbb); i++)
253*e4b17023SJohn Marino 	fprintf (file, "     i%d", (int) i);
254*e4b17023SJohn Marino 
255*e4b17023SJohn Marino       for (i = 0; i < pbb_nb_params (pbb); i++)
256*e4b17023SJohn Marino 	fprintf (file, "     p%d", (int) i);
257*e4b17023SJohn Marino 
258*e4b17023SJohn Marino       fprintf (file, "    cst\n");
259*e4b17023SJohn Marino     }
260*e4b17023SJohn Marino 
261*e4b17023SJohn Marino   /* Number of disjunct components.  Remove this when
262*e4b17023SJohn Marino      PBB_TRANSFORMED_SCATTERING will be a pointset_powerset.  */
263*e4b17023SJohn Marino   fprintf (file, "1\n");
264*e4b17023SJohn Marino 
265*e4b17023SJohn Marino   ph = PBB_TRANSFORMED_SCATTERING (pbb)
266*e4b17023SJohn Marino     ? PBB_TRANSFORMED_SCATTERING (pbb)
267*e4b17023SJohn Marino     : PBB_ORIGINAL_SCATTERING (pbb);
268*e4b17023SJohn Marino 
269*e4b17023SJohn Marino   openscop_print_polyhedron_matrix (file, ph,
270*e4b17023SJohn Marino 				    pbb_nb_scattering_transform (pbb),
271*e4b17023SJohn Marino 				    pbb_dim_iter_domain (pbb),
272*e4b17023SJohn Marino 				    pbb_nb_local_vars (pbb),
273*e4b17023SJohn Marino 				    pbb_nb_params (pbb));
274*e4b17023SJohn Marino 
275*e4b17023SJohn Marino   if (verbosity > 0)
276*e4b17023SJohn Marino     fprintf (file, "#)\n");
277*e4b17023SJohn Marino }
278*e4b17023SJohn Marino 
279*e4b17023SJohn Marino /* Prints to FILE the scattering function of PBB, at some VERBOSITY
280*e4b17023SJohn Marino    level.  */
281*e4b17023SJohn Marino 
282*e4b17023SJohn Marino static void
print_scattering_function_1(FILE * file,poly_bb_p pbb,int verbosity)283*e4b17023SJohn Marino print_scattering_function_1 (FILE *file, poly_bb_p pbb, int verbosity)
284*e4b17023SJohn Marino {
285*e4b17023SJohn Marino   graphite_dim_t i;
286*e4b17023SJohn Marino 
287*e4b17023SJohn Marino   if (verbosity > 0)
288*e4b17023SJohn Marino     {
289*e4b17023SJohn Marino       fprintf (file, "# scattering bb_%d (\n", pbb_index (pbb));
290*e4b17023SJohn Marino       fprintf (file, "#eq");
291*e4b17023SJohn Marino 
292*e4b17023SJohn Marino       for (i = 0; i < pbb_nb_scattering_transform (pbb); i++)
293*e4b17023SJohn Marino 	fprintf (file, "     s%d", (int) i);
294*e4b17023SJohn Marino 
295*e4b17023SJohn Marino       for (i = 0; i < pbb_nb_local_vars (pbb); i++)
296*e4b17023SJohn Marino 	fprintf (file, "    lv%d", (int) i);
297*e4b17023SJohn Marino 
298*e4b17023SJohn Marino       for (i = 0; i < pbb_dim_iter_domain (pbb); i++)
299*e4b17023SJohn Marino 	fprintf (file, "     i%d", (int) i);
300*e4b17023SJohn Marino 
301*e4b17023SJohn Marino       for (i = 0; i < pbb_nb_params (pbb); i++)
302*e4b17023SJohn Marino 	fprintf (file, "     p%d", (int) i);
303*e4b17023SJohn Marino 
304*e4b17023SJohn Marino       fprintf (file, "    cst\n");
305*e4b17023SJohn Marino     }
306*e4b17023SJohn Marino 
307*e4b17023SJohn Marino   /* Number of disjunct components.  Remove this when
308*e4b17023SJohn Marino      PBB_TRANSFORMED_SCATTERING will be a pointset_powerset.  */
309*e4b17023SJohn Marino   fprintf (file, "1\n");
310*e4b17023SJohn Marino   ppl_print_polyhedron_matrix (file, PBB_TRANSFORMED_SCATTERING (pbb)
311*e4b17023SJohn Marino 			       ? PBB_TRANSFORMED_SCATTERING (pbb)
312*e4b17023SJohn Marino 			       : PBB_ORIGINAL_SCATTERING (pbb));
313*e4b17023SJohn Marino 
314*e4b17023SJohn Marino   if (verbosity > 0)
315*e4b17023SJohn Marino     fprintf (file, "#)\n");
316*e4b17023SJohn Marino }
317*e4b17023SJohn Marino 
318*e4b17023SJohn Marino /* Prints to FILE the scattering function of PBB, at some VERBOSITY
319*e4b17023SJohn Marino    level.  */
320*e4b17023SJohn Marino 
321*e4b17023SJohn Marino void
print_scattering_function(FILE * file,poly_bb_p pbb,int verbosity)322*e4b17023SJohn Marino print_scattering_function (FILE *file, poly_bb_p pbb, int verbosity)
323*e4b17023SJohn Marino {
324*e4b17023SJohn Marino   if (!PBB_TRANSFORMED (pbb))
325*e4b17023SJohn Marino     return;
326*e4b17023SJohn Marino 
327*e4b17023SJohn Marino   if (PBB_TRANSFORMED_SCATTERING (pbb)
328*e4b17023SJohn Marino       || PBB_ORIGINAL_SCATTERING (pbb))
329*e4b17023SJohn Marino     {
330*e4b17023SJohn Marino       if (verbosity > 0)
331*e4b17023SJohn Marino 	fprintf (file, "# Scattering function is provided\n");
332*e4b17023SJohn Marino 
333*e4b17023SJohn Marino       fprintf (file, "1\n");
334*e4b17023SJohn Marino     }
335*e4b17023SJohn Marino   else
336*e4b17023SJohn Marino     {
337*e4b17023SJohn Marino       if (verbosity > 0)
338*e4b17023SJohn Marino 	fprintf (file, "# Scattering function is not provided\n");
339*e4b17023SJohn Marino 
340*e4b17023SJohn Marino       fprintf (file, "0\n");
341*e4b17023SJohn Marino       return;
342*e4b17023SJohn Marino     }
343*e4b17023SJohn Marino 
344*e4b17023SJohn Marino   openscop_print_scattering_function_1 (file, pbb, verbosity);
345*e4b17023SJohn Marino 
346*e4b17023SJohn Marino   if (verbosity > 0)
347*e4b17023SJohn Marino     fprintf (file, "# Scattering names are not provided\n");
348*e4b17023SJohn Marino 
349*e4b17023SJohn Marino   fprintf (file, "0\n");
350*e4b17023SJohn Marino 
351*e4b17023SJohn Marino }
352*e4b17023SJohn Marino 
353*e4b17023SJohn Marino /* Prints to FILE the iteration domain of PBB, at some VERBOSITY
354*e4b17023SJohn Marino    level.  */
355*e4b17023SJohn Marino 
356*e4b17023SJohn Marino void
print_iteration_domain(FILE * file,poly_bb_p pbb,int verbosity)357*e4b17023SJohn Marino print_iteration_domain (FILE *file, poly_bb_p pbb, int verbosity)
358*e4b17023SJohn Marino {
359*e4b17023SJohn Marino   print_pbb_domain (file, pbb, verbosity);
360*e4b17023SJohn Marino }
361*e4b17023SJohn Marino 
362*e4b17023SJohn Marino /* Prints to FILE the scattering functions of every PBB of SCOP.  */
363*e4b17023SJohn Marino 
364*e4b17023SJohn Marino void
print_scattering_functions(FILE * file,scop_p scop,int verbosity)365*e4b17023SJohn Marino print_scattering_functions (FILE *file, scop_p scop, int verbosity)
366*e4b17023SJohn Marino {
367*e4b17023SJohn Marino   int i;
368*e4b17023SJohn Marino   poly_bb_p pbb;
369*e4b17023SJohn Marino 
370*e4b17023SJohn Marino   FOR_EACH_VEC_ELT (poly_bb_p, SCOP_BBS (scop), i, pbb)
371*e4b17023SJohn Marino     print_scattering_function (file, pbb, verbosity);
372*e4b17023SJohn Marino }
373*e4b17023SJohn Marino 
374*e4b17023SJohn Marino /* Prints to FILE the iteration domains of every PBB of SCOP, at some
375*e4b17023SJohn Marino    VERBOSITY level.  */
376*e4b17023SJohn Marino 
377*e4b17023SJohn Marino void
print_iteration_domains(FILE * file,scop_p scop,int verbosity)378*e4b17023SJohn Marino print_iteration_domains (FILE *file, scop_p scop, int verbosity)
379*e4b17023SJohn Marino {
380*e4b17023SJohn Marino   int i;
381*e4b17023SJohn Marino   poly_bb_p pbb;
382*e4b17023SJohn Marino 
383*e4b17023SJohn Marino   FOR_EACH_VEC_ELT (poly_bb_p, SCOP_BBS (scop), i, pbb)
384*e4b17023SJohn Marino     print_iteration_domain (file, pbb, verbosity);
385*e4b17023SJohn Marino }
386*e4b17023SJohn Marino 
387*e4b17023SJohn Marino /* Prints to STDERR the scattering function of PBB, at some VERBOSITY
388*e4b17023SJohn Marino    level.  */
389*e4b17023SJohn Marino 
390*e4b17023SJohn Marino DEBUG_FUNCTION void
debug_scattering_function(poly_bb_p pbb,int verbosity)391*e4b17023SJohn Marino debug_scattering_function (poly_bb_p pbb, int verbosity)
392*e4b17023SJohn Marino {
393*e4b17023SJohn Marino   print_scattering_function (stderr, pbb, verbosity);
394*e4b17023SJohn Marino }
395*e4b17023SJohn Marino 
396*e4b17023SJohn Marino /* Prints to STDERR the iteration domain of PBB, at some VERBOSITY
397*e4b17023SJohn Marino    level.  */
398*e4b17023SJohn Marino 
399*e4b17023SJohn Marino DEBUG_FUNCTION void
debug_iteration_domain(poly_bb_p pbb,int verbosity)400*e4b17023SJohn Marino debug_iteration_domain (poly_bb_p pbb, int verbosity)
401*e4b17023SJohn Marino {
402*e4b17023SJohn Marino   print_iteration_domain (stderr, pbb, verbosity);
403*e4b17023SJohn Marino }
404*e4b17023SJohn Marino 
405*e4b17023SJohn Marino /* Prints to STDERR the scattering functions of every PBB of SCOP, at
406*e4b17023SJohn Marino    some VERBOSITY level.  */
407*e4b17023SJohn Marino 
408*e4b17023SJohn Marino DEBUG_FUNCTION void
debug_scattering_functions(scop_p scop,int verbosity)409*e4b17023SJohn Marino debug_scattering_functions (scop_p scop, int verbosity)
410*e4b17023SJohn Marino {
411*e4b17023SJohn Marino   print_scattering_functions (stderr, scop, verbosity);
412*e4b17023SJohn Marino }
413*e4b17023SJohn Marino 
414*e4b17023SJohn Marino /* Prints to STDERR the iteration domains of every PBB of SCOP, at
415*e4b17023SJohn Marino    some VERBOSITY level.  */
416*e4b17023SJohn Marino 
417*e4b17023SJohn Marino DEBUG_FUNCTION void
debug_iteration_domains(scop_p scop,int verbosity)418*e4b17023SJohn Marino debug_iteration_domains (scop_p scop, int verbosity)
419*e4b17023SJohn Marino {
420*e4b17023SJohn Marino   print_iteration_domains (stderr, scop, verbosity);
421*e4b17023SJohn Marino }
422*e4b17023SJohn Marino 
423*e4b17023SJohn Marino /* Read N integer from FILE.  */
424*e4b17023SJohn Marino 
425*e4b17023SJohn Marino int *
openscop_read_N_int(FILE * file,int N)426*e4b17023SJohn Marino openscop_read_N_int (FILE *file, int N)
427*e4b17023SJohn Marino {
428*e4b17023SJohn Marino   char s[OPENSCOP_MAX_STRING];
429*e4b17023SJohn Marino   char *str;
430*e4b17023SJohn Marino   int i, *res = (int *) xmalloc (OPENSCOP_MAX_STRING * sizeof (int));
431*e4b17023SJohn Marino 
432*e4b17023SJohn Marino   /* Skip blank and commented lines.  */
433*e4b17023SJohn Marino   while (fgets (s, sizeof s, file) == (char *) 0
434*e4b17023SJohn Marino 	 || s[0] == '#'
435*e4b17023SJohn Marino 	 || ISSPACE (s[0]))
436*e4b17023SJohn Marino     ;
437*e4b17023SJohn Marino 
438*e4b17023SJohn Marino   str = s;
439*e4b17023SJohn Marino 
440*e4b17023SJohn Marino   for (i = 0; i < N; i++)
441*e4b17023SJohn Marino     {
442*e4b17023SJohn Marino       sscanf (str, "%d", &res[i]);
443*e4b17023SJohn Marino 
444*e4b17023SJohn Marino       /* Jump the integer that was read.  */
445*e4b17023SJohn Marino       while ((*str) && !ISSPACE (*str) && (*str != '#'))
446*e4b17023SJohn Marino 	str++;
447*e4b17023SJohn Marino 
448*e4b17023SJohn Marino       /* Jump spaces.  */
449*e4b17023SJohn Marino       while ((*str) && ISSPACE (*str) && (*str != '#'))
450*e4b17023SJohn Marino 	str++;
451*e4b17023SJohn Marino     }
452*e4b17023SJohn Marino 
453*e4b17023SJohn Marino   return res;
454*e4b17023SJohn Marino }
455*e4b17023SJohn Marino 
456*e4b17023SJohn Marino /* Read one integer from FILE.  */
457*e4b17023SJohn Marino 
458*e4b17023SJohn Marino static int
openscop_read_one_int(FILE * file)459*e4b17023SJohn Marino openscop_read_one_int (FILE *file)
460*e4b17023SJohn Marino {
461*e4b17023SJohn Marino   int *x = openscop_read_N_int (file, 1);
462*e4b17023SJohn Marino   int res = *x;
463*e4b17023SJohn Marino 
464*e4b17023SJohn Marino   free (x);
465*e4b17023SJohn Marino   return res;
466*e4b17023SJohn Marino }
467*e4b17023SJohn Marino 
468*e4b17023SJohn Marino /* Read N string from FILE.  */
469*e4b17023SJohn Marino 
470*e4b17023SJohn Marino static char *
openscop_read_N_string(FILE * file,int N)471*e4b17023SJohn Marino openscop_read_N_string (FILE *file, int N)
472*e4b17023SJohn Marino {
473*e4b17023SJohn Marino   int count, i;
474*e4b17023SJohn Marino   char str[OPENSCOP_MAX_STRING];
475*e4b17023SJohn Marino   char *tmp = (char *) xmalloc (sizeof (char) * OPENSCOP_MAX_STRING);
476*e4b17023SJohn Marino   char *s = NULL;
477*e4b17023SJohn Marino 
478*e4b17023SJohn Marino   /* Skip blank and commented lines.  */
479*e4b17023SJohn Marino   while (fgets (str, sizeof str, file) == (char *) 0
480*e4b17023SJohn Marino 	 || str[0] == '#'
481*e4b17023SJohn Marino 	 || ISSPACE (str[0]))
482*e4b17023SJohn Marino     ;
483*e4b17023SJohn Marino 
484*e4b17023SJohn Marino   s = str;
485*e4b17023SJohn Marino   count = 0;
486*e4b17023SJohn Marino 
487*e4b17023SJohn Marino   for (i = 0; i < N; i++)
488*e4b17023SJohn Marino     {
489*e4b17023SJohn Marino       /* Read the first word.  */
490*e4b17023SJohn Marino       for (; (*s) && (!ISSPACE (*s)) && (*s != '#'); ++count)
491*e4b17023SJohn Marino         tmp[count] = *(s++);
492*e4b17023SJohn Marino 
493*e4b17023SJohn Marino       tmp[count] = ' ';
494*e4b17023SJohn Marino       count++;
495*e4b17023SJohn Marino 
496*e4b17023SJohn Marino       /* Jump spaces.  */
497*e4b17023SJohn Marino       while ((*s) && ISSPACE (*s) && (*s != '#'))
498*e4b17023SJohn Marino 	s++;
499*e4b17023SJohn Marino     }
500*e4b17023SJohn Marino 
501*e4b17023SJohn Marino   tmp[count-1] = '\0';
502*e4b17023SJohn Marino 
503*e4b17023SJohn Marino   return tmp;
504*e4b17023SJohn Marino }
505*e4b17023SJohn Marino 
506*e4b17023SJohn Marino /* Read one string from FILE.  */
507*e4b17023SJohn Marino 
508*e4b17023SJohn Marino static char *
openscop_read_one_string(FILE * file)509*e4b17023SJohn Marino openscop_read_one_string (FILE *file)
510*e4b17023SJohn Marino {
511*e4b17023SJohn Marino   return openscop_read_N_string (file, 1);
512*e4b17023SJohn Marino }
513*e4b17023SJohn Marino 
514*e4b17023SJohn Marino /* Read from FILE the powerset PS in its OpenScop matrix form.  OUTPUT is the
515*e4b17023SJohn Marino    number of output dimensions, INPUT is the number of input dimensions,
516*e4b17023SJohn Marino    LOCALS is the number of existentially quantified variables and PARAMS is
517*e4b17023SJohn Marino    the number of parameters.  */
518*e4b17023SJohn Marino 
519*e4b17023SJohn Marino static void
openscop_read_powerset_matrix(FILE * file,ppl_Pointset_Powerset_C_Polyhedron_t * ps,int * output,int * input,int * locals,int * params)520*e4b17023SJohn Marino openscop_read_powerset_matrix (FILE *file,
521*e4b17023SJohn Marino 			       ppl_Pointset_Powerset_C_Polyhedron_t *ps,
522*e4b17023SJohn Marino 			       int *output, int *input, int *locals,
523*e4b17023SJohn Marino 			       int *params)
524*e4b17023SJohn Marino {
525*e4b17023SJohn Marino   int nb_disjuncts, i;
526*e4b17023SJohn Marino 
527*e4b17023SJohn Marino   nb_disjuncts = openscop_read_one_int (file);
528*e4b17023SJohn Marino 
529*e4b17023SJohn Marino   for (i = 0; i < nb_disjuncts; i++)
530*e4b17023SJohn Marino     {
531*e4b17023SJohn Marino       ppl_Polyhedron_t ph;
532*e4b17023SJohn Marino 
533*e4b17023SJohn Marino       openscop_read_polyhedron_matrix (file, &ph, output, input, locals,
534*e4b17023SJohn Marino 				       params);
535*e4b17023SJohn Marino       if (!ph)
536*e4b17023SJohn Marino         *ps = NULL;
537*e4b17023SJohn Marino       else if (i == 0)
538*e4b17023SJohn Marino         ppl_new_Pointset_Powerset_C_Polyhedron_from_C_Polyhedron (ps, ph);
539*e4b17023SJohn Marino       else
540*e4b17023SJohn Marino         ppl_Pointset_Powerset_C_Polyhedron_add_disjunct (*ps, ph);
541*e4b17023SJohn Marino     }
542*e4b17023SJohn Marino }
543*e4b17023SJohn Marino 
544*e4b17023SJohn Marino /* Read a scattering function from FILE and save it to PBB.  Return whether
545*e4b17023SJohn Marino    the scattering function was provided or not.  */
546*e4b17023SJohn Marino 
547*e4b17023SJohn Marino static bool
graphite_read_scatt(FILE * file,poly_bb_p pbb)548*e4b17023SJohn Marino graphite_read_scatt (FILE *file, poly_bb_p pbb)
549*e4b17023SJohn Marino {
550*e4b17023SJohn Marino   bool scattering_provided = false;
551*e4b17023SJohn Marino   int output, input, locals, params;
552*e4b17023SJohn Marino   ppl_Polyhedron_t newp;
553*e4b17023SJohn Marino 
554*e4b17023SJohn Marino   if (openscop_read_one_int (file) > 0)
555*e4b17023SJohn Marino     {
556*e4b17023SJohn Marino       /* Read number of disjunct components.  */
557*e4b17023SJohn Marino       openscop_read_one_int (file);
558*e4b17023SJohn Marino 
559*e4b17023SJohn Marino       /* Read scattering function.  */
560*e4b17023SJohn Marino       openscop_read_polyhedron_matrix (file, &newp, &output, &input,
561*e4b17023SJohn Marino 				       &locals, &params);
562*e4b17023SJohn Marino       store_scattering (PBB_SCOP (pbb));
563*e4b17023SJohn Marino       PBB_TRANSFORMED (pbb) = poly_scattering_new ();
564*e4b17023SJohn Marino       PBB_TRANSFORMED_SCATTERING (pbb) = newp;
565*e4b17023SJohn Marino       PBB_NB_LOCAL_VARIABLES (pbb) = locals;
566*e4b17023SJohn Marino 
567*e4b17023SJohn Marino       /* New scattering dimension.  */
568*e4b17023SJohn Marino       PBB_NB_SCATTERING_TRANSFORM (pbb) = output;
569*e4b17023SJohn Marino 
570*e4b17023SJohn Marino       scattering_provided = true;
571*e4b17023SJohn Marino     }
572*e4b17023SJohn Marino 
573*e4b17023SJohn Marino   return scattering_provided;
574*e4b17023SJohn Marino }
575*e4b17023SJohn Marino 
576*e4b17023SJohn Marino /* Read a scop file.  Return true if the scop is transformed.  */
577*e4b17023SJohn Marino 
578*e4b17023SJohn Marino static bool
graphite_read_scop_file(FILE * file,scop_p scop)579*e4b17023SJohn Marino graphite_read_scop_file (FILE *file, scop_p scop)
580*e4b17023SJohn Marino {
581*e4b17023SJohn Marino   char *tmp, *language;
582*e4b17023SJohn Marino   size_t i, j, nb_statements, nbr, nbw;
583*e4b17023SJohn Marino   int input, output, locals, params;
584*e4b17023SJohn Marino   ppl_Pointset_Powerset_C_Polyhedron_t ps;
585*e4b17023SJohn Marino   poly_bb_p pbb;
586*e4b17023SJohn Marino   bool transform_done = false;
587*e4b17023SJohn Marino 
588*e4b17023SJohn Marino   /* Ensure that the file is in OpenScop format.  */
589*e4b17023SJohn Marino   tmp = openscop_read_N_string (file, 2);
590*e4b17023SJohn Marino 
591*e4b17023SJohn Marino   if (strcmp (tmp, "SCoP 1"))
592*e4b17023SJohn Marino     {
593*e4b17023SJohn Marino       error ("the file is not in OpenScop format");
594*e4b17023SJohn Marino       return false;
595*e4b17023SJohn Marino     }
596*e4b17023SJohn Marino 
597*e4b17023SJohn Marino   free (tmp);
598*e4b17023SJohn Marino 
599*e4b17023SJohn Marino   /* Read the language.  */
600*e4b17023SJohn Marino   language = openscop_read_one_string (file);
601*e4b17023SJohn Marino 
602*e4b17023SJohn Marino   if (strcmp (language, "Gimple"))
603*e4b17023SJohn Marino     {
604*e4b17023SJohn Marino       error ("the language is not recognized");
605*e4b17023SJohn Marino       return false;
606*e4b17023SJohn Marino     }
607*e4b17023SJohn Marino 
608*e4b17023SJohn Marino   free (language);
609*e4b17023SJohn Marino 
610*e4b17023SJohn Marino   /* Read the context but do not use it.  */
611*e4b17023SJohn Marino   openscop_read_powerset_matrix (file, &ps, &input, &output, &locals, &params);
612*e4b17023SJohn Marino 
613*e4b17023SJohn Marino   if ((size_t) params != scop->nb_params)
614*e4b17023SJohn Marino     {
615*e4b17023SJohn Marino       error ("parameters number in the scop file is different from the"
616*e4b17023SJohn Marino 	     " internal scop parameter number");
617*e4b17023SJohn Marino       return false;
618*e4b17023SJohn Marino     }
619*e4b17023SJohn Marino 
620*e4b17023SJohn Marino   /* Read parameter names if provided.  */
621*e4b17023SJohn Marino   if (openscop_read_one_int (file))
622*e4b17023SJohn Marino     openscop_read_N_string (file, scop->nb_params);
623*e4b17023SJohn Marino 
624*e4b17023SJohn Marino   nb_statements = openscop_read_one_int (file);
625*e4b17023SJohn Marino 
626*e4b17023SJohn Marino   if (nb_statements != VEC_length (poly_bb_p, SCOP_BBS (scop)))
627*e4b17023SJohn Marino     {
628*e4b17023SJohn Marino       error ("number of statements in the OpenScop file does not match"
629*e4b17023SJohn Marino 	     " the graphite internal statements number");
630*e4b17023SJohn Marino       return false;
631*e4b17023SJohn Marino     }
632*e4b17023SJohn Marino 
633*e4b17023SJohn Marino   for (i = 0; VEC_iterate (poly_bb_p, SCOP_BBS (scop), i, pbb); i++)
634*e4b17023SJohn Marino     {
635*e4b17023SJohn Marino       /* Read iteration domain.  */
636*e4b17023SJohn Marino       openscop_read_powerset_matrix (file, &ps, &input, &output, &locals,
637*e4b17023SJohn Marino 				     &params);
638*e4b17023SJohn Marino 
639*e4b17023SJohn Marino       /* Read scattering.  */
640*e4b17023SJohn Marino       transform_done = graphite_read_scatt (file, pbb);
641*e4b17023SJohn Marino 
642*e4b17023SJohn Marino       /* Scattering names.  */
643*e4b17023SJohn Marino       openscop_read_one_int (file);
644*e4b17023SJohn Marino 
645*e4b17023SJohn Marino       /* Read access functions.  */
646*e4b17023SJohn Marino       if (openscop_read_one_int (file) > 0)
647*e4b17023SJohn Marino 	{
648*e4b17023SJohn Marino 	  nbr = openscop_read_one_int (file);
649*e4b17023SJohn Marino 
650*e4b17023SJohn Marino 	  /* Read access functions.  */
651*e4b17023SJohn Marino 	  for (j = 0; j < nbr; j++)
652*e4b17023SJohn Marino 	    openscop_read_powerset_matrix (file, &ps, &input, &output, &locals,
653*e4b17023SJohn Marino 					   &params);
654*e4b17023SJohn Marino 
655*e4b17023SJohn Marino 	  nbw = openscop_read_one_int (file);
656*e4b17023SJohn Marino 
657*e4b17023SJohn Marino 	  /* Write access functions.  */
658*e4b17023SJohn Marino 	  for (j = 0; j < nbw; j++)
659*e4b17023SJohn Marino 	    openscop_read_powerset_matrix (file, &ps, &input, &output, &locals,
660*e4b17023SJohn Marino 					   &params);
661*e4b17023SJohn Marino 	}
662*e4b17023SJohn Marino 
663*e4b17023SJohn Marino       /* Statement body.  */
664*e4b17023SJohn Marino       openscop_read_one_int (file);
665*e4b17023SJohn Marino     }
666*e4b17023SJohn Marino 
667*e4b17023SJohn Marino   return transform_done;
668*e4b17023SJohn Marino }
669*e4b17023SJohn Marino 
670*e4b17023SJohn Marino /* Initialize and return a file that will be used to write a scop.  SCOP_NUMBER
671*e4b17023SJohn Marino    is a sequential number (identifier) used to differentiate scop files.
672*e4b17023SJohn Marino    Examples of the generated file names: dump_base_name.0.graphite,
673*e4b17023SJohn Marino    dump_base_name.1.graphite, dump_base_name.2.graphite, etc.  */
674*e4b17023SJohn Marino 
675*e4b17023SJohn Marino static FILE *
init_graphite_out_file(int scop_number)676*e4b17023SJohn Marino init_graphite_out_file (int scop_number)
677*e4b17023SJohn Marino {
678*e4b17023SJohn Marino   FILE *graphite_out_file;
679*e4b17023SJohn Marino   int len = strlen (dump_base_name);
680*e4b17023SJohn Marino   char *dumpname = XNEWVEC (char, len + 25);
681*e4b17023SJohn Marino   char *s_scop_number = XNEWVEC (char, 15);
682*e4b17023SJohn Marino 
683*e4b17023SJohn Marino   memcpy (dumpname, dump_base_name, len + 1);
684*e4b17023SJohn Marino   strip_off_ending (dumpname, len);
685*e4b17023SJohn Marino   sprintf (s_scop_number, ".%d", scop_number);
686*e4b17023SJohn Marino   strcat (dumpname, s_scop_number);
687*e4b17023SJohn Marino   strcat (dumpname, ".graphite");
688*e4b17023SJohn Marino   graphite_out_file = fopen (dumpname, "w+b");
689*e4b17023SJohn Marino 
690*e4b17023SJohn Marino   if (graphite_out_file == 0)
691*e4b17023SJohn Marino     fatal_error ("can%'t open %s for writing: %m", dumpname);
692*e4b17023SJohn Marino 
693*e4b17023SJohn Marino   free (dumpname);
694*e4b17023SJohn Marino 
695*e4b17023SJohn Marino   return graphite_out_file;
696*e4b17023SJohn Marino }
697*e4b17023SJohn Marino 
698*e4b17023SJohn Marino /* Open and return a file used for scop reading.  SCOP_NUMBER is a sequential
699*e4b17023SJohn Marino    number (identifier) used to differentiate scop files.  Examples of the
700*e4b17023SJohn Marino    generated file names: dump_base_name.0.graphite, dump_base_name.1.graphite,
701*e4b17023SJohn Marino    dump_base_name.2.graphite, etc.  */
702*e4b17023SJohn Marino 
703*e4b17023SJohn Marino static FILE *
init_graphite_in_file(int scop_number)704*e4b17023SJohn Marino init_graphite_in_file (int scop_number)
705*e4b17023SJohn Marino {
706*e4b17023SJohn Marino   FILE *graphite_in_file;
707*e4b17023SJohn Marino   int len = strlen (dump_base_name);
708*e4b17023SJohn Marino   char *dumpname = XNEWVEC (char, len + 25);
709*e4b17023SJohn Marino   char *s_scop_number = XNEWVEC (char, 15);
710*e4b17023SJohn Marino 
711*e4b17023SJohn Marino   memcpy (dumpname, dump_base_name, len + 1);
712*e4b17023SJohn Marino   strip_off_ending (dumpname, len);
713*e4b17023SJohn Marino   sprintf (s_scop_number, ".%d", scop_number);
714*e4b17023SJohn Marino   strcat (dumpname, s_scop_number);
715*e4b17023SJohn Marino   strcat (dumpname, ".graphite");
716*e4b17023SJohn Marino   graphite_in_file = fopen (dumpname, "r+b");
717*e4b17023SJohn Marino 
718*e4b17023SJohn Marino   if (graphite_in_file == 0)
719*e4b17023SJohn Marino     fatal_error ("can%'t open %s for reading: %m", dumpname);
720*e4b17023SJohn Marino 
721*e4b17023SJohn Marino   free (dumpname);
722*e4b17023SJohn Marino 
723*e4b17023SJohn Marino   return graphite_in_file;
724*e4b17023SJohn Marino }
725*e4b17023SJohn Marino 
726*e4b17023SJohn Marino /* Apply graphite transformations to all the basic blocks of SCOP.  */
727*e4b17023SJohn Marino 
728*e4b17023SJohn Marino bool
apply_poly_transforms(scop_p scop)729*e4b17023SJohn Marino apply_poly_transforms (scop_p scop)
730*e4b17023SJohn Marino {
731*e4b17023SJohn Marino   bool transform_done = false;
732*e4b17023SJohn Marino   FILE *graphite_file;
733*e4b17023SJohn Marino   static size_t file_scop_number = 0;
734*e4b17023SJohn Marino 
735*e4b17023SJohn Marino   /* This feature is only enabled in the Graphite branch.  */
736*e4b17023SJohn Marino   if (0)
737*e4b17023SJohn Marino     {
738*e4b17023SJohn Marino       graphite_file = init_graphite_in_file (file_scop_number);
739*e4b17023SJohn Marino       transform_done |= graphite_read_scop_file (graphite_file, scop);
740*e4b17023SJohn Marino 
741*e4b17023SJohn Marino       /* We cannot check for the legality of the transform here: there
742*e4b17023SJohn Marino 	 are cases where graphite_legal_transform cannot determine the
743*e4b17023SJohn Marino 	 dependence at compile time.  For an example, see the
744*e4b17023SJohn Marino 	 explanation of why http://gcc.gnu.org/PR45450 is invalid.  */
745*e4b17023SJohn Marino       if (0 && !graphite_legal_transform (scop))
746*e4b17023SJohn Marino 	fatal_error ("the graphite file read for scop %d does not contain a legal transform",
747*e4b17023SJohn Marino 		     (int) file_scop_number);
748*e4b17023SJohn Marino 
749*e4b17023SJohn Marino       file_scop_number++;
750*e4b17023SJohn Marino     }
751*e4b17023SJohn Marino 
752*e4b17023SJohn Marino   /* Generate code even if we did not apply any real transformation.
753*e4b17023SJohn Marino      This also allows to check the performance for the identity
754*e4b17023SJohn Marino      transformation: GIMPLE -> GRAPHITE -> GIMPLE
755*e4b17023SJohn Marino      Keep in mind that CLooG optimizes in control, so the loop structure
756*e4b17023SJohn Marino      may change, even if we only use -fgraphite-identity.  */
757*e4b17023SJohn Marino   if (flag_graphite_identity)
758*e4b17023SJohn Marino     transform_done = true;
759*e4b17023SJohn Marino 
760*e4b17023SJohn Marino   if (flag_loop_parallelize_all)
761*e4b17023SJohn Marino     transform_done = true;
762*e4b17023SJohn Marino 
763*e4b17023SJohn Marino   if (flag_loop_block)
764*e4b17023SJohn Marino     transform_done |= scop_do_block (scop);
765*e4b17023SJohn Marino   else
766*e4b17023SJohn Marino     {
767*e4b17023SJohn Marino       if (flag_loop_strip_mine)
768*e4b17023SJohn Marino 	transform_done |= scop_do_strip_mine (scop, 0);
769*e4b17023SJohn Marino 
770*e4b17023SJohn Marino       if (flag_loop_interchange)
771*e4b17023SJohn Marino 	transform_done |= scop_do_interchange (scop);
772*e4b17023SJohn Marino     }
773*e4b17023SJohn Marino 
774*e4b17023SJohn Marino   if (flag_loop_flatten)
775*e4b17023SJohn Marino     transform_done |= flatten_all_loops (scop);
776*e4b17023SJohn Marino 
777*e4b17023SJohn Marino   /* This feature is only enabled in the Graphite branch.  */
778*e4b17023SJohn Marino   if (0)
779*e4b17023SJohn Marino     {
780*e4b17023SJohn Marino       graphite_file = init_graphite_out_file (file_scop_number);
781*e4b17023SJohn Marino       print_scop (graphite_file, scop, 1);
782*e4b17023SJohn Marino       file_scop_number++;
783*e4b17023SJohn Marino     }
784*e4b17023SJohn Marino 
785*e4b17023SJohn Marino   return transform_done;
786*e4b17023SJohn Marino }
787*e4b17023SJohn Marino 
788*e4b17023SJohn Marino /* Returns true when it PDR1 is a duplicate of PDR2: same PBB, and
789*e4b17023SJohn Marino    their ACCESSES, TYPE, and NB_SUBSCRIPTS are the same.  */
790*e4b17023SJohn Marino 
791*e4b17023SJohn Marino static inline bool
can_collapse_pdrs(poly_dr_p pdr1,poly_dr_p pdr2)792*e4b17023SJohn Marino can_collapse_pdrs (poly_dr_p pdr1, poly_dr_p pdr2)
793*e4b17023SJohn Marino {
794*e4b17023SJohn Marino   bool res;
795*e4b17023SJohn Marino   ppl_Pointset_Powerset_C_Polyhedron_t af1, af2, diff;
796*e4b17023SJohn Marino 
797*e4b17023SJohn Marino   if (PDR_PBB (pdr1) != PDR_PBB (pdr2)
798*e4b17023SJohn Marino       || PDR_NB_SUBSCRIPTS (pdr1) != PDR_NB_SUBSCRIPTS (pdr2)
799*e4b17023SJohn Marino       || PDR_TYPE (pdr1) != PDR_TYPE (pdr2))
800*e4b17023SJohn Marino     return false;
801*e4b17023SJohn Marino 
802*e4b17023SJohn Marino   af1 = PDR_ACCESSES (pdr1);
803*e4b17023SJohn Marino   af2 = PDR_ACCESSES (pdr2);
804*e4b17023SJohn Marino   ppl_new_Pointset_Powerset_C_Polyhedron_from_Pointset_Powerset_C_Polyhedron
805*e4b17023SJohn Marino     (&diff, af1);
806*e4b17023SJohn Marino   ppl_Pointset_Powerset_C_Polyhedron_difference_assign (diff, af2);
807*e4b17023SJohn Marino 
808*e4b17023SJohn Marino   res = ppl_Pointset_Powerset_C_Polyhedron_is_empty (diff);
809*e4b17023SJohn Marino   ppl_delete_Pointset_Powerset_C_Polyhedron (diff);
810*e4b17023SJohn Marino   return res;
811*e4b17023SJohn Marino }
812*e4b17023SJohn Marino 
813*e4b17023SJohn Marino /* Removes duplicated data references in PBB.  */
814*e4b17023SJohn Marino 
815*e4b17023SJohn Marino void
pbb_remove_duplicate_pdrs(poly_bb_p pbb)816*e4b17023SJohn Marino pbb_remove_duplicate_pdrs (poly_bb_p pbb)
817*e4b17023SJohn Marino {
818*e4b17023SJohn Marino   int i, j;
819*e4b17023SJohn Marino   poly_dr_p pdr1, pdr2;
820*e4b17023SJohn Marino 
821*e4b17023SJohn Marino   FOR_EACH_VEC_ELT (poly_dr_p, PBB_DRS (pbb), i, pdr1)
822*e4b17023SJohn Marino     for (j = i + 1; VEC_iterate (poly_dr_p, PBB_DRS (pbb), j, pdr2); j++)
823*e4b17023SJohn Marino       if (can_collapse_pdrs (pdr1, pdr2))
824*e4b17023SJohn Marino 	{
825*e4b17023SJohn Marino 	  PDR_NB_REFS (pdr1) += PDR_NB_REFS (pdr2);
826*e4b17023SJohn Marino 	  free_poly_dr (pdr2);
827*e4b17023SJohn Marino 	  VEC_ordered_remove (poly_dr_p, PBB_DRS (pbb), j);
828*e4b17023SJohn Marino 	}
829*e4b17023SJohn Marino 
830*e4b17023SJohn Marino   PBB_PDR_DUPLICATES_REMOVED (pbb) = true;
831*e4b17023SJohn Marino }
832*e4b17023SJohn Marino 
833*e4b17023SJohn Marino /* Create a new polyhedral data reference and add it to PBB.  It is
834*e4b17023SJohn Marino    defined by its ACCESSES, its TYPE, and the number of subscripts
835*e4b17023SJohn Marino    NB_SUBSCRIPTS.  */
836*e4b17023SJohn Marino 
837*e4b17023SJohn Marino void
new_poly_dr(poly_bb_p pbb,int dr_base_object_set,ppl_Pointset_Powerset_C_Polyhedron_t accesses,enum poly_dr_type type,void * cdr,graphite_dim_t nb_subscripts)838*e4b17023SJohn Marino new_poly_dr (poly_bb_p pbb, int dr_base_object_set,
839*e4b17023SJohn Marino 	     ppl_Pointset_Powerset_C_Polyhedron_t accesses,
840*e4b17023SJohn Marino 	     enum poly_dr_type type, void *cdr, graphite_dim_t nb_subscripts)
841*e4b17023SJohn Marino {
842*e4b17023SJohn Marino   static int id = 0;
843*e4b17023SJohn Marino   poly_dr_p pdr = XNEW (struct poly_dr);
844*e4b17023SJohn Marino 
845*e4b17023SJohn Marino   PDR_ID (pdr) = id++;
846*e4b17023SJohn Marino   PDR_BASE_OBJECT_SET (pdr) = dr_base_object_set;
847*e4b17023SJohn Marino   PDR_NB_REFS (pdr) = 1;
848*e4b17023SJohn Marino   PDR_PBB (pdr) = pbb;
849*e4b17023SJohn Marino   PDR_ACCESSES (pdr) = accesses;
850*e4b17023SJohn Marino   PDR_TYPE (pdr) = type;
851*e4b17023SJohn Marino   PDR_CDR (pdr) = cdr;
852*e4b17023SJohn Marino   PDR_NB_SUBSCRIPTS (pdr) = nb_subscripts;
853*e4b17023SJohn Marino   VEC_safe_push (poly_dr_p, heap, PBB_DRS (pbb), pdr);
854*e4b17023SJohn Marino }
855*e4b17023SJohn Marino 
856*e4b17023SJohn Marino /* Free polyhedral data reference PDR.  */
857*e4b17023SJohn Marino 
858*e4b17023SJohn Marino void
free_poly_dr(poly_dr_p pdr)859*e4b17023SJohn Marino free_poly_dr (poly_dr_p pdr)
860*e4b17023SJohn Marino {
861*e4b17023SJohn Marino   ppl_delete_Pointset_Powerset_C_Polyhedron (PDR_ACCESSES (pdr));
862*e4b17023SJohn Marino   XDELETE (pdr);
863*e4b17023SJohn Marino }
864*e4b17023SJohn Marino 
865*e4b17023SJohn Marino /* Create a new polyhedral black box.  */
866*e4b17023SJohn Marino 
867*e4b17023SJohn Marino poly_bb_p
new_poly_bb(scop_p scop,void * black_box)868*e4b17023SJohn Marino new_poly_bb (scop_p scop, void *black_box)
869*e4b17023SJohn Marino {
870*e4b17023SJohn Marino   poly_bb_p pbb = XNEW (struct poly_bb);
871*e4b17023SJohn Marino 
872*e4b17023SJohn Marino   PBB_DOMAIN (pbb) = NULL;
873*e4b17023SJohn Marino   PBB_SCOP (pbb) = scop;
874*e4b17023SJohn Marino   pbb_set_black_box (pbb, black_box);
875*e4b17023SJohn Marino   PBB_TRANSFORMED (pbb) = NULL;
876*e4b17023SJohn Marino   PBB_SAVED (pbb) = NULL;
877*e4b17023SJohn Marino   PBB_ORIGINAL (pbb) = NULL;
878*e4b17023SJohn Marino   PBB_DRS (pbb) = VEC_alloc (poly_dr_p, heap, 3);
879*e4b17023SJohn Marino   PBB_IS_REDUCTION (pbb) = false;
880*e4b17023SJohn Marino   PBB_PDR_DUPLICATES_REMOVED (pbb) = false;
881*e4b17023SJohn Marino   GBB_PBB ((gimple_bb_p) black_box) = pbb;
882*e4b17023SJohn Marino 
883*e4b17023SJohn Marino   return pbb;
884*e4b17023SJohn Marino }
885*e4b17023SJohn Marino 
886*e4b17023SJohn Marino /* Free polyhedral black box.  */
887*e4b17023SJohn Marino 
888*e4b17023SJohn Marino void
free_poly_bb(poly_bb_p pbb)889*e4b17023SJohn Marino free_poly_bb (poly_bb_p pbb)
890*e4b17023SJohn Marino {
891*e4b17023SJohn Marino   int i;
892*e4b17023SJohn Marino   poly_dr_p pdr;
893*e4b17023SJohn Marino 
894*e4b17023SJohn Marino   ppl_delete_Pointset_Powerset_C_Polyhedron (PBB_DOMAIN (pbb));
895*e4b17023SJohn Marino 
896*e4b17023SJohn Marino   if (PBB_TRANSFORMED (pbb))
897*e4b17023SJohn Marino     poly_scattering_free (PBB_TRANSFORMED (pbb));
898*e4b17023SJohn Marino 
899*e4b17023SJohn Marino   if (PBB_SAVED (pbb))
900*e4b17023SJohn Marino     poly_scattering_free (PBB_SAVED (pbb));
901*e4b17023SJohn Marino 
902*e4b17023SJohn Marino   if (PBB_ORIGINAL (pbb))
903*e4b17023SJohn Marino     poly_scattering_free (PBB_ORIGINAL (pbb));
904*e4b17023SJohn Marino 
905*e4b17023SJohn Marino   if (PBB_DRS (pbb))
906*e4b17023SJohn Marino     FOR_EACH_VEC_ELT (poly_dr_p, PBB_DRS (pbb), i, pdr)
907*e4b17023SJohn Marino       free_poly_dr (pdr);
908*e4b17023SJohn Marino 
909*e4b17023SJohn Marino   VEC_free (poly_dr_p, heap, PBB_DRS (pbb));
910*e4b17023SJohn Marino   XDELETE (pbb);
911*e4b17023SJohn Marino }
912*e4b17023SJohn Marino 
913*e4b17023SJohn Marino static void
print_pdr_access_layout(FILE * file,poly_bb_p pbb,poly_dr_p pdr)914*e4b17023SJohn Marino print_pdr_access_layout (FILE *file, poly_bb_p pbb, poly_dr_p pdr)
915*e4b17023SJohn Marino {
916*e4b17023SJohn Marino   graphite_dim_t i;
917*e4b17023SJohn Marino 
918*e4b17023SJohn Marino   fprintf (file, "#  eq");
919*e4b17023SJohn Marino 
920*e4b17023SJohn Marino   fprintf (file, "   alias");
921*e4b17023SJohn Marino 
922*e4b17023SJohn Marino   for (i = 0; i < PDR_NB_SUBSCRIPTS (pdr); i++)
923*e4b17023SJohn Marino     fprintf (file, "   sub%d", (int) i);
924*e4b17023SJohn Marino 
925*e4b17023SJohn Marino   for (i = 0; i < pbb_dim_iter_domain (pbb); i++)
926*e4b17023SJohn Marino     fprintf (file, "     i%d", (int) i);
927*e4b17023SJohn Marino 
928*e4b17023SJohn Marino   for (i = 0; i < pbb_nb_params (pbb); i++)
929*e4b17023SJohn Marino     fprintf (file, "     p%d", (int) i);
930*e4b17023SJohn Marino 
931*e4b17023SJohn Marino   fprintf (file, "    cst\n");
932*e4b17023SJohn Marino }
933*e4b17023SJohn Marino 
934*e4b17023SJohn Marino /* Prints to FILE the polyhedral data reference PDR, at some VERBOSITY
935*e4b17023SJohn Marino    level.  */
936*e4b17023SJohn Marino 
937*e4b17023SJohn Marino void
print_pdr(FILE * file,poly_dr_p pdr,int verbosity)938*e4b17023SJohn Marino print_pdr (FILE *file, poly_dr_p pdr, int verbosity)
939*e4b17023SJohn Marino {
940*e4b17023SJohn Marino   int alias_set_dim;
941*e4b17023SJohn Marino 
942*e4b17023SJohn Marino   if (verbosity > 1)
943*e4b17023SJohn Marino     {
944*e4b17023SJohn Marino       fprintf (file, "# pdr_%d (", PDR_ID (pdr));
945*e4b17023SJohn Marino 
946*e4b17023SJohn Marino       switch (PDR_TYPE (pdr))
947*e4b17023SJohn Marino 	{
948*e4b17023SJohn Marino 	case PDR_READ:
949*e4b17023SJohn Marino 	  fprintf (file, "read \n");
950*e4b17023SJohn Marino 	  break;
951*e4b17023SJohn Marino 
952*e4b17023SJohn Marino 	case PDR_WRITE:
953*e4b17023SJohn Marino 	  fprintf (file, "write \n");
954*e4b17023SJohn Marino 	  break;
955*e4b17023SJohn Marino 
956*e4b17023SJohn Marino 	case PDR_MAY_WRITE:
957*e4b17023SJohn Marino 	  fprintf (file, "may_write \n");
958*e4b17023SJohn Marino 	  break;
959*e4b17023SJohn Marino 
960*e4b17023SJohn Marino 	default:
961*e4b17023SJohn Marino 	  gcc_unreachable ();
962*e4b17023SJohn Marino 	}
963*e4b17023SJohn Marino 
964*e4b17023SJohn Marino       dump_data_reference (file, (data_reference_p) PDR_CDR (pdr));
965*e4b17023SJohn Marino     }
966*e4b17023SJohn Marino 
967*e4b17023SJohn Marino   if (verbosity > 0)
968*e4b17023SJohn Marino     {
969*e4b17023SJohn Marino       fprintf (file, "# data accesses (\n");
970*e4b17023SJohn Marino       print_pdr_access_layout (file, PDR_PBB (pdr), pdr);
971*e4b17023SJohn Marino     }
972*e4b17023SJohn Marino 
973*e4b17023SJohn Marino   alias_set_dim = pdr_alias_set_dim (pdr) + 1;
974*e4b17023SJohn Marino 
975*e4b17023SJohn Marino   openscop_print_pdr_powerset (file,
976*e4b17023SJohn Marino 			       PDR_ACCESSES (pdr),
977*e4b17023SJohn Marino 			       PDR_NB_SUBSCRIPTS (pdr),
978*e4b17023SJohn Marino 			       alias_set_dim,
979*e4b17023SJohn Marino 			       pbb_nb_params (PDR_PBB (pdr)));
980*e4b17023SJohn Marino 
981*e4b17023SJohn Marino   if (verbosity > 0)
982*e4b17023SJohn Marino     fprintf (file, "#)\n");
983*e4b17023SJohn Marino 
984*e4b17023SJohn Marino   if (verbosity > 1)
985*e4b17023SJohn Marino     fprintf (file, "#)\n");
986*e4b17023SJohn Marino }
987*e4b17023SJohn Marino 
988*e4b17023SJohn Marino /* Prints to STDERR the polyhedral data reference PDR, at some
989*e4b17023SJohn Marino    VERBOSITY level.  */
990*e4b17023SJohn Marino 
991*e4b17023SJohn Marino DEBUG_FUNCTION void
debug_pdr(poly_dr_p pdr,int verbosity)992*e4b17023SJohn Marino debug_pdr (poly_dr_p pdr, int verbosity)
993*e4b17023SJohn Marino {
994*e4b17023SJohn Marino   print_pdr (stderr, pdr, verbosity);
995*e4b17023SJohn Marino }
996*e4b17023SJohn Marino 
997*e4b17023SJohn Marino /* Creates a new SCOP containing REGION.  */
998*e4b17023SJohn Marino 
999*e4b17023SJohn Marino scop_p
new_scop(void * region)1000*e4b17023SJohn Marino new_scop (void *region)
1001*e4b17023SJohn Marino {
1002*e4b17023SJohn Marino   scop_p scop = XNEW (struct scop);
1003*e4b17023SJohn Marino 
1004*e4b17023SJohn Marino   SCOP_CONTEXT (scop) = NULL;
1005*e4b17023SJohn Marino   scop_set_region (scop, region);
1006*e4b17023SJohn Marino   SCOP_BBS (scop) = VEC_alloc (poly_bb_p, heap, 3);
1007*e4b17023SJohn Marino   SCOP_ORIGINAL_PDDRS (scop) = htab_create (10, hash_poly_ddr_p,
1008*e4b17023SJohn Marino 					    eq_poly_ddr_p, free_poly_ddr);
1009*e4b17023SJohn Marino   SCOP_ORIGINAL_SCHEDULE (scop) = NULL;
1010*e4b17023SJohn Marino   SCOP_TRANSFORMED_SCHEDULE (scop) = NULL;
1011*e4b17023SJohn Marino   SCOP_SAVED_SCHEDULE (scop) = NULL;
1012*e4b17023SJohn Marino   POLY_SCOP_P (scop) = false;
1013*e4b17023SJohn Marino 
1014*e4b17023SJohn Marino   return scop;
1015*e4b17023SJohn Marino }
1016*e4b17023SJohn Marino 
1017*e4b17023SJohn Marino /* Deletes SCOP.  */
1018*e4b17023SJohn Marino 
1019*e4b17023SJohn Marino void
free_scop(scop_p scop)1020*e4b17023SJohn Marino free_scop (scop_p scop)
1021*e4b17023SJohn Marino {
1022*e4b17023SJohn Marino   int i;
1023*e4b17023SJohn Marino   poly_bb_p pbb;
1024*e4b17023SJohn Marino 
1025*e4b17023SJohn Marino   FOR_EACH_VEC_ELT (poly_bb_p, SCOP_BBS (scop), i, pbb)
1026*e4b17023SJohn Marino     free_poly_bb (pbb);
1027*e4b17023SJohn Marino 
1028*e4b17023SJohn Marino   VEC_free (poly_bb_p, heap, SCOP_BBS (scop));
1029*e4b17023SJohn Marino 
1030*e4b17023SJohn Marino   if (SCOP_CONTEXT (scop))
1031*e4b17023SJohn Marino     ppl_delete_Pointset_Powerset_C_Polyhedron (SCOP_CONTEXT (scop));
1032*e4b17023SJohn Marino 
1033*e4b17023SJohn Marino   htab_delete (SCOP_ORIGINAL_PDDRS (scop));
1034*e4b17023SJohn Marino   free_lst (SCOP_ORIGINAL_SCHEDULE (scop));
1035*e4b17023SJohn Marino   free_lst (SCOP_TRANSFORMED_SCHEDULE (scop));
1036*e4b17023SJohn Marino   free_lst (SCOP_SAVED_SCHEDULE (scop));
1037*e4b17023SJohn Marino   XDELETE (scop);
1038*e4b17023SJohn Marino }
1039*e4b17023SJohn Marino 
1040*e4b17023SJohn Marino /* Print to FILE the domain of PBB in OpenScop format, at some VERBOSITY
1041*e4b17023SJohn Marino    level.  */
1042*e4b17023SJohn Marino 
1043*e4b17023SJohn Marino static void
openscop_print_pbb_domain(FILE * file,poly_bb_p pbb,int verbosity)1044*e4b17023SJohn Marino openscop_print_pbb_domain (FILE *file, poly_bb_p pbb, int verbosity)
1045*e4b17023SJohn Marino {
1046*e4b17023SJohn Marino   graphite_dim_t i;
1047*e4b17023SJohn Marino   gimple_bb_p gbb = PBB_BLACK_BOX (pbb);
1048*e4b17023SJohn Marino 
1049*e4b17023SJohn Marino   if (!PBB_DOMAIN (pbb))
1050*e4b17023SJohn Marino     return;
1051*e4b17023SJohn Marino 
1052*e4b17023SJohn Marino   if (verbosity > 0)
1053*e4b17023SJohn Marino     {
1054*e4b17023SJohn Marino       fprintf (file, "\n# Iteration domain of bb_%d (\n", GBB_BB (gbb)->index);
1055*e4b17023SJohn Marino       fprintf (file, "#eq");
1056*e4b17023SJohn Marino 
1057*e4b17023SJohn Marino       for (i = 0; i < pbb_dim_iter_domain (pbb); i++)
1058*e4b17023SJohn Marino 	fprintf (file, "     i%d", (int) i);
1059*e4b17023SJohn Marino 
1060*e4b17023SJohn Marino       for (i = 0; i < pbb_nb_params (pbb); i++)
1061*e4b17023SJohn Marino 	fprintf (file, "     p%d", (int) i);
1062*e4b17023SJohn Marino 
1063*e4b17023SJohn Marino       fprintf (file, "    cst\n");
1064*e4b17023SJohn Marino     }
1065*e4b17023SJohn Marino 
1066*e4b17023SJohn Marino   if (PBB_DOMAIN (pbb))
1067*e4b17023SJohn Marino     openscop_print_powerset_matrix (file, PBB_DOMAIN (pbb),
1068*e4b17023SJohn Marino 				    pbb_dim_iter_domain (pbb),
1069*e4b17023SJohn Marino 				    0,
1070*e4b17023SJohn Marino 				    0,
1071*e4b17023SJohn Marino 				    pbb_nb_params (pbb));
1072*e4b17023SJohn Marino   else
1073*e4b17023SJohn Marino     fprintf (file, "0\n");
1074*e4b17023SJohn Marino 
1075*e4b17023SJohn Marino   if (verbosity > 0)
1076*e4b17023SJohn Marino     fprintf (file, "#)\n");
1077*e4b17023SJohn Marino }
1078*e4b17023SJohn Marino 
1079*e4b17023SJohn Marino /* Print to FILE the domain of PBB, at some VERBOSITY level.  */
1080*e4b17023SJohn Marino 
1081*e4b17023SJohn Marino void
print_pbb_domain(FILE * file,poly_bb_p pbb,int verbosity)1082*e4b17023SJohn Marino print_pbb_domain (FILE *file, poly_bb_p pbb, int verbosity)
1083*e4b17023SJohn Marino {
1084*e4b17023SJohn Marino   graphite_dim_t i;
1085*e4b17023SJohn Marino   gimple_bb_p gbb = PBB_BLACK_BOX (pbb);
1086*e4b17023SJohn Marino 
1087*e4b17023SJohn Marino   if (!PBB_DOMAIN (pbb))
1088*e4b17023SJohn Marino     return;
1089*e4b17023SJohn Marino 
1090*e4b17023SJohn Marino   if (verbosity > 0)
1091*e4b17023SJohn Marino     {
1092*e4b17023SJohn Marino       fprintf (file, "# Iteration domain of bb_%d (\n", GBB_BB (gbb)->index);
1093*e4b17023SJohn Marino       fprintf (file, "#  eq");
1094*e4b17023SJohn Marino 
1095*e4b17023SJohn Marino       for (i = 0; i < pbb_dim_iter_domain (pbb); i++)
1096*e4b17023SJohn Marino 	fprintf (file, "     i%d", (int) i);
1097*e4b17023SJohn Marino 
1098*e4b17023SJohn Marino       for (i = 0; i < pbb_nb_params (pbb); i++)
1099*e4b17023SJohn Marino 	fprintf (file, "     p%d", (int) i);
1100*e4b17023SJohn Marino 
1101*e4b17023SJohn Marino       fprintf (file, "    cst\n");
1102*e4b17023SJohn Marino     }
1103*e4b17023SJohn Marino 
1104*e4b17023SJohn Marino   if (PBB_DOMAIN (pbb))
1105*e4b17023SJohn Marino     ppl_print_powerset_matrix (file, PBB_DOMAIN (pbb));
1106*e4b17023SJohn Marino   else
1107*e4b17023SJohn Marino     fprintf (file, "0\n");
1108*e4b17023SJohn Marino 
1109*e4b17023SJohn Marino   if (verbosity > 0)
1110*e4b17023SJohn Marino     fprintf (file, "#)\n");
1111*e4b17023SJohn Marino }
1112*e4b17023SJohn Marino 
1113*e4b17023SJohn Marino /* Dump the cases of a graphite basic block GBB on FILE.  */
1114*e4b17023SJohn Marino 
1115*e4b17023SJohn Marino static void
dump_gbb_cases(FILE * file,gimple_bb_p gbb)1116*e4b17023SJohn Marino dump_gbb_cases (FILE *file, gimple_bb_p gbb)
1117*e4b17023SJohn Marino {
1118*e4b17023SJohn Marino   int i;
1119*e4b17023SJohn Marino   gimple stmt;
1120*e4b17023SJohn Marino   VEC (gimple, heap) *cases;
1121*e4b17023SJohn Marino 
1122*e4b17023SJohn Marino   if (!gbb)
1123*e4b17023SJohn Marino     return;
1124*e4b17023SJohn Marino 
1125*e4b17023SJohn Marino   cases = GBB_CONDITION_CASES (gbb);
1126*e4b17023SJohn Marino   if (VEC_empty (gimple, cases))
1127*e4b17023SJohn Marino     return;
1128*e4b17023SJohn Marino 
1129*e4b17023SJohn Marino   fprintf (file, "# cases bb_%d (\n", GBB_BB (gbb)->index);
1130*e4b17023SJohn Marino 
1131*e4b17023SJohn Marino   FOR_EACH_VEC_ELT (gimple, cases, i, stmt)
1132*e4b17023SJohn Marino     {
1133*e4b17023SJohn Marino       fprintf (file, "# ");
1134*e4b17023SJohn Marino       print_gimple_stmt (file, stmt, 0, 0);
1135*e4b17023SJohn Marino     }
1136*e4b17023SJohn Marino 
1137*e4b17023SJohn Marino   fprintf (file, "#)\n");
1138*e4b17023SJohn Marino }
1139*e4b17023SJohn Marino 
1140*e4b17023SJohn Marino /* Dump conditions of a graphite basic block GBB on FILE.  */
1141*e4b17023SJohn Marino 
1142*e4b17023SJohn Marino static void
dump_gbb_conditions(FILE * file,gimple_bb_p gbb)1143*e4b17023SJohn Marino dump_gbb_conditions (FILE *file, gimple_bb_p gbb)
1144*e4b17023SJohn Marino {
1145*e4b17023SJohn Marino   int i;
1146*e4b17023SJohn Marino   gimple stmt;
1147*e4b17023SJohn Marino   VEC (gimple, heap) *conditions;
1148*e4b17023SJohn Marino 
1149*e4b17023SJohn Marino   if (!gbb)
1150*e4b17023SJohn Marino     return;
1151*e4b17023SJohn Marino 
1152*e4b17023SJohn Marino   conditions = GBB_CONDITIONS (gbb);
1153*e4b17023SJohn Marino   if (VEC_empty (gimple, conditions))
1154*e4b17023SJohn Marino     return;
1155*e4b17023SJohn Marino 
1156*e4b17023SJohn Marino   fprintf (file, "# conditions bb_%d (\n", GBB_BB (gbb)->index);
1157*e4b17023SJohn Marino 
1158*e4b17023SJohn Marino   FOR_EACH_VEC_ELT (gimple, conditions, i, stmt)
1159*e4b17023SJohn Marino     {
1160*e4b17023SJohn Marino       fprintf (file, "# ");
1161*e4b17023SJohn Marino       print_gimple_stmt (file, stmt, 0, 0);
1162*e4b17023SJohn Marino     }
1163*e4b17023SJohn Marino 
1164*e4b17023SJohn Marino   fprintf (file, "#)\n");
1165*e4b17023SJohn Marino }
1166*e4b17023SJohn Marino 
1167*e4b17023SJohn Marino /* Print to FILE all the data references of PBB, at some VERBOSITY
1168*e4b17023SJohn Marino    level.  */
1169*e4b17023SJohn Marino 
1170*e4b17023SJohn Marino void
print_pdrs(FILE * file,poly_bb_p pbb,int verbosity)1171*e4b17023SJohn Marino print_pdrs (FILE *file, poly_bb_p pbb, int verbosity)
1172*e4b17023SJohn Marino {
1173*e4b17023SJohn Marino   int i;
1174*e4b17023SJohn Marino   poly_dr_p pdr;
1175*e4b17023SJohn Marino   int nb_reads = 0;
1176*e4b17023SJohn Marino   int nb_writes = 0;
1177*e4b17023SJohn Marino 
1178*e4b17023SJohn Marino   if (VEC_length (poly_dr_p, PBB_DRS (pbb)) == 0)
1179*e4b17023SJohn Marino     {
1180*e4b17023SJohn Marino       if (verbosity > 0)
1181*e4b17023SJohn Marino 	fprintf (file, "# Access informations are not provided\n");\
1182*e4b17023SJohn Marino       fprintf (file, "0\n");
1183*e4b17023SJohn Marino       return;
1184*e4b17023SJohn Marino     }
1185*e4b17023SJohn Marino 
1186*e4b17023SJohn Marino   if (verbosity > 1)
1187*e4b17023SJohn Marino     fprintf (file, "# Data references (\n");
1188*e4b17023SJohn Marino 
1189*e4b17023SJohn Marino   if (verbosity > 0)
1190*e4b17023SJohn Marino     fprintf (file, "# Access informations are provided\n");
1191*e4b17023SJohn Marino   fprintf (file, "1\n");
1192*e4b17023SJohn Marino 
1193*e4b17023SJohn Marino   FOR_EACH_VEC_ELT (poly_dr_p, PBB_DRS (pbb), i, pdr)
1194*e4b17023SJohn Marino     if (PDR_TYPE (pdr) == PDR_READ)
1195*e4b17023SJohn Marino       nb_reads++;
1196*e4b17023SJohn Marino     else
1197*e4b17023SJohn Marino       nb_writes++;
1198*e4b17023SJohn Marino 
1199*e4b17023SJohn Marino   if (verbosity > 1)
1200*e4b17023SJohn Marino     fprintf (file, "# Read data references (\n");
1201*e4b17023SJohn Marino 
1202*e4b17023SJohn Marino   if (verbosity > 0)
1203*e4b17023SJohn Marino     fprintf (file, "# Read access informations\n");
1204*e4b17023SJohn Marino   fprintf (file, "%d\n", nb_reads);
1205*e4b17023SJohn Marino 
1206*e4b17023SJohn Marino   FOR_EACH_VEC_ELT (poly_dr_p, PBB_DRS (pbb), i, pdr)
1207*e4b17023SJohn Marino     if (PDR_TYPE (pdr) == PDR_READ)
1208*e4b17023SJohn Marino       print_pdr (file, pdr, verbosity);
1209*e4b17023SJohn Marino 
1210*e4b17023SJohn Marino   if (verbosity > 1)
1211*e4b17023SJohn Marino     fprintf (file, "#)\n");
1212*e4b17023SJohn Marino 
1213*e4b17023SJohn Marino   if (verbosity > 1)
1214*e4b17023SJohn Marino     fprintf (file, "# Write data references (\n");
1215*e4b17023SJohn Marino 
1216*e4b17023SJohn Marino   if (verbosity > 0)
1217*e4b17023SJohn Marino     fprintf (file, "# Write access informations\n");
1218*e4b17023SJohn Marino   fprintf (file, "%d\n", nb_writes);
1219*e4b17023SJohn Marino 
1220*e4b17023SJohn Marino   FOR_EACH_VEC_ELT (poly_dr_p, PBB_DRS (pbb), i, pdr)
1221*e4b17023SJohn Marino     if (PDR_TYPE (pdr) != PDR_READ)
1222*e4b17023SJohn Marino       print_pdr (file, pdr, verbosity);
1223*e4b17023SJohn Marino 
1224*e4b17023SJohn Marino   if (verbosity > 1)
1225*e4b17023SJohn Marino     fprintf (file, "#)\n");
1226*e4b17023SJohn Marino 
1227*e4b17023SJohn Marino   if (verbosity > 1)
1228*e4b17023SJohn Marino     fprintf (file, "#)\n");
1229*e4b17023SJohn Marino }
1230*e4b17023SJohn Marino 
1231*e4b17023SJohn Marino /* Print to STDERR all the data references of PBB.  */
1232*e4b17023SJohn Marino 
1233*e4b17023SJohn Marino DEBUG_FUNCTION void
debug_pdrs(poly_bb_p pbb,int verbosity)1234*e4b17023SJohn Marino debug_pdrs (poly_bb_p pbb, int verbosity)
1235*e4b17023SJohn Marino {
1236*e4b17023SJohn Marino   print_pdrs (stderr, pbb, verbosity);
1237*e4b17023SJohn Marino }
1238*e4b17023SJohn Marino 
1239*e4b17023SJohn Marino /* Print to FILE the body of PBB, at some VERBOSITY level.
1240*e4b17023SJohn Marino    If statement_body_provided is false statement body is not printed.  */
1241*e4b17023SJohn Marino 
1242*e4b17023SJohn Marino static void
print_pbb_body(FILE * file,poly_bb_p pbb,int verbosity,bool statement_body_provided)1243*e4b17023SJohn Marino print_pbb_body (FILE *file, poly_bb_p pbb, int verbosity,
1244*e4b17023SJohn Marino 		bool statement_body_provided)
1245*e4b17023SJohn Marino {
1246*e4b17023SJohn Marino   if (verbosity > 1)
1247*e4b17023SJohn Marino     fprintf (file, "# Body (\n");
1248*e4b17023SJohn Marino 
1249*e4b17023SJohn Marino   if (!statement_body_provided)
1250*e4b17023SJohn Marino     {
1251*e4b17023SJohn Marino       if (verbosity > 0)
1252*e4b17023SJohn Marino 	fprintf (file, "# Statement body is not provided\n");
1253*e4b17023SJohn Marino 
1254*e4b17023SJohn Marino       fprintf (file, "0\n");
1255*e4b17023SJohn Marino 
1256*e4b17023SJohn Marino       if (verbosity > 1)
1257*e4b17023SJohn Marino 	fprintf (file, "#)\n");
1258*e4b17023SJohn Marino       return;
1259*e4b17023SJohn Marino     }
1260*e4b17023SJohn Marino 
1261*e4b17023SJohn Marino   if (verbosity > 0)
1262*e4b17023SJohn Marino     fprintf (file, "# Statement body is provided\n");
1263*e4b17023SJohn Marino   fprintf (file, "1\n");
1264*e4b17023SJohn Marino 
1265*e4b17023SJohn Marino   if (verbosity > 0)
1266*e4b17023SJohn Marino     fprintf (file, "# Original iterator names\n# Iterator names are not provided yet.\n");
1267*e4b17023SJohn Marino 
1268*e4b17023SJohn Marino   if (verbosity > 0)
1269*e4b17023SJohn Marino     fprintf (file, "# Statement body\n");
1270*e4b17023SJohn Marino 
1271*e4b17023SJohn Marino   fprintf (file, "{\n");
1272*e4b17023SJohn Marino   dump_bb (pbb_bb (pbb), file, 0);
1273*e4b17023SJohn Marino   fprintf (file, "}\n");
1274*e4b17023SJohn Marino 
1275*e4b17023SJohn Marino   if (verbosity > 1)
1276*e4b17023SJohn Marino     fprintf (file, "#)\n");
1277*e4b17023SJohn Marino }
1278*e4b17023SJohn Marino 
1279*e4b17023SJohn Marino /* Print to FILE the domain and scattering function of PBB, at some
1280*e4b17023SJohn Marino    VERBOSITY level.  */
1281*e4b17023SJohn Marino 
1282*e4b17023SJohn Marino void
print_pbb(FILE * file,poly_bb_p pbb,int verbosity)1283*e4b17023SJohn Marino print_pbb (FILE *file, poly_bb_p pbb, int verbosity)
1284*e4b17023SJohn Marino {
1285*e4b17023SJohn Marino   if (verbosity > 1)
1286*e4b17023SJohn Marino     {
1287*e4b17023SJohn Marino       fprintf (file, "# pbb_%d (\n", pbb_index (pbb));
1288*e4b17023SJohn Marino       dump_gbb_conditions (file, PBB_BLACK_BOX (pbb));
1289*e4b17023SJohn Marino       dump_gbb_cases (file, PBB_BLACK_BOX (pbb));
1290*e4b17023SJohn Marino     }
1291*e4b17023SJohn Marino 
1292*e4b17023SJohn Marino   openscop_print_pbb_domain (file, pbb, verbosity);
1293*e4b17023SJohn Marino   print_scattering_function (file, pbb, verbosity);
1294*e4b17023SJohn Marino   print_pdrs (file, pbb, verbosity);
1295*e4b17023SJohn Marino   print_pbb_body (file, pbb, verbosity, false);
1296*e4b17023SJohn Marino 
1297*e4b17023SJohn Marino   if (verbosity > 1)
1298*e4b17023SJohn Marino     fprintf (file, "#)\n");
1299*e4b17023SJohn Marino }
1300*e4b17023SJohn Marino 
1301*e4b17023SJohn Marino /* Print to FILE the parameters of SCOP, at some VERBOSITY level.  */
1302*e4b17023SJohn Marino 
1303*e4b17023SJohn Marino void
print_scop_params(FILE * file,scop_p scop,int verbosity)1304*e4b17023SJohn Marino print_scop_params (FILE *file, scop_p scop, int verbosity)
1305*e4b17023SJohn Marino {
1306*e4b17023SJohn Marino   int i;
1307*e4b17023SJohn Marino   tree t;
1308*e4b17023SJohn Marino 
1309*e4b17023SJohn Marino   if (verbosity > 1)
1310*e4b17023SJohn Marino     fprintf (file, "# parameters (\n");
1311*e4b17023SJohn Marino 
1312*e4b17023SJohn Marino   if (VEC_length (tree, SESE_PARAMS (SCOP_REGION (scop))))
1313*e4b17023SJohn Marino     {
1314*e4b17023SJohn Marino       if (verbosity > 0)
1315*e4b17023SJohn Marino 	fprintf (file, "# Parameter names are provided\n");
1316*e4b17023SJohn Marino 
1317*e4b17023SJohn Marino       fprintf (file, "1\n");
1318*e4b17023SJohn Marino 
1319*e4b17023SJohn Marino       if (verbosity > 0)
1320*e4b17023SJohn Marino 	fprintf (file, "# Parameter names\n");
1321*e4b17023SJohn Marino     }
1322*e4b17023SJohn Marino   else
1323*e4b17023SJohn Marino     {
1324*e4b17023SJohn Marino       if (verbosity > 0)
1325*e4b17023SJohn Marino 	fprintf (file, "# Parameter names are not provided\n");
1326*e4b17023SJohn Marino       fprintf (file, "0\n");
1327*e4b17023SJohn Marino     }
1328*e4b17023SJohn Marino 
1329*e4b17023SJohn Marino   FOR_EACH_VEC_ELT (tree, SESE_PARAMS (SCOP_REGION (scop)), i, t)
1330*e4b17023SJohn Marino     {
1331*e4b17023SJohn Marino       print_generic_expr (file, t, 0);
1332*e4b17023SJohn Marino       fprintf (file, " ");
1333*e4b17023SJohn Marino     }
1334*e4b17023SJohn Marino 
1335*e4b17023SJohn Marino   fprintf (file, "\n");
1336*e4b17023SJohn Marino 
1337*e4b17023SJohn Marino   if (verbosity > 1)
1338*e4b17023SJohn Marino     fprintf (file, "#)\n");
1339*e4b17023SJohn Marino }
1340*e4b17023SJohn Marino 
1341*e4b17023SJohn Marino /* Print to FILE the context of SCoP in OpenScop format, at some VERBOSITY
1342*e4b17023SJohn Marino    level.  */
1343*e4b17023SJohn Marino 
1344*e4b17023SJohn Marino static void
openscop_print_scop_context(FILE * file,scop_p scop,int verbosity)1345*e4b17023SJohn Marino openscop_print_scop_context (FILE *file, scop_p scop, int verbosity)
1346*e4b17023SJohn Marino {
1347*e4b17023SJohn Marino   graphite_dim_t i;
1348*e4b17023SJohn Marino 
1349*e4b17023SJohn Marino   if (verbosity > 0)
1350*e4b17023SJohn Marino     {
1351*e4b17023SJohn Marino       fprintf (file, "# Context (\n");
1352*e4b17023SJohn Marino       fprintf (file, "#eq");
1353*e4b17023SJohn Marino 
1354*e4b17023SJohn Marino       for (i = 0; i < scop_nb_params (scop); i++)
1355*e4b17023SJohn Marino 	fprintf (file, "     p%d", (int) i);
1356*e4b17023SJohn Marino 
1357*e4b17023SJohn Marino       fprintf (file, "    cst\n");
1358*e4b17023SJohn Marino     }
1359*e4b17023SJohn Marino 
1360*e4b17023SJohn Marino   if (SCOP_CONTEXT (scop))
1361*e4b17023SJohn Marino     openscop_print_powerset_matrix (file, SCOP_CONTEXT (scop), 0, 0, 0,
1362*e4b17023SJohn Marino 				    scop_nb_params (scop));
1363*e4b17023SJohn Marino   else
1364*e4b17023SJohn Marino     fprintf (file, "0 %d 0 0 0 %d\n", (int) scop_nb_params (scop) + 2,
1365*e4b17023SJohn Marino 	     (int) scop_nb_params (scop));
1366*e4b17023SJohn Marino 
1367*e4b17023SJohn Marino   if (verbosity > 0)
1368*e4b17023SJohn Marino     fprintf (file, "# )\n");
1369*e4b17023SJohn Marino }
1370*e4b17023SJohn Marino 
1371*e4b17023SJohn Marino /* Print to FILE the context of SCoP, at some VERBOSITY level.  */
1372*e4b17023SJohn Marino 
1373*e4b17023SJohn Marino void
print_scop_context(FILE * file,scop_p scop,int verbosity)1374*e4b17023SJohn Marino print_scop_context (FILE *file, scop_p scop, int verbosity)
1375*e4b17023SJohn Marino {
1376*e4b17023SJohn Marino   graphite_dim_t i;
1377*e4b17023SJohn Marino 
1378*e4b17023SJohn Marino   if (verbosity > 0)
1379*e4b17023SJohn Marino     {
1380*e4b17023SJohn Marino       fprintf (file, "# Context (\n");
1381*e4b17023SJohn Marino       fprintf (file, "#eq");
1382*e4b17023SJohn Marino 
1383*e4b17023SJohn Marino       for (i = 0; i < scop_nb_params (scop); i++)
1384*e4b17023SJohn Marino 	fprintf (file, "     p%d", (int) i);
1385*e4b17023SJohn Marino 
1386*e4b17023SJohn Marino       fprintf (file, "    cst\n");
1387*e4b17023SJohn Marino     }
1388*e4b17023SJohn Marino 
1389*e4b17023SJohn Marino   if (SCOP_CONTEXT (scop))
1390*e4b17023SJohn Marino     ppl_print_powerset_matrix (file, SCOP_CONTEXT (scop));
1391*e4b17023SJohn Marino   else
1392*e4b17023SJohn Marino     fprintf (file, "0 %d\n", (int) scop_nb_params (scop) + 2);
1393*e4b17023SJohn Marino 
1394*e4b17023SJohn Marino   if (verbosity > 0)
1395*e4b17023SJohn Marino     fprintf (file, "# )\n");
1396*e4b17023SJohn Marino }
1397*e4b17023SJohn Marino 
1398*e4b17023SJohn Marino /* Print to FILE the SCOP, at some VERBOSITY level.  */
1399*e4b17023SJohn Marino 
1400*e4b17023SJohn Marino void
print_scop(FILE * file,scop_p scop,int verbosity)1401*e4b17023SJohn Marino print_scop (FILE *file, scop_p scop, int verbosity)
1402*e4b17023SJohn Marino {
1403*e4b17023SJohn Marino   int i;
1404*e4b17023SJohn Marino   poly_bb_p pbb;
1405*e4b17023SJohn Marino 
1406*e4b17023SJohn Marino   fprintf (file, "SCoP 1\n#(\n");
1407*e4b17023SJohn Marino   fprintf (file, "# Language\nGimple\n");
1408*e4b17023SJohn Marino   openscop_print_scop_context (file, scop, verbosity);
1409*e4b17023SJohn Marino   print_scop_params (file, scop, verbosity);
1410*e4b17023SJohn Marino 
1411*e4b17023SJohn Marino   if (verbosity > 0)
1412*e4b17023SJohn Marino     fprintf (file, "# Number of statements\n");
1413*e4b17023SJohn Marino 
1414*e4b17023SJohn Marino   fprintf (file, "%d\n",VEC_length (poly_bb_p, SCOP_BBS (scop)));
1415*e4b17023SJohn Marino 
1416*e4b17023SJohn Marino   FOR_EACH_VEC_ELT (poly_bb_p, SCOP_BBS (scop), i, pbb)
1417*e4b17023SJohn Marino     print_pbb (file, pbb, verbosity);
1418*e4b17023SJohn Marino 
1419*e4b17023SJohn Marino   if (verbosity > 1)
1420*e4b17023SJohn Marino     {
1421*e4b17023SJohn Marino       fprintf (file, "# original_lst (\n");
1422*e4b17023SJohn Marino       print_lst (file, SCOP_ORIGINAL_SCHEDULE (scop), 0);
1423*e4b17023SJohn Marino       fprintf (file, "\n#)\n");
1424*e4b17023SJohn Marino 
1425*e4b17023SJohn Marino       fprintf (file, "# transformed_lst (\n");
1426*e4b17023SJohn Marino       print_lst (file, SCOP_TRANSFORMED_SCHEDULE (scop), 0);
1427*e4b17023SJohn Marino       fprintf (file, "\n#)\n");
1428*e4b17023SJohn Marino     }
1429*e4b17023SJohn Marino 
1430*e4b17023SJohn Marino   fprintf (file, "#)\n");
1431*e4b17023SJohn Marino }
1432*e4b17023SJohn Marino 
1433*e4b17023SJohn Marino /* Print to FILE the input file that CLooG would expect as input, at
1434*e4b17023SJohn Marino    some VERBOSITY level.  */
1435*e4b17023SJohn Marino 
1436*e4b17023SJohn Marino void
print_cloog(FILE * file,scop_p scop,int verbosity)1437*e4b17023SJohn Marino print_cloog (FILE *file, scop_p scop, int verbosity)
1438*e4b17023SJohn Marino {
1439*e4b17023SJohn Marino   int i;
1440*e4b17023SJohn Marino   poly_bb_p pbb;
1441*e4b17023SJohn Marino 
1442*e4b17023SJohn Marino   fprintf (file, "# SCoP (generated by GCC/Graphite\n");
1443*e4b17023SJohn Marino   if (verbosity > 0)
1444*e4b17023SJohn Marino     fprintf (file, "# CLooG output language\n");
1445*e4b17023SJohn Marino   fprintf (file, "c\n");
1446*e4b17023SJohn Marino 
1447*e4b17023SJohn Marino   print_scop_context (file, scop, verbosity);
1448*e4b17023SJohn Marino   print_scop_params (file, scop, verbosity);
1449*e4b17023SJohn Marino 
1450*e4b17023SJohn Marino   if (verbosity > 0)
1451*e4b17023SJohn Marino     fprintf (file, "# Number of statements\n");
1452*e4b17023SJohn Marino 
1453*e4b17023SJohn Marino   fprintf (file, "%d\n", VEC_length (poly_bb_p, SCOP_BBS (scop)));
1454*e4b17023SJohn Marino 
1455*e4b17023SJohn Marino   FOR_EACH_VEC_ELT (poly_bb_p, SCOP_BBS (scop), i, pbb)
1456*e4b17023SJohn Marino     {
1457*e4b17023SJohn Marino       if (verbosity > 1)
1458*e4b17023SJohn Marino 	fprintf (file, "# pbb_%d (\n", pbb_index (pbb));
1459*e4b17023SJohn Marino 
1460*e4b17023SJohn Marino       print_pbb_domain (file, pbb, verbosity);
1461*e4b17023SJohn Marino       fprintf (file, "0 0 0");
1462*e4b17023SJohn Marino 
1463*e4b17023SJohn Marino       if (verbosity > 0)
1464*e4b17023SJohn Marino 	fprintf (file, "# For future CLooG options.\n");
1465*e4b17023SJohn Marino       else
1466*e4b17023SJohn Marino 	fprintf (file, "\n");
1467*e4b17023SJohn Marino 
1468*e4b17023SJohn Marino       if (verbosity > 1)
1469*e4b17023SJohn Marino 	fprintf (file, "#)\n");
1470*e4b17023SJohn Marino     }
1471*e4b17023SJohn Marino 
1472*e4b17023SJohn Marino   fprintf (file, "0");
1473*e4b17023SJohn Marino   if (verbosity > 0)
1474*e4b17023SJohn Marino     fprintf (file, "# Don't set the iterator names.\n");
1475*e4b17023SJohn Marino   else
1476*e4b17023SJohn Marino     fprintf (file, "\n");
1477*e4b17023SJohn Marino 
1478*e4b17023SJohn Marino   if (verbosity > 0)
1479*e4b17023SJohn Marino     fprintf (file, "# Number of scattering functions\n");
1480*e4b17023SJohn Marino 
1481*e4b17023SJohn Marino   fprintf (file, "%d\n", VEC_length (poly_bb_p, SCOP_BBS (scop)));
1482*e4b17023SJohn Marino   unify_scattering_dimensions (scop);
1483*e4b17023SJohn Marino 
1484*e4b17023SJohn Marino   FOR_EACH_VEC_ELT (poly_bb_p, SCOP_BBS (scop), i, pbb)
1485*e4b17023SJohn Marino     {
1486*e4b17023SJohn Marino       if (!PBB_TRANSFORMED (pbb)
1487*e4b17023SJohn Marino 	  || !(PBB_TRANSFORMED_SCATTERING (pbb)
1488*e4b17023SJohn Marino 	       || PBB_ORIGINAL_SCATTERING (pbb)))
1489*e4b17023SJohn Marino 	continue;
1490*e4b17023SJohn Marino 
1491*e4b17023SJohn Marino       if (verbosity > 1)
1492*e4b17023SJohn Marino 	fprintf (file, "# pbb_%d (\n", pbb_index (pbb));
1493*e4b17023SJohn Marino 
1494*e4b17023SJohn Marino       print_scattering_function_1 (file, pbb, verbosity);
1495*e4b17023SJohn Marino 
1496*e4b17023SJohn Marino       if (verbosity > 1)
1497*e4b17023SJohn Marino 	fprintf (file, "#)\n");
1498*e4b17023SJohn Marino     }
1499*e4b17023SJohn Marino 
1500*e4b17023SJohn Marino   fprintf (file, "0");
1501*e4b17023SJohn Marino   if (verbosity > 0)
1502*e4b17023SJohn Marino     fprintf (file, "# Don't set the scattering dimension names.\n");
1503*e4b17023SJohn Marino   else
1504*e4b17023SJohn Marino     fprintf (file, "\n");
1505*e4b17023SJohn Marino 
1506*e4b17023SJohn Marino   fprintf (file, "#)\n");
1507*e4b17023SJohn Marino }
1508*e4b17023SJohn Marino 
1509*e4b17023SJohn Marino /* Print to STDERR the domain of PBB, at some VERBOSITY level.  */
1510*e4b17023SJohn Marino 
1511*e4b17023SJohn Marino DEBUG_FUNCTION void
debug_pbb_domain(poly_bb_p pbb,int verbosity)1512*e4b17023SJohn Marino debug_pbb_domain (poly_bb_p pbb, int verbosity)
1513*e4b17023SJohn Marino {
1514*e4b17023SJohn Marino   print_pbb_domain (stderr, pbb, verbosity);
1515*e4b17023SJohn Marino }
1516*e4b17023SJohn Marino 
1517*e4b17023SJohn Marino /* Print to FILE the domain and scattering function of PBB, at some
1518*e4b17023SJohn Marino    VERBOSITY level.  */
1519*e4b17023SJohn Marino 
1520*e4b17023SJohn Marino DEBUG_FUNCTION void
debug_pbb(poly_bb_p pbb,int verbosity)1521*e4b17023SJohn Marino debug_pbb (poly_bb_p pbb, int verbosity)
1522*e4b17023SJohn Marino {
1523*e4b17023SJohn Marino   print_pbb (stderr, pbb, verbosity);
1524*e4b17023SJohn Marino }
1525*e4b17023SJohn Marino 
1526*e4b17023SJohn Marino /* Print to STDERR the context of SCOP, at some VERBOSITY level.  */
1527*e4b17023SJohn Marino 
1528*e4b17023SJohn Marino DEBUG_FUNCTION void
debug_scop_context(scop_p scop,int verbosity)1529*e4b17023SJohn Marino debug_scop_context (scop_p scop, int verbosity)
1530*e4b17023SJohn Marino {
1531*e4b17023SJohn Marino   print_scop_context (stderr, scop, verbosity);
1532*e4b17023SJohn Marino }
1533*e4b17023SJohn Marino 
1534*e4b17023SJohn Marino /* Print to STDERR the SCOP, at some VERBOSITY level.  */
1535*e4b17023SJohn Marino 
1536*e4b17023SJohn Marino DEBUG_FUNCTION void
debug_scop(scop_p scop,int verbosity)1537*e4b17023SJohn Marino debug_scop (scop_p scop, int verbosity)
1538*e4b17023SJohn Marino {
1539*e4b17023SJohn Marino   print_scop (stderr, scop, verbosity);
1540*e4b17023SJohn Marino }
1541*e4b17023SJohn Marino 
1542*e4b17023SJohn Marino /* Print to STDERR the SCOP under CLooG format, at some VERBOSITY
1543*e4b17023SJohn Marino    level.  */
1544*e4b17023SJohn Marino 
1545*e4b17023SJohn Marino DEBUG_FUNCTION void
debug_cloog(scop_p scop,int verbosity)1546*e4b17023SJohn Marino debug_cloog (scop_p scop, int verbosity)
1547*e4b17023SJohn Marino {
1548*e4b17023SJohn Marino   print_cloog (stderr, scop, verbosity);
1549*e4b17023SJohn Marino }
1550*e4b17023SJohn Marino 
1551*e4b17023SJohn Marino /* Print to STDERR the parameters of SCOP, at some VERBOSITY
1552*e4b17023SJohn Marino    level.  */
1553*e4b17023SJohn Marino 
1554*e4b17023SJohn Marino DEBUG_FUNCTION void
debug_scop_params(scop_p scop,int verbosity)1555*e4b17023SJohn Marino debug_scop_params (scop_p scop, int verbosity)
1556*e4b17023SJohn Marino {
1557*e4b17023SJohn Marino   print_scop_params (stderr, scop, verbosity);
1558*e4b17023SJohn Marino }
1559*e4b17023SJohn Marino 
1560*e4b17023SJohn Marino 
1561*e4b17023SJohn Marino /* The dimension in the transformed scattering polyhedron of PBB
1562*e4b17023SJohn Marino    containing the scattering iterator for the loop at depth LOOP_DEPTH.  */
1563*e4b17023SJohn Marino 
1564*e4b17023SJohn Marino ppl_dimension_type
psct_scattering_dim_for_loop_depth(poly_bb_p pbb,graphite_dim_t loop_depth)1565*e4b17023SJohn Marino psct_scattering_dim_for_loop_depth (poly_bb_p pbb, graphite_dim_t loop_depth)
1566*e4b17023SJohn Marino {
1567*e4b17023SJohn Marino   ppl_const_Constraint_System_t pcs;
1568*e4b17023SJohn Marino   ppl_Constraint_System_const_iterator_t cit, cend;
1569*e4b17023SJohn Marino   ppl_const_Constraint_t cstr;
1570*e4b17023SJohn Marino   ppl_Polyhedron_t ph = PBB_TRANSFORMED_SCATTERING (pbb);
1571*e4b17023SJohn Marino   ppl_dimension_type iter = psct_iterator_dim (pbb, loop_depth);
1572*e4b17023SJohn Marino   ppl_Linear_Expression_t expr;
1573*e4b17023SJohn Marino   ppl_Coefficient_t coef;
1574*e4b17023SJohn Marino   mpz_t val;
1575*e4b17023SJohn Marino   graphite_dim_t i;
1576*e4b17023SJohn Marino 
1577*e4b17023SJohn Marino   mpz_init (val);
1578*e4b17023SJohn Marino   ppl_new_Coefficient (&coef);
1579*e4b17023SJohn Marino   ppl_Polyhedron_get_constraints (ph, &pcs);
1580*e4b17023SJohn Marino   ppl_new_Constraint_System_const_iterator (&cit);
1581*e4b17023SJohn Marino   ppl_new_Constraint_System_const_iterator (&cend);
1582*e4b17023SJohn Marino 
1583*e4b17023SJohn Marino   for (ppl_Constraint_System_begin (pcs, cit),
1584*e4b17023SJohn Marino 	 ppl_Constraint_System_end (pcs, cend);
1585*e4b17023SJohn Marino        !ppl_Constraint_System_const_iterator_equal_test (cit, cend);
1586*e4b17023SJohn Marino        ppl_Constraint_System_const_iterator_increment (cit))
1587*e4b17023SJohn Marino     {
1588*e4b17023SJohn Marino       ppl_Constraint_System_const_iterator_dereference (cit, &cstr);
1589*e4b17023SJohn Marino       ppl_new_Linear_Expression_from_Constraint (&expr, cstr);
1590*e4b17023SJohn Marino       ppl_Linear_Expression_coefficient (expr, iter, coef);
1591*e4b17023SJohn Marino       ppl_Coefficient_to_mpz_t (coef, val);
1592*e4b17023SJohn Marino 
1593*e4b17023SJohn Marino       if (mpz_sgn (val) == 0)
1594*e4b17023SJohn Marino 	{
1595*e4b17023SJohn Marino 	  ppl_delete_Linear_Expression (expr);
1596*e4b17023SJohn Marino 	  continue;
1597*e4b17023SJohn Marino 	}
1598*e4b17023SJohn Marino 
1599*e4b17023SJohn Marino       for (i = 0; i < pbb_nb_scattering_transform (pbb); i++)
1600*e4b17023SJohn Marino 	{
1601*e4b17023SJohn Marino 	  ppl_dimension_type scatter = psct_scattering_dim (pbb, i);
1602*e4b17023SJohn Marino 
1603*e4b17023SJohn Marino 	  ppl_Linear_Expression_coefficient (expr, scatter, coef);
1604*e4b17023SJohn Marino 	  ppl_Coefficient_to_mpz_t (coef, val);
1605*e4b17023SJohn Marino 
1606*e4b17023SJohn Marino 	  if (mpz_sgn (val) != 0)
1607*e4b17023SJohn Marino 	    {
1608*e4b17023SJohn Marino 	      mpz_clear (val);
1609*e4b17023SJohn Marino 	      ppl_delete_Linear_Expression (expr);
1610*e4b17023SJohn Marino 	      ppl_delete_Coefficient (coef);
1611*e4b17023SJohn Marino 	      ppl_delete_Constraint_System_const_iterator (cit);
1612*e4b17023SJohn Marino 	      ppl_delete_Constraint_System_const_iterator (cend);
1613*e4b17023SJohn Marino 
1614*e4b17023SJohn Marino 	      return scatter;
1615*e4b17023SJohn Marino 	    }
1616*e4b17023SJohn Marino 	}
1617*e4b17023SJohn Marino     }
1618*e4b17023SJohn Marino 
1619*e4b17023SJohn Marino   gcc_unreachable ();
1620*e4b17023SJohn Marino }
1621*e4b17023SJohn Marino 
1622*e4b17023SJohn Marino /* Returns the number of iterations RES of the loop around PBB at
1623*e4b17023SJohn Marino    time(scattering) dimension TIME_DEPTH.  */
1624*e4b17023SJohn Marino 
1625*e4b17023SJohn Marino void
pbb_number_of_iterations_at_time(poly_bb_p pbb,graphite_dim_t time_depth,mpz_t res)1626*e4b17023SJohn Marino pbb_number_of_iterations_at_time (poly_bb_p pbb,
1627*e4b17023SJohn Marino 				  graphite_dim_t time_depth,
1628*e4b17023SJohn Marino 				  mpz_t res)
1629*e4b17023SJohn Marino {
1630*e4b17023SJohn Marino   ppl_Pointset_Powerset_C_Polyhedron_t domain, sctr_lb, sctr_ub;
1631*e4b17023SJohn Marino   ppl_dimension_type domain_dim, sctr_dim;
1632*e4b17023SJohn Marino   graphite_dim_t dim_iter_domain = pbb_dim_iter_domain (pbb);
1633*e4b17023SJohn Marino   ppl_Linear_Expression_t le;
1634*e4b17023SJohn Marino   mpz_t lb, ub, diff, one;
1635*e4b17023SJohn Marino   int i;
1636*e4b17023SJohn Marino 
1637*e4b17023SJohn Marino   ppl_Polyhedron_space_dimension (PBB_TRANSFORMED_SCATTERING (pbb), &sctr_dim);
1638*e4b17023SJohn Marino 
1639*e4b17023SJohn Marino   ppl_new_Pointset_Powerset_C_Polyhedron_from_Pointset_Powerset_C_Polyhedron
1640*e4b17023SJohn Marino     (&domain, PBB_DOMAIN (pbb));
1641*e4b17023SJohn Marino 
1642*e4b17023SJohn Marino   ppl_Pointset_Powerset_C_Polyhedron_space_dimension (domain, &domain_dim);
1643*e4b17023SJohn Marino 
1644*e4b17023SJohn Marino   mpz_init (diff);
1645*e4b17023SJohn Marino   mpz_init (lb);
1646*e4b17023SJohn Marino   mpz_init (ub);
1647*e4b17023SJohn Marino   mpz_init (one);
1648*e4b17023SJohn Marino   mpz_set_si (one, 1);
1649*e4b17023SJohn Marino 
1650*e4b17023SJohn Marino   /* Compute the upper bound on the original iteration domain and add
1651*e4b17023SJohn Marino      that upper bound to the scattering.  */
1652*e4b17023SJohn Marino   ppl_new_Pointset_Powerset_C_Polyhedron_from_C_Polyhedron
1653*e4b17023SJohn Marino     (&sctr_ub, PBB_TRANSFORMED_SCATTERING (pbb));
1654*e4b17023SJohn Marino   for (i = 0; i < (int) dim_iter_domain; i++)
1655*e4b17023SJohn Marino     {
1656*e4b17023SJohn Marino       ppl_Linear_Expression_t eq;
1657*e4b17023SJohn Marino       ppl_Constraint_t pc;
1658*e4b17023SJohn Marino       ppl_Constraint_System_t cs;
1659*e4b17023SJohn Marino       ppl_Polyhedron_t ph;
1660*e4b17023SJohn Marino       ppl_Pointset_Powerset_C_Polyhedron_t pph;
1661*e4b17023SJohn Marino 
1662*e4b17023SJohn Marino       ppl_new_Linear_Expression_with_dimension (&le, domain_dim);
1663*e4b17023SJohn Marino       ppl_set_coef (le, i, 1);
1664*e4b17023SJohn Marino       ppl_min_for_le_pointset (domain, le, lb);
1665*e4b17023SJohn Marino       ppl_max_for_le_pointset (domain, le, ub);
1666*e4b17023SJohn Marino       mpz_sub (diff, ub, lb);
1667*e4b17023SJohn Marino       mpz_add (diff, diff, one);
1668*e4b17023SJohn Marino 
1669*e4b17023SJohn Marino       ppl_new_Linear_Expression_with_dimension (&eq, sctr_dim);
1670*e4b17023SJohn Marino       ppl_set_coef (eq, psct_iterator_dim (pbb, i), -1);
1671*e4b17023SJohn Marino       ppl_set_inhomogeneous_gmp (eq, diff);
1672*e4b17023SJohn Marino 
1673*e4b17023SJohn Marino       ppl_new_Constraint (&pc, eq, PPL_CONSTRAINT_TYPE_EQUAL);
1674*e4b17023SJohn Marino       ppl_new_Constraint_System_from_Constraint (&cs, pc);
1675*e4b17023SJohn Marino       ppl_new_C_Polyhedron_from_Constraint_System (&ph, cs);
1676*e4b17023SJohn Marino       ppl_new_Pointset_Powerset_C_Polyhedron_from_C_Polyhedron (&pph, ph);
1677*e4b17023SJohn Marino       ppl_Pointset_Powerset_C_Polyhedron_intersection_assign (sctr_ub, pph);
1678*e4b17023SJohn Marino 
1679*e4b17023SJohn Marino       ppl_delete_Linear_Expression (le);
1680*e4b17023SJohn Marino       ppl_delete_Linear_Expression (eq);
1681*e4b17023SJohn Marino       ppl_delete_Polyhedron (ph);
1682*e4b17023SJohn Marino       ppl_delete_Pointset_Powerset_C_Polyhedron (pph);
1683*e4b17023SJohn Marino       ppl_delete_Constraint (pc);
1684*e4b17023SJohn Marino       ppl_delete_Constraint_System (cs);
1685*e4b17023SJohn Marino     }
1686*e4b17023SJohn Marino 
1687*e4b17023SJohn Marino   /* Compute the lower bound on the original iteration domain and add
1688*e4b17023SJohn Marino      it to the scattering.  */
1689*e4b17023SJohn Marino   ppl_new_Pointset_Powerset_C_Polyhedron_from_C_Polyhedron
1690*e4b17023SJohn Marino     (&sctr_lb, PBB_TRANSFORMED_SCATTERING (pbb));
1691*e4b17023SJohn Marino   for (i = 0; i < (int) dim_iter_domain; i++)
1692*e4b17023SJohn Marino     {
1693*e4b17023SJohn Marino       ppl_Linear_Expression_t eq;
1694*e4b17023SJohn Marino       ppl_Constraint_t pc;
1695*e4b17023SJohn Marino       ppl_Constraint_System_t cs;
1696*e4b17023SJohn Marino       ppl_Polyhedron_t ph;
1697*e4b17023SJohn Marino       ppl_Pointset_Powerset_C_Polyhedron_t pph;
1698*e4b17023SJohn Marino 
1699*e4b17023SJohn Marino       ppl_new_Linear_Expression_with_dimension (&le, domain_dim);
1700*e4b17023SJohn Marino       ppl_set_coef (le, i, 1);
1701*e4b17023SJohn Marino       ppl_min_for_le_pointset (domain, le, lb);
1702*e4b17023SJohn Marino 
1703*e4b17023SJohn Marino       ppl_new_Linear_Expression_with_dimension (&eq, sctr_dim);
1704*e4b17023SJohn Marino       ppl_set_coef (eq, psct_iterator_dim (pbb, i), -1);
1705*e4b17023SJohn Marino       ppl_set_inhomogeneous_gmp (eq, lb);
1706*e4b17023SJohn Marino 
1707*e4b17023SJohn Marino       ppl_new_Constraint (&pc, eq, PPL_CONSTRAINT_TYPE_EQUAL);
1708*e4b17023SJohn Marino       ppl_new_Constraint_System_from_Constraint (&cs, pc);
1709*e4b17023SJohn Marino       ppl_new_C_Polyhedron_from_Constraint_System (&ph, cs);
1710*e4b17023SJohn Marino       ppl_new_Pointset_Powerset_C_Polyhedron_from_C_Polyhedron (&pph, ph);
1711*e4b17023SJohn Marino       ppl_Pointset_Powerset_C_Polyhedron_intersection_assign (sctr_lb, pph);
1712*e4b17023SJohn Marino 
1713*e4b17023SJohn Marino       ppl_delete_Linear_Expression (le);
1714*e4b17023SJohn Marino       ppl_delete_Linear_Expression (eq);
1715*e4b17023SJohn Marino       ppl_delete_Polyhedron (ph);
1716*e4b17023SJohn Marino       ppl_delete_Pointset_Powerset_C_Polyhedron (pph);
1717*e4b17023SJohn Marino       ppl_delete_Constraint (pc);
1718*e4b17023SJohn Marino       ppl_delete_Constraint_System (cs);
1719*e4b17023SJohn Marino     }
1720*e4b17023SJohn Marino 
1721*e4b17023SJohn Marino   /* Extract the number of iterations.  */
1722*e4b17023SJohn Marino   ppl_new_Linear_Expression_with_dimension (&le, sctr_dim);
1723*e4b17023SJohn Marino   ppl_set_coef (le, time_depth, 1);
1724*e4b17023SJohn Marino   ppl_min_for_le_pointset (sctr_lb, le, lb);
1725*e4b17023SJohn Marino   ppl_max_for_le_pointset (sctr_ub, le, ub);
1726*e4b17023SJohn Marino   mpz_sub (res, ub, lb);
1727*e4b17023SJohn Marino 
1728*e4b17023SJohn Marino   mpz_clear (one);
1729*e4b17023SJohn Marino   mpz_clear (diff);
1730*e4b17023SJohn Marino   mpz_clear (lb);
1731*e4b17023SJohn Marino   mpz_clear (ub);
1732*e4b17023SJohn Marino   ppl_delete_Linear_Expression (le);
1733*e4b17023SJohn Marino   ppl_delete_Pointset_Powerset_C_Polyhedron (sctr_ub);
1734*e4b17023SJohn Marino   ppl_delete_Pointset_Powerset_C_Polyhedron (sctr_lb);
1735*e4b17023SJohn Marino   ppl_delete_Pointset_Powerset_C_Polyhedron (domain);
1736*e4b17023SJohn Marino }
1737*e4b17023SJohn Marino 
1738*e4b17023SJohn Marino /* Translates LOOP to LST.  */
1739*e4b17023SJohn Marino 
1740*e4b17023SJohn Marino static lst_p
loop_to_lst(loop_p loop,VEC (poly_bb_p,heap)* bbs,int * i)1741*e4b17023SJohn Marino loop_to_lst (loop_p loop, VEC (poly_bb_p, heap) *bbs, int *i)
1742*e4b17023SJohn Marino {
1743*e4b17023SJohn Marino   poly_bb_p pbb;
1744*e4b17023SJohn Marino   VEC (lst_p, heap) *seq = VEC_alloc (lst_p, heap, 5);
1745*e4b17023SJohn Marino 
1746*e4b17023SJohn Marino   for (; VEC_iterate (poly_bb_p, bbs, *i, pbb); (*i)++)
1747*e4b17023SJohn Marino     {
1748*e4b17023SJohn Marino       lst_p stmt;
1749*e4b17023SJohn Marino       basic_block bb = GBB_BB (PBB_BLACK_BOX (pbb));
1750*e4b17023SJohn Marino 
1751*e4b17023SJohn Marino       if (bb->loop_father == loop)
1752*e4b17023SJohn Marino 	stmt = new_lst_stmt (pbb);
1753*e4b17023SJohn Marino       else if (flow_bb_inside_loop_p (loop, bb))
1754*e4b17023SJohn Marino 	{
1755*e4b17023SJohn Marino 	  loop_p next = loop->inner;
1756*e4b17023SJohn Marino 
1757*e4b17023SJohn Marino 	  while (next && !flow_bb_inside_loop_p (next, bb))
1758*e4b17023SJohn Marino 	    next = next->next;
1759*e4b17023SJohn Marino 
1760*e4b17023SJohn Marino 	  stmt = loop_to_lst (next, bbs, i);
1761*e4b17023SJohn Marino 	}
1762*e4b17023SJohn Marino       else
1763*e4b17023SJohn Marino 	{
1764*e4b17023SJohn Marino 	  (*i)--;
1765*e4b17023SJohn Marino 	  return new_lst_loop (seq);
1766*e4b17023SJohn Marino 	}
1767*e4b17023SJohn Marino 
1768*e4b17023SJohn Marino       VEC_safe_push (lst_p, heap, seq, stmt);
1769*e4b17023SJohn Marino     }
1770*e4b17023SJohn Marino 
1771*e4b17023SJohn Marino   return new_lst_loop (seq);
1772*e4b17023SJohn Marino }
1773*e4b17023SJohn Marino 
1774*e4b17023SJohn Marino /* Reads the original scattering of the SCOP and returns an LST
1775*e4b17023SJohn Marino    representing it.  */
1776*e4b17023SJohn Marino 
1777*e4b17023SJohn Marino void
scop_to_lst(scop_p scop)1778*e4b17023SJohn Marino scop_to_lst (scop_p scop)
1779*e4b17023SJohn Marino {
1780*e4b17023SJohn Marino   lst_p res;
1781*e4b17023SJohn Marino   int i, n = VEC_length (poly_bb_p, SCOP_BBS (scop));
1782*e4b17023SJohn Marino   VEC (lst_p, heap) *seq = VEC_alloc (lst_p, heap, 5);
1783*e4b17023SJohn Marino   sese region = SCOP_REGION (scop);
1784*e4b17023SJohn Marino 
1785*e4b17023SJohn Marino   for (i = 0; i < n; i++)
1786*e4b17023SJohn Marino     {
1787*e4b17023SJohn Marino       poly_bb_p pbb = VEC_index (poly_bb_p, SCOP_BBS (scop), i);
1788*e4b17023SJohn Marino       loop_p loop = outermost_loop_in_sese (region, GBB_BB (PBB_BLACK_BOX (pbb)));
1789*e4b17023SJohn Marino 
1790*e4b17023SJohn Marino       if (loop_in_sese_p (loop, region))
1791*e4b17023SJohn Marino 	res = loop_to_lst (loop, SCOP_BBS (scop), &i);
1792*e4b17023SJohn Marino       else
1793*e4b17023SJohn Marino 	res = new_lst_stmt (pbb);
1794*e4b17023SJohn Marino 
1795*e4b17023SJohn Marino       VEC_safe_push (lst_p, heap, seq, res);
1796*e4b17023SJohn Marino     }
1797*e4b17023SJohn Marino 
1798*e4b17023SJohn Marino   res = new_lst_loop (seq);
1799*e4b17023SJohn Marino   SCOP_ORIGINAL_SCHEDULE (scop) = res;
1800*e4b17023SJohn Marino   SCOP_TRANSFORMED_SCHEDULE (scop) = copy_lst (res);
1801*e4b17023SJohn Marino }
1802*e4b17023SJohn Marino 
1803*e4b17023SJohn Marino /* Print to FILE on a new line COLUMN white spaces.  */
1804*e4b17023SJohn Marino 
1805*e4b17023SJohn Marino static void
lst_indent_to(FILE * file,int column)1806*e4b17023SJohn Marino lst_indent_to (FILE *file, int column)
1807*e4b17023SJohn Marino {
1808*e4b17023SJohn Marino   int i;
1809*e4b17023SJohn Marino 
1810*e4b17023SJohn Marino   if (column > 0)
1811*e4b17023SJohn Marino     fprintf (file, "\n#");
1812*e4b17023SJohn Marino 
1813*e4b17023SJohn Marino   for (i = 0; i < column; i++)
1814*e4b17023SJohn Marino     fprintf (file, " ");
1815*e4b17023SJohn Marino }
1816*e4b17023SJohn Marino 
1817*e4b17023SJohn Marino /* Print LST to FILE with INDENT spaces of indentation.  */
1818*e4b17023SJohn Marino 
1819*e4b17023SJohn Marino void
print_lst(FILE * file,lst_p lst,int indent)1820*e4b17023SJohn Marino print_lst (FILE *file, lst_p lst, int indent)
1821*e4b17023SJohn Marino {
1822*e4b17023SJohn Marino   if (!lst)
1823*e4b17023SJohn Marino     return;
1824*e4b17023SJohn Marino 
1825*e4b17023SJohn Marino   lst_indent_to (file, indent);
1826*e4b17023SJohn Marino 
1827*e4b17023SJohn Marino   if (LST_LOOP_P (lst))
1828*e4b17023SJohn Marino     {
1829*e4b17023SJohn Marino       int i;
1830*e4b17023SJohn Marino       lst_p l;
1831*e4b17023SJohn Marino 
1832*e4b17023SJohn Marino       if (LST_LOOP_FATHER (lst))
1833*e4b17023SJohn Marino 	fprintf (file, "%d (loop", lst_dewey_number (lst));
1834*e4b17023SJohn Marino       else
1835*e4b17023SJohn Marino 	fprintf (file, "#(root");
1836*e4b17023SJohn Marino 
1837*e4b17023SJohn Marino       FOR_EACH_VEC_ELT (lst_p, LST_SEQ (lst), i, l)
1838*e4b17023SJohn Marino 	print_lst (file, l, indent + 2);
1839*e4b17023SJohn Marino 
1840*e4b17023SJohn Marino       fprintf (file, ")");
1841*e4b17023SJohn Marino     }
1842*e4b17023SJohn Marino   else
1843*e4b17023SJohn Marino     fprintf (file, "%d stmt_%d", lst_dewey_number (lst), pbb_index (LST_PBB (lst)));
1844*e4b17023SJohn Marino }
1845*e4b17023SJohn Marino 
1846*e4b17023SJohn Marino /* Print LST to STDERR.  */
1847*e4b17023SJohn Marino 
1848*e4b17023SJohn Marino DEBUG_FUNCTION void
debug_lst(lst_p lst)1849*e4b17023SJohn Marino debug_lst (lst_p lst)
1850*e4b17023SJohn Marino {
1851*e4b17023SJohn Marino   print_lst (stderr, lst, 0);
1852*e4b17023SJohn Marino }
1853*e4b17023SJohn Marino 
1854*e4b17023SJohn Marino /* Pretty print to FILE the loop statement tree LST in DOT format.  */
1855*e4b17023SJohn Marino 
1856*e4b17023SJohn Marino static void
dot_lst_1(FILE * file,lst_p lst)1857*e4b17023SJohn Marino dot_lst_1 (FILE *file, lst_p lst)
1858*e4b17023SJohn Marino {
1859*e4b17023SJohn Marino   if (!lst)
1860*e4b17023SJohn Marino     return;
1861*e4b17023SJohn Marino 
1862*e4b17023SJohn Marino   if (LST_LOOP_P (lst))
1863*e4b17023SJohn Marino     {
1864*e4b17023SJohn Marino       int i;
1865*e4b17023SJohn Marino       lst_p l;
1866*e4b17023SJohn Marino 
1867*e4b17023SJohn Marino       if (!LST_LOOP_FATHER (lst))
1868*e4b17023SJohn Marino 	fprintf (file, "L -> L_%d_%d\n",
1869*e4b17023SJohn Marino 		 lst_depth (lst),
1870*e4b17023SJohn Marino 		 lst_dewey_number (lst));
1871*e4b17023SJohn Marino       else
1872*e4b17023SJohn Marino 	fprintf (file, "L_%d_%d -> L_%d_%d\n",
1873*e4b17023SJohn Marino 		 lst_depth (LST_LOOP_FATHER (lst)),
1874*e4b17023SJohn Marino 		 lst_dewey_number (LST_LOOP_FATHER (lst)),
1875*e4b17023SJohn Marino 		 lst_depth (lst),
1876*e4b17023SJohn Marino 		 lst_dewey_number (lst));
1877*e4b17023SJohn Marino 
1878*e4b17023SJohn Marino       FOR_EACH_VEC_ELT (lst_p, LST_SEQ (lst), i, l)
1879*e4b17023SJohn Marino 	dot_lst_1 (file, l);
1880*e4b17023SJohn Marino     }
1881*e4b17023SJohn Marino 
1882*e4b17023SJohn Marino   else
1883*e4b17023SJohn Marino     fprintf (file, "L_%d_%d -> S_%d\n",
1884*e4b17023SJohn Marino 	     lst_depth (LST_LOOP_FATHER (lst)),
1885*e4b17023SJohn Marino 	     lst_dewey_number (LST_LOOP_FATHER (lst)),
1886*e4b17023SJohn Marino 	     pbb_index (LST_PBB (lst)));
1887*e4b17023SJohn Marino 
1888*e4b17023SJohn Marino }
1889*e4b17023SJohn Marino 
1890*e4b17023SJohn Marino /* Display the LST using dotty.  */
1891*e4b17023SJohn Marino 
1892*e4b17023SJohn Marino DEBUG_FUNCTION void
dot_lst(lst_p lst)1893*e4b17023SJohn Marino dot_lst (lst_p lst)
1894*e4b17023SJohn Marino {
1895*e4b17023SJohn Marino   /* When debugging, enable the following code.  This cannot be used
1896*e4b17023SJohn Marino      in production compilers because it calls "system".  */
1897*e4b17023SJohn Marino #if 0
1898*e4b17023SJohn Marino   FILE *stream = fopen ("/tmp/lst.dot", "w");
1899*e4b17023SJohn Marino   gcc_assert (stream);
1900*e4b17023SJohn Marino 
1901*e4b17023SJohn Marino   fputs ("digraph all {\n", stream);
1902*e4b17023SJohn Marino   dot_lst_1 (stream, lst);
1903*e4b17023SJohn Marino   fputs ("}\n\n", stream);
1904*e4b17023SJohn Marino   fclose (stream);
1905*e4b17023SJohn Marino 
1906*e4b17023SJohn Marino   system ("dotty /tmp/lst.dot &");
1907*e4b17023SJohn Marino #else
1908*e4b17023SJohn Marino   fputs ("digraph all {\n", stderr);
1909*e4b17023SJohn Marino   dot_lst_1 (stderr, lst);
1910*e4b17023SJohn Marino   fputs ("}\n\n", stderr);
1911*e4b17023SJohn Marino 
1912*e4b17023SJohn Marino #endif
1913*e4b17023SJohn Marino }
1914*e4b17023SJohn Marino 
1915*e4b17023SJohn Marino /* Computes a checksum for the code generated by CLooG for SCOP.  */
1916*e4b17023SJohn Marino 
1917*e4b17023SJohn Marino DEBUG_FUNCTION void
cloog_checksum(scop_p scop ATTRIBUTE_UNUSED)1918*e4b17023SJohn Marino cloog_checksum (scop_p scop ATTRIBUTE_UNUSED)
1919*e4b17023SJohn Marino {
1920*e4b17023SJohn Marino   /* When debugging, enable the following code.  This cannot be used
1921*e4b17023SJohn Marino      in production compilers because it calls "system".  */
1922*e4b17023SJohn Marino #if 0
1923*e4b17023SJohn Marino   FILE *stream = fopen ("/tmp/scop.cloog", "w");
1924*e4b17023SJohn Marino   gcc_assert (stream);
1925*e4b17023SJohn Marino   print_cloog (stream, scop, 0);
1926*e4b17023SJohn Marino   fclose (stream);
1927*e4b17023SJohn Marino 
1928*e4b17023SJohn Marino   fputs ("\n", stdout);
1929*e4b17023SJohn Marino   system ("cloog -compilable 1 /tmp/scop.cloog > /tmp/scop.c ; gcc -O0 -g /tmp/scop.c -lm -o /tmp/scop; /tmp/scop | md5sum ");
1930*e4b17023SJohn Marino #endif
1931*e4b17023SJohn Marino }
1932*e4b17023SJohn Marino 
1933*e4b17023SJohn Marino #endif
1934*e4b17023SJohn Marino 
1935