1 /* Gimple Represented as Polyhedra.
2 Copyright (C) 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
3 Contributed by Sebastian Pop <sebastian.pop@inria.fr>.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 /* This pass converts GIMPLE to GRAPHITE, performs some loop
22 transformations and then converts the resulting representation back
25 An early description of this pass can be found in the GCC Summit'06
26 paper "GRAPHITE: Polyhedral Analyses and Optimizations for GCC".
27 The wiki page http://gcc.gnu.org/wiki/Graphite contains pointers to
30 One important document to read is CLooG's internal manual:
31 http://repo.or.cz/w/cloog-ppl.git?a=blob_plain;f=doc/cloog.texi;hb=HEAD
32 that describes the data structure of loops used in this file, and
33 the functions that are used for transforming the code. */
37 #include "coretypes.h"
42 #include "basic-block.h"
43 #include "diagnostic.h"
44 #include "tree-flow.h"
46 #include "tree-dump.h"
49 #include "tree-chrec.h"
50 #include "tree-data-ref.h"
51 #include "tree-scalar-evolution.h"
52 #include "tree-pass.h"
53 #include "value-prof.h"
54 #include "pointer-set.h"
61 /* The CLooG header file is not -Wc++-compat ready as of 2009-05-11.
62 This #pragma should be removed when it is ready. */
63 #if GCC_VERSION >= 4003
64 #pragma GCC diagnostic warning "-Wc++-compat"
67 #include "cloog/cloog.h"
69 #include "graphite-ppl.h"
71 #include "graphite-poly.h"
72 #include "graphite-scop-detection.h"
73 #include "graphite-clast-to-gimple.h"
74 #include "graphite-sese-to-poly.h"
76 /* Print global statistics to FILE. */
79 print_global_statistics (FILE* file)
84 long n_conditions = 0;
88 long n_p_conditions = 0;
94 gimple_stmt_iterator psi;
99 /* Ignore artificial surrounding loop. */
100 if (bb == bb->loop_father->header
104 n_p_loops += bb->count;
107 if (VEC_length (edge, bb->succs) > 1)
110 n_p_conditions += bb->count;
113 for (psi = gsi_start_bb (bb); !gsi_end_p (psi); gsi_next (&psi))
116 n_p_stmts += bb->count;
120 fprintf (file, "\nGlobal statistics (");
121 fprintf (file, "BBS:%ld, ", n_bbs);
122 fprintf (file, "LOOPS:%ld, ", n_loops);
123 fprintf (file, "CONDITIONS:%ld, ", n_conditions);
124 fprintf (file, "STMTS:%ld)\n", n_stmts);
125 fprintf (file, "\nGlobal profiling statistics (");
126 fprintf (file, "BBS:%ld, ", n_p_bbs);
127 fprintf (file, "LOOPS:%ld, ", n_p_loops);
128 fprintf (file, "CONDITIONS:%ld, ", n_p_conditions);
129 fprintf (file, "STMTS:%ld)\n", n_p_stmts);
132 /* Print statistics for SCOP to FILE. */
135 print_graphite_scop_statistics (FILE* file, scop_p scop)
140 long n_conditions = 0;
144 long n_p_conditions = 0;
150 gimple_stmt_iterator psi;
151 loop_p loop = bb->loop_father;
153 if (!bb_in_sese_p (bb, SCOP_REGION (scop)))
157 n_p_bbs += bb->count;
159 if (VEC_length (edge, bb->succs) > 1)
162 n_p_conditions += bb->count;
165 for (psi = gsi_start_bb (bb); !gsi_end_p (psi); gsi_next (&psi))
168 n_p_stmts += bb->count;
171 if (loop->header == bb && loop_in_sese_p (loop, SCOP_REGION (scop)))
174 n_p_loops += bb->count;
178 fprintf (file, "\nSCoP statistics (");
179 fprintf (file, "BBS:%ld, ", n_bbs);
180 fprintf (file, "LOOPS:%ld, ", n_loops);
181 fprintf (file, "CONDITIONS:%ld, ", n_conditions);
182 fprintf (file, "STMTS:%ld)\n", n_stmts);
183 fprintf (file, "\nSCoP profiling statistics (");
184 fprintf (file, "BBS:%ld, ", n_p_bbs);
185 fprintf (file, "LOOPS:%ld, ", n_p_loops);
186 fprintf (file, "CONDITIONS:%ld, ", n_p_conditions);
187 fprintf (file, "STMTS:%ld)\n", n_p_stmts);
190 /* Print statistics for SCOPS to FILE. */
193 print_graphite_statistics (FILE* file, VEC (scop_p, heap) *scops)
199 for (i = 0; VEC_iterate (scop_p, scops, i, scop); i++)
200 print_graphite_scop_statistics (file, scop);
203 /* Initialize graphite: when there are no loops returns false. */
206 graphite_initialize (void)
208 if (number_of_loops () <= 1)
210 if (dump_file && (dump_flags & TDF_DETAILS))
211 print_global_statistics (dump_file);
216 recompute_all_dominators ();
217 initialize_original_copy_tables ();
220 if (dump_file && dump_flags)
221 dump_function_to_file (current_function_decl, dump_file, dump_flags);
226 /* Finalize graphite: perform CFG cleanup when NEED_CFG_CLEANUP_P is
230 graphite_finalize (bool need_cfg_cleanup_p)
232 if (need_cfg_cleanup_p)
235 profile_status = PROFILE_ABSENT;
236 release_recorded_exits ();
237 tree_estimate_probability ();
241 free_original_copy_tables ();
242 free_aux_in_new_loops ();
244 if (dump_file && dump_flags)
245 print_loops (dump_file, 3);
248 /* Perform a set of linear transforms on the loops of the current
252 graphite_transform_loops (void)
256 bool need_cfg_cleanup_p = false;
257 VEC (scop_p, heap) *scops = NULL;
258 htab_t bb_pbb_mapping;
260 if (!graphite_initialize ())
263 build_scops (&scops);
265 if (dump_file && (dump_flags & TDF_DETAILS))
267 print_graphite_statistics (dump_file, scops);
268 print_global_statistics (dump_file);
271 bb_pbb_mapping = htab_create (10, bb_pbb_map_hash, eq_bb_pbb_map, free);
273 for (i = 0; VEC_iterate (scop_p, scops, i, scop); i++)
275 bool transform_done = false;
277 if (!build_poly_scop (scop))
280 if (apply_poly_transforms (scop))
281 transform_done = gloog (scop, bb_pbb_mapping);
283 check_poly_representation (scop);
288 need_cfg_cleanup_p = true;
292 if (flag_loop_parallelize_all)
293 mark_loops_parallel (bb_pbb_mapping);
295 htab_delete (bb_pbb_mapping);
297 graphite_finalize (need_cfg_cleanup_p);
300 #else /* If Cloog is not available: #ifndef HAVE_cloog. */
303 graphite_transform_loops (void)
305 sorry ("Graphite loop optimizations cannot be used");