re PR bootstrap/40408 (bootstrap boken again!)
[gcc.git] / gcc / graphite.c
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>.
4
5 This file is part of GCC.
6
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)
10 any later version.
11
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.
16
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/>. */
20
21 /* This pass converts GIMPLE to GRAPHITE, performs some loop
22 transformations and then converts the resulting representation back
23 to GIMPLE.
24
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
28 the related work.
29
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. */
34
35 #include "config.h"
36 #include "system.h"
37 #include "coretypes.h"
38 #include "tm.h"
39 #include "ggc.h"
40 #include "tree.h"
41 #include "rtl.h"
42 #include "basic-block.h"
43 #include "diagnostic.h"
44 #include "tree-flow.h"
45 #include "toplev.h"
46 #include "tree-dump.h"
47 #include "timevar.h"
48 #include "cfgloop.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 "domwalk.h"
54 #include "value-prof.h"
55 #include "pointer-set.h"
56 #include "gimple.h"
57
58 #ifdef HAVE_cloog
59
60 /* The CLooG header file is not -Wc++-compat ready as of 2009-05-11.
61 This #pragma should be removed when it is ready. */
62 #if GCC_VERSION >= 4003
63 #pragma GCC diagnostic warning "-Wc++-compat"
64 #endif
65
66 #include "cloog/cloog.h"
67 #include "graphite.h"
68
69 static VEC (scop_p, heap) *current_scops;
70
71 /* Converts a GMP constant V to a tree and returns it. */
72
73 static tree
74 gmp_cst_to_tree (tree type, Value v)
75 {
76 return build_int_cst (type, value_get_si (v));
77 }
78
79 /* Returns true when BB is in REGION. */
80
81 static bool
82 bb_in_sese_p (basic_block bb, sese region)
83 {
84 return pointer_set_contains (SESE_REGION_BBS (region), bb);
85 }
86
87 /* Returns true when LOOP is in the SESE region R. */
88
89 static inline bool
90 loop_in_sese_p (struct loop *loop, sese r)
91 {
92 return (bb_in_sese_p (loop->header, r)
93 && bb_in_sese_p (loop->latch, r));
94 }
95
96 /* For a USE in BB, if BB is outside REGION, mark the USE in the
97 SESE_LIVEIN and SESE_LIVEOUT sets. */
98
99 static void
100 sese_build_livein_liveouts_use (sese region, basic_block bb, tree use)
101 {
102 unsigned ver;
103 basic_block def_bb;
104
105 if (TREE_CODE (use) != SSA_NAME)
106 return;
107
108 ver = SSA_NAME_VERSION (use);
109 def_bb = gimple_bb (SSA_NAME_DEF_STMT (use));
110 if (!def_bb
111 || !bb_in_sese_p (def_bb, region)
112 || bb_in_sese_p (bb, region))
113 return;
114
115 if (!SESE_LIVEIN_VER (region, ver))
116 SESE_LIVEIN_VER (region, ver) = BITMAP_ALLOC (NULL);
117
118 bitmap_set_bit (SESE_LIVEIN_VER (region, ver), bb->index);
119 bitmap_set_bit (SESE_LIVEOUT (region), ver);
120 }
121
122 /* Marks for rewrite all the SSA_NAMES defined in REGION and that are
123 used in BB that is outside of the REGION. */
124
125 static void
126 sese_build_livein_liveouts_bb (sese region, basic_block bb)
127 {
128 gimple_stmt_iterator bsi;
129 edge e;
130 edge_iterator ei;
131 ssa_op_iter iter;
132 tree var;
133
134 FOR_EACH_EDGE (e, ei, bb->succs)
135 for (bsi = gsi_start_phis (e->dest); !gsi_end_p (bsi); gsi_next (&bsi))
136 sese_build_livein_liveouts_use (region, bb,
137 PHI_ARG_DEF_FROM_EDGE (gsi_stmt (bsi), e));
138
139 for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
140 FOR_EACH_SSA_TREE_OPERAND (var, gsi_stmt (bsi), iter, SSA_OP_ALL_USES)
141 sese_build_livein_liveouts_use (region, bb, var);
142 }
143
144 /* Build the SESE_LIVEIN and SESE_LIVEOUT for REGION. */
145
146 void
147 sese_build_livein_liveouts (sese region)
148 {
149 basic_block bb;
150
151 SESE_LIVEOUT (region) = BITMAP_ALLOC (NULL);
152 SESE_NUM_VER (region) = num_ssa_names;
153 SESE_LIVEIN (region) = XCNEWVEC (bitmap, SESE_NUM_VER (region));
154
155 FOR_EACH_BB (bb)
156 sese_build_livein_liveouts_bb (region, bb);
157 }
158
159 /* Register basic blocks belonging to a region in a pointer set. */
160
161 static void
162 register_bb_in_sese (basic_block entry_bb, basic_block exit_bb, sese region)
163 {
164 edge_iterator ei;
165 edge e;
166 basic_block bb = entry_bb;
167
168 FOR_EACH_EDGE (e, ei, bb->succs)
169 {
170 if (!pointer_set_contains (SESE_REGION_BBS (region), e->dest) &&
171 e->dest->index != exit_bb->index)
172 {
173 pointer_set_insert (SESE_REGION_BBS (region), e->dest);
174 register_bb_in_sese (e->dest, exit_bb, region);
175 }
176 }
177 }
178
179 /* Builds a new SESE region from edges ENTRY and EXIT. */
180
181 sese
182 new_sese (edge entry, edge exit)
183 {
184 sese res = XNEW (struct sese_d);
185
186 SESE_ENTRY (res) = entry;
187 SESE_EXIT (res) = exit;
188 SESE_REGION_BBS (res) = pointer_set_create ();
189 register_bb_in_sese (entry->dest, exit->dest, res);
190
191 SESE_LIVEOUT (res) = NULL;
192 SESE_NUM_VER (res) = 0;
193 SESE_LIVEIN (res) = NULL;
194
195 return res;
196 }
197
198 /* Deletes REGION. */
199
200 void
201 free_sese (sese region)
202 {
203 int i;
204
205 for (i = 0; i < SESE_NUM_VER (region); i++)
206 BITMAP_FREE (SESE_LIVEIN_VER (region, i));
207
208 if (SESE_LIVEIN (region))
209 free (SESE_LIVEIN (region));
210
211 if (SESE_LIVEOUT (region))
212 BITMAP_FREE (SESE_LIVEOUT (region));
213
214 pointer_set_destroy (SESE_REGION_BBS (region));
215 XDELETE (region);
216 }
217
218 \f
219
220 /* Debug the list of old induction variables for this SCOP. */
221
222 void
223 debug_oldivs (scop_p scop)
224 {
225 int i;
226 name_tree oldiv;
227
228 fprintf (stderr, "Old IVs:");
229
230 for (i = 0; VEC_iterate (name_tree, SCOP_OLDIVS (scop), i, oldiv); i++)
231 {
232 fprintf (stderr, "(");
233 print_generic_expr (stderr, oldiv->t, 0);
234 fprintf (stderr, ", %s, %d)\n", oldiv->name, oldiv->loop->num);
235 }
236 fprintf (stderr, "\n");
237 }
238
239 /* Debug the loops around basic block GB. */
240
241 void
242 debug_loop_vec (graphite_bb_p gb)
243 {
244 int i;
245 loop_p loop;
246
247 fprintf (stderr, "Loop Vec:");
248
249 for (i = 0; VEC_iterate (loop_p, GBB_LOOPS (gb), i, loop); i++)
250 fprintf (stderr, "%d: %d, ", i, loop ? loop->num : -1);
251
252 fprintf (stderr, "\n");
253 }
254
255 /* Returns true if stack ENTRY is a constant. */
256
257 static bool
258 iv_stack_entry_is_constant (iv_stack_entry *entry)
259 {
260 return entry->kind == iv_stack_entry_const;
261 }
262
263 /* Returns true if stack ENTRY is an induction variable. */
264
265 static bool
266 iv_stack_entry_is_iv (iv_stack_entry *entry)
267 {
268 return entry->kind == iv_stack_entry_iv;
269 }
270
271 /* Push (IV, NAME) on STACK. */
272
273 static void
274 loop_iv_stack_push_iv (loop_iv_stack stack, tree iv, const char *name)
275 {
276 iv_stack_entry *entry = XNEW (iv_stack_entry);
277 name_tree named_iv = XNEW (struct name_tree_d);
278
279 named_iv->t = iv;
280 named_iv->name = name;
281
282 entry->kind = iv_stack_entry_iv;
283 entry->data.iv = named_iv;
284
285 VEC_safe_push (iv_stack_entry_p, heap, *stack, entry);
286 }
287
288 /* Inserts a CONSTANT in STACK at INDEX. */
289
290 static void
291 loop_iv_stack_insert_constant (loop_iv_stack stack, int index,
292 tree constant)
293 {
294 iv_stack_entry *entry = XNEW (iv_stack_entry);
295
296 entry->kind = iv_stack_entry_const;
297 entry->data.constant = constant;
298
299 VEC_safe_insert (iv_stack_entry_p, heap, *stack, index, entry);
300 }
301
302 /* Pops and frees an element out of STACK. */
303
304 static void
305 loop_iv_stack_pop (loop_iv_stack stack)
306 {
307 iv_stack_entry_p entry = VEC_pop (iv_stack_entry_p, *stack);
308
309 free (entry->data.iv);
310 free (entry);
311 }
312
313 /* Get the IV at INDEX in STACK. */
314
315 static tree
316 loop_iv_stack_get_iv (loop_iv_stack stack, int index)
317 {
318 iv_stack_entry_p entry = VEC_index (iv_stack_entry_p, *stack, index);
319 iv_stack_entry_data data = entry->data;
320
321 return iv_stack_entry_is_iv (entry) ? data.iv->t : data.constant;
322 }
323
324 /* Get the IV from its NAME in STACK. */
325
326 static tree
327 loop_iv_stack_get_iv_from_name (loop_iv_stack stack, const char* name)
328 {
329 int i;
330 iv_stack_entry_p entry;
331
332 for (i = 0; VEC_iterate (iv_stack_entry_p, *stack, i, entry); i++)
333 {
334 name_tree iv = entry->data.iv;
335 if (!strcmp (name, iv->name))
336 return iv->t;
337 }
338
339 return NULL;
340 }
341
342 /* Prints on stderr the contents of STACK. */
343
344 void
345 debug_loop_iv_stack (loop_iv_stack stack)
346 {
347 int i;
348 iv_stack_entry_p entry;
349 bool first = true;
350
351 fprintf (stderr, "(");
352
353 for (i = 0; VEC_iterate (iv_stack_entry_p, *stack, i, entry); i++)
354 {
355 if (first)
356 first = false;
357 else
358 fprintf (stderr, " ");
359
360 if (iv_stack_entry_is_iv (entry))
361 {
362 name_tree iv = entry->data.iv;
363 fprintf (stderr, "%s:", iv->name);
364 print_generic_expr (stderr, iv->t, 0);
365 }
366 else
367 {
368 tree constant = entry->data.constant;
369 print_generic_expr (stderr, constant, 0);
370 fprintf (stderr, ":");
371 print_generic_expr (stderr, constant, 0);
372 }
373 }
374
375 fprintf (stderr, ")\n");
376 }
377
378 /* Frees STACK. */
379
380 static void
381 free_loop_iv_stack (loop_iv_stack stack)
382 {
383 int i;
384 iv_stack_entry_p entry;
385
386 for (i = 0; VEC_iterate (iv_stack_entry_p, *stack, i, entry); i++)
387 {
388 free (entry->data.iv);
389 free (entry);
390 }
391
392 VEC_free (iv_stack_entry_p, heap, *stack);
393 }
394
395 \f
396
397 /* Structure containing the mapping between the CLooG's induction
398 variable and the type of the old induction variable. */
399 typedef struct ivtype_map_elt_d
400 {
401 tree type;
402 const char *cloog_iv;
403 } *ivtype_map_elt;
404
405 /* Print to stderr the element ELT. */
406
407 static void
408 debug_ivtype_elt (ivtype_map_elt elt)
409 {
410 fprintf (stderr, "(%s, ", elt->cloog_iv);
411 print_generic_expr (stderr, elt->type, 0);
412 fprintf (stderr, ")\n");
413 }
414
415 /* Helper function for debug_ivtype_map. */
416
417 static int
418 debug_ivtype_map_1 (void **slot, void *s ATTRIBUTE_UNUSED)
419 {
420 struct ivtype_map_elt_d *entry = (struct ivtype_map_elt_d *) *slot;
421 debug_ivtype_elt (entry);
422 return 1;
423 }
424
425 /* Print to stderr all the elements of MAP. */
426
427 void
428 debug_ivtype_map (htab_t map)
429 {
430 htab_traverse (map, debug_ivtype_map_1, NULL);
431 }
432
433 /* Constructs a new SCEV_INFO_STR structure for VAR and INSTANTIATED_BELOW. */
434
435 static inline ivtype_map_elt
436 new_ivtype_map_elt (const char *cloog_iv, tree type)
437 {
438 ivtype_map_elt res;
439
440 res = XNEW (struct ivtype_map_elt_d);
441 res->cloog_iv = cloog_iv;
442 res->type = type;
443
444 return res;
445 }
446
447 /* Computes a hash function for database element ELT. */
448
449 static hashval_t
450 ivtype_map_elt_info (const void *elt)
451 {
452 return htab_hash_pointer (((const struct ivtype_map_elt_d *) elt)->cloog_iv);
453 }
454
455 /* Compares database elements E1 and E2. */
456
457 static int
458 eq_ivtype_map_elts (const void *e1, const void *e2)
459 {
460 const struct ivtype_map_elt_d *elt1 = (const struct ivtype_map_elt_d *) e1;
461 const struct ivtype_map_elt_d *elt2 = (const struct ivtype_map_elt_d *) e2;
462
463 return (elt1->cloog_iv == elt2->cloog_iv);
464 }
465
466 \f
467
468 /* Given a CLOOG_IV, returns the type that it should have in GCC land.
469 If the information is not available, i.e. in the case one of the
470 transforms created the loop, just return integer_type_node. */
471
472 static tree
473 gcc_type_for_cloog_iv (const char *cloog_iv, graphite_bb_p gbb)
474 {
475 struct ivtype_map_elt_d tmp;
476 PTR *slot;
477
478 tmp.cloog_iv = cloog_iv;
479 slot = htab_find_slot (GBB_CLOOG_IV_TYPES (gbb), &tmp, NO_INSERT);
480
481 if (slot && *slot)
482 return ((ivtype_map_elt) *slot)->type;
483
484 return integer_type_node;
485 }
486
487 /* Inserts constants derived from the USER_STMT argument list into the
488 STACK. This is needed to map old ivs to constants when loops have
489 been eliminated. */
490
491 static void
492 loop_iv_stack_patch_for_consts (loop_iv_stack stack,
493 struct clast_user_stmt *user_stmt)
494 {
495 struct clast_stmt *t;
496 int index = 0;
497 CloogStatement *cs = user_stmt->statement;
498 graphite_bb_p gbb = (graphite_bb_p) cloog_statement_usr (cs);
499
500 for (t = user_stmt->substitutions; t; t = t->next)
501 {
502 struct clast_expr *expr = (struct clast_expr *)
503 ((struct clast_assignment *)t)->RHS;
504 struct clast_term *term = (struct clast_term *) expr;
505
506 /* FIXME: What should be done with expr_bin, expr_red? */
507 if (expr->type == expr_term
508 && !term->var)
509 {
510 loop_p loop = gbb_loop_at_index (gbb, index);
511 tree oldiv = oldiv_for_loop (GBB_SCOP (gbb), loop);
512 tree type = oldiv ? TREE_TYPE (oldiv) : integer_type_node;
513 tree value = gmp_cst_to_tree (type, term->val);
514 loop_iv_stack_insert_constant (stack, index, value);
515 }
516 index = index + 1;
517 }
518 }
519
520 /* Removes all constants in the iv STACK. */
521
522 static void
523 loop_iv_stack_remove_constants (loop_iv_stack stack)
524 {
525 int i;
526 iv_stack_entry *entry;
527
528 for (i = 0; VEC_iterate (iv_stack_entry_p, *stack, i, entry);)
529 {
530 if (iv_stack_entry_is_constant (entry))
531 {
532 free (VEC_index (iv_stack_entry_p, *stack, i));
533 VEC_ordered_remove (iv_stack_entry_p, *stack, i);
534 }
535 else
536 i++;
537 }
538 }
539
540 /* Returns a new loop_to_cloog_loop_str structure. */
541
542 static inline struct loop_to_cloog_loop_str *
543 new_loop_to_cloog_loop_str (int loop_num,
544 int loop_position,
545 CloogLoop *cloog_loop)
546 {
547 struct loop_to_cloog_loop_str *result;
548
549 result = XNEW (struct loop_to_cloog_loop_str);
550 result->loop_num = loop_num;
551 result->cloog_loop = cloog_loop;
552 result->loop_position = loop_position;
553
554 return result;
555 }
556
557 /* Hash function for SCOP_LOOP2CLOOG_LOOP hash table. */
558
559 static hashval_t
560 hash_loop_to_cloog_loop (const void *elt)
561 {
562 return ((const struct loop_to_cloog_loop_str *) elt)->loop_num;
563 }
564
565 /* Equality function for SCOP_LOOP2CLOOG_LOOP hash table. */
566
567 static int
568 eq_loop_to_cloog_loop (const void *el1, const void *el2)
569 {
570 const struct loop_to_cloog_loop_str *elt1, *elt2;
571
572 elt1 = (const struct loop_to_cloog_loop_str *) el1;
573 elt2 = (const struct loop_to_cloog_loop_str *) el2;
574 return elt1->loop_num == elt2->loop_num;
575 }
576
577 /* Compares two graphite bbs and returns an integer less than, equal to, or
578 greater than zero if the first argument is considered to be respectively
579 less than, equal to, or greater than the second.
580 We compare using the lexicographic order of the static schedules. */
581
582 static int
583 gbb_compare (const void *p_1, const void *p_2)
584 {
585 const struct graphite_bb *const gbb_1
586 = *(const struct graphite_bb *const*) p_1;
587 const struct graphite_bb *const gbb_2
588 = *(const struct graphite_bb *const*) p_2;
589
590 return lambda_vector_compare (GBB_STATIC_SCHEDULE (gbb_1),
591 gbb_nb_loops (gbb_1) + 1,
592 GBB_STATIC_SCHEDULE (gbb_2),
593 gbb_nb_loops (gbb_2) + 1);
594 }
595
596 /* Sort graphite bbs in SCOP. */
597
598 static void
599 graphite_sort_gbbs (scop_p scop)
600 {
601 VEC (graphite_bb_p, heap) *bbs = SCOP_BBS (scop);
602
603 qsort (VEC_address (graphite_bb_p, bbs),
604 VEC_length (graphite_bb_p, bbs),
605 sizeof (graphite_bb_p), gbb_compare);
606 }
607
608 /* Dump conditions of a graphite basic block GBB on FILE. */
609
610 static void
611 dump_gbb_conditions (FILE *file, graphite_bb_p gbb)
612 {
613 int i;
614 gimple stmt;
615 VEC (gimple, heap) *conditions = GBB_CONDITIONS (gbb);
616
617 if (VEC_empty (gimple, conditions))
618 return;
619
620 fprintf (file, "\tbb %d\t: cond = {", GBB_BB (gbb)->index);
621
622 for (i = 0; VEC_iterate (gimple, conditions, i, stmt); i++)
623 print_gimple_stmt (file, stmt, 0, 0);
624
625 fprintf (file, "}\n");
626 }
627
628 /* Converts the graphite scheduling function into a cloog scattering
629 matrix. This scattering matrix is used to limit the possible cloog
630 output to valid programs in respect to the scheduling function.
631
632 SCATTERING_DIMENSIONS specifies the dimensionality of the scattering
633 matrix. CLooG 0.14.0 and previous versions require, that all scattering
634 functions of one CloogProgram have the same dimensionality, therefore we
635 allow to specify it. (Should be removed in future versions) */
636
637 static CloogMatrix *
638 schedule_to_scattering (graphite_bb_p gb, int scattering_dimensions)
639 {
640 int i;
641 scop_p scop = GBB_SCOP (gb);
642
643 int nb_iterators = gbb_nb_loops (gb);
644
645 /* The cloog scattering matrix consists of these colums:
646 1 col = Eq/Inq,
647 scattering_dimensions cols = Scattering dimensions,
648 nb_iterators cols = bb's iterators,
649 scop_nb_params cols = Parameters,
650 1 col = Constant 1.
651
652 Example:
653
654 scattering_dimensions = 5
655 max_nb_iterators = 2
656 nb_iterators = 1
657 scop_nb_params = 2
658
659 Schedule:
660 ? i
661 4 5
662
663 Scattering Matrix:
664 s1 s2 s3 s4 s5 i p1 p2 1
665 1 0 0 0 0 0 0 0 -4 = 0
666 0 1 0 0 0 -1 0 0 0 = 0
667 0 0 1 0 0 0 0 0 -5 = 0 */
668 int nb_params = scop_nb_params (scop);
669 int nb_cols = 1 + scattering_dimensions + nb_iterators + nb_params + 1;
670 int col_const = nb_cols - 1;
671 int col_iter_offset = 1 + scattering_dimensions;
672
673 CloogMatrix *scat = cloog_matrix_alloc (scattering_dimensions, nb_cols);
674
675 gcc_assert (scattering_dimensions >= nb_iterators * 2 + 1);
676
677 /* Initialize the identity matrix. */
678 for (i = 0; i < scattering_dimensions; i++)
679 value_set_si (scat->p[i][i + 1], 1);
680
681 /* Textual order outside the first loop */
682 value_set_si (scat->p[0][col_const], -GBB_STATIC_SCHEDULE (gb)[0]);
683
684 /* For all surrounding loops. */
685 for (i = 0; i < nb_iterators; i++)
686 {
687 int schedule = GBB_STATIC_SCHEDULE (gb)[i + 1];
688
689 /* Iterations of this loop. */
690 value_set_si (scat->p[2 * i + 1][col_iter_offset + i], -1);
691
692 /* Textual order inside this loop. */
693 value_set_si (scat->p[2 * i + 2][col_const], -schedule);
694 }
695
696 return scat;
697 }
698
699 /* Print the schedules of GB to FILE with INDENT white spaces before.
700 VERBOSITY determines how verbose the code pretty printers are. */
701
702 void
703 print_graphite_bb (FILE *file, graphite_bb_p gb, int indent, int verbosity)
704 {
705 CloogMatrix *scattering;
706 int i;
707 loop_p loop;
708 fprintf (file, "\nGBB (\n");
709
710 print_loops_bb (file, GBB_BB (gb), indent+2, verbosity);
711
712 if (GBB_DOMAIN (gb))
713 {
714 fprintf (file, " (domain: \n");
715 cloog_matrix_print (file, GBB_DOMAIN (gb));
716 fprintf (file, " )\n");
717 }
718
719 if (GBB_STATIC_SCHEDULE (gb))
720 {
721 fprintf (file, " (static schedule: ");
722 print_lambda_vector (file, GBB_STATIC_SCHEDULE (gb),
723 gbb_nb_loops (gb) + 1);
724 fprintf (file, " )\n");
725 }
726
727 if (GBB_LOOPS (gb))
728 {
729 fprintf (file, " (contained loops: \n");
730 for (i = 0; VEC_iterate (loop_p, GBB_LOOPS (gb), i, loop); i++)
731 if (loop == NULL)
732 fprintf (file, " iterator %d => NULL \n", i);
733 else
734 fprintf (file, " iterator %d => loop %d \n", i,
735 loop->num);
736 fprintf (file, " )\n");
737 }
738
739 if (GBB_DATA_REFS (gb))
740 dump_data_references (file, GBB_DATA_REFS (gb));
741
742 if (GBB_CONDITIONS (gb))
743 {
744 fprintf (file, " (conditions: \n");
745 dump_gbb_conditions (file, gb);
746 fprintf (file, " )\n");
747 }
748
749 if (GBB_SCOP (gb)
750 && GBB_STATIC_SCHEDULE (gb))
751 {
752 fprintf (file, " (scattering: \n");
753 scattering = schedule_to_scattering (gb, 2 * gbb_nb_loops (gb) + 1);
754 cloog_matrix_print (file, scattering);
755 cloog_matrix_free (scattering);
756 fprintf (file, " )\n");
757 }
758
759 fprintf (file, ")\n");
760 }
761
762 /* Print to STDERR the schedules of GB with VERBOSITY level. */
763
764 void
765 debug_gbb (graphite_bb_p gb, int verbosity)
766 {
767 print_graphite_bb (stderr, gb, 0, verbosity);
768 }
769
770
771 /* Print SCOP to FILE. VERBOSITY determines how verbose the pretty
772 printers are. */
773
774 static void
775 print_scop (FILE *file, scop_p scop, int verbosity)
776 {
777 if (scop == NULL)
778 return;
779
780 fprintf (file, "\nSCoP_%d_%d (\n",
781 SCOP_ENTRY (scop)->index, SCOP_EXIT (scop)->index);
782
783 fprintf (file, " (cloog: \n");
784 cloog_program_print (file, SCOP_PROG (scop));
785 fprintf (file, " )\n");
786
787 if (SCOP_BBS (scop))
788 {
789 graphite_bb_p gb;
790 int i;
791
792 for (i = 0; VEC_iterate (graphite_bb_p, SCOP_BBS (scop), i, gb); i++)
793 print_graphite_bb (file, gb, 0, verbosity);
794 }
795
796 fprintf (file, ")\n");
797 }
798
799 /* Print all the SCOPs to FILE. VERBOSITY determines how verbose the
800 code pretty printers are. */
801
802 static void
803 print_scops (FILE *file, int verbosity)
804 {
805 int i;
806 scop_p scop;
807
808 for (i = 0; VEC_iterate (scop_p, current_scops, i, scop); i++)
809 print_scop (file, scop, verbosity);
810 }
811
812 /* Debug SCOP. VERBOSITY determines how verbose the code pretty
813 printers are. */
814
815 void
816 debug_scop (scop_p scop, int verbosity)
817 {
818 print_scop (stderr, scop, verbosity);
819 }
820
821 /* Debug all SCOPs from CURRENT_SCOPS. VERBOSITY determines how
822 verbose the code pretty printers are. */
823
824 void
825 debug_scops (int verbosity)
826 {
827 print_scops (stderr, verbosity);
828 }
829
830 /* Pretty print to FILE the SCOP in DOT format. */
831
832 static void
833 dot_scop_1 (FILE *file, scop_p scop)
834 {
835 edge e;
836 edge_iterator ei;
837 basic_block bb;
838 basic_block entry = SCOP_ENTRY (scop);
839 basic_block exit = SCOP_EXIT (scop);
840
841 fprintf (file, "digraph SCoP_%d_%d {\n", entry->index,
842 exit->index);
843
844 FOR_ALL_BB (bb)
845 {
846 if (bb == entry)
847 fprintf (file, "%d [shape=triangle];\n", bb->index);
848
849 if (bb == exit)
850 fprintf (file, "%d [shape=box];\n", bb->index);
851
852 if (bb_in_sese_p (bb, SCOP_REGION (scop)))
853 fprintf (file, "%d [color=red];\n", bb->index);
854
855 FOR_EACH_EDGE (e, ei, bb->succs)
856 fprintf (file, "%d -> %d;\n", bb->index, e->dest->index);
857 }
858
859 fputs ("}\n\n", file);
860 }
861
862 /* Display SCOP using dotty. */
863
864 void
865 dot_scop (scop_p scop)
866 {
867 dot_scop_1 (stderr, scop);
868 }
869
870 /* Pretty print all SCoPs in DOT format and mark them with different colors.
871 If there are not enough colors, paint later SCoPs gray.
872 Special nodes:
873 - "*" after the node number: entry of a SCoP,
874 - "#" after the node number: exit of a SCoP,
875 - "()" entry or exit not part of SCoP. */
876
877 static void
878 dot_all_scops_1 (FILE *file)
879 {
880 basic_block bb;
881 edge e;
882 edge_iterator ei;
883 scop_p scop;
884 const char* color;
885 int i;
886
887 /* Disable debugging while printing graph. */
888 int tmp_dump_flags = dump_flags;
889 dump_flags = 0;
890
891 fprintf (file, "digraph all {\n");
892
893 FOR_ALL_BB (bb)
894 {
895 int part_of_scop = false;
896
897 /* Use HTML for every bb label. So we are able to print bbs
898 which are part of two different SCoPs, with two different
899 background colors. */
900 fprintf (file, "%d [label=<\n <TABLE BORDER=\"0\" CELLBORDER=\"1\" ",
901 bb->index);
902 fprintf (file, "CELLSPACING=\"0\">\n");
903
904 /* Select color for SCoP. */
905 for (i = 0; VEC_iterate (scop_p, current_scops, i, scop); i++)
906 if (bb_in_sese_p (bb, SCOP_REGION (scop))
907 || (SCOP_EXIT (scop) == bb)
908 || (SCOP_ENTRY (scop) == bb))
909 {
910 switch (i % 17)
911 {
912 case 0: /* red */
913 color = "#e41a1c";
914 break;
915 case 1: /* blue */
916 color = "#377eb8";
917 break;
918 case 2: /* green */
919 color = "#4daf4a";
920 break;
921 case 3: /* purple */
922 color = "#984ea3";
923 break;
924 case 4: /* orange */
925 color = "#ff7f00";
926 break;
927 case 5: /* yellow */
928 color = "#ffff33";
929 break;
930 case 6: /* brown */
931 color = "#a65628";
932 break;
933 case 7: /* rose */
934 color = "#f781bf";
935 break;
936 case 8:
937 color = "#8dd3c7";
938 break;
939 case 9:
940 color = "#ffffb3";
941 break;
942 case 10:
943 color = "#bebada";
944 break;
945 case 11:
946 color = "#fb8072";
947 break;
948 case 12:
949 color = "#80b1d3";
950 break;
951 case 13:
952 color = "#fdb462";
953 break;
954 case 14:
955 color = "#b3de69";
956 break;
957 case 15:
958 color = "#fccde5";
959 break;
960 case 16:
961 color = "#bc80bd";
962 break;
963 default: /* gray */
964 color = "#999999";
965 }
966
967 fprintf (file, " <TR><TD WIDTH=\"50\" BGCOLOR=\"%s\">", color);
968
969 if (!bb_in_sese_p (bb, SCOP_REGION (scop)))
970 fprintf (file, " (");
971
972 if (bb == SCOP_ENTRY (scop)
973 && bb == SCOP_EXIT (scop))
974 fprintf (file, " %d*# ", bb->index);
975 else if (bb == SCOP_ENTRY (scop))
976 fprintf (file, " %d* ", bb->index);
977 else if (bb == SCOP_EXIT (scop))
978 fprintf (file, " %d# ", bb->index);
979 else
980 fprintf (file, " %d ", bb->index);
981
982 if (!bb_in_sese_p (bb, SCOP_REGION (scop)))
983 fprintf (file, ")");
984
985 fprintf (file, "</TD></TR>\n");
986 part_of_scop = true;
987 }
988
989 if (!part_of_scop)
990 {
991 fprintf (file, " <TR><TD WIDTH=\"50\" BGCOLOR=\"#ffffff\">");
992 fprintf (file, " %d </TD></TR>\n", bb->index);
993 }
994
995 fprintf (file, " </TABLE>>, shape=box, style=\"setlinewidth(0)\"]\n");
996 }
997
998 FOR_ALL_BB (bb)
999 {
1000 FOR_EACH_EDGE (e, ei, bb->succs)
1001 fprintf (file, "%d -> %d;\n", bb->index, e->dest->index);
1002 }
1003
1004 fputs ("}\n\n", file);
1005
1006 /* Enable debugging again. */
1007 dump_flags = tmp_dump_flags;
1008 }
1009
1010 /* Display all SCoPs using dotty. */
1011
1012 void
1013 dot_all_scops (void)
1014 {
1015 /* When debugging, enable the following code. This cannot be used
1016 in production compilers because it calls "system". */
1017 #if 0
1018 FILE *stream = fopen ("/tmp/allscops.dot", "w");
1019 gcc_assert (stream);
1020
1021 dot_all_scops_1 (stream);
1022 fclose (stream);
1023
1024 system ("dotty /tmp/allscops.dot");
1025 #else
1026 dot_all_scops_1 (stderr);
1027 #endif
1028 }
1029
1030 /* Returns the outermost loop in SCOP that contains BB. */
1031
1032 static struct loop *
1033 outermost_loop_in_scop (scop_p scop, basic_block bb)
1034 {
1035 struct loop *nest;
1036
1037 nest = bb->loop_father;
1038 while (loop_outer (nest)
1039 && loop_in_sese_p (loop_outer (nest), SCOP_REGION (scop)))
1040 nest = loop_outer (nest);
1041
1042 return nest;
1043 }
1044
1045 /* Returns the block preceding the entry of SCOP. */
1046
1047 static basic_block
1048 block_before_scop (scop_p scop)
1049 {
1050 return SESE_ENTRY (SCOP_REGION (scop))->src;
1051 }
1052
1053 /* Return true when EXPR is an affine function in LOOP with parameters
1054 instantiated relative to SCOP_ENTRY. */
1055
1056 static bool
1057 loop_affine_expr (basic_block scop_entry, struct loop *loop, tree expr)
1058 {
1059 int n = loop->num;
1060 tree scev = analyze_scalar_evolution (loop, expr);
1061
1062 scev = instantiate_scev (scop_entry, loop, scev);
1063
1064 return (evolution_function_is_invariant_p (scev, n)
1065 || evolution_function_is_affine_multivariate_p (scev, n));
1066 }
1067
1068 /* Return true if REF or any of its subtrees contains a
1069 component_ref. */
1070
1071 static bool
1072 contains_component_ref_p (tree ref)
1073 {
1074 if (!ref)
1075 return false;
1076
1077 while (handled_component_p (ref))
1078 {
1079 if (TREE_CODE (ref) == COMPONENT_REF)
1080 return true;
1081
1082 ref = TREE_OPERAND (ref, 0);
1083 }
1084
1085 return false;
1086 }
1087
1088 /* Return true if the operand OP is simple. */
1089
1090 static bool
1091 is_simple_operand (loop_p loop, gimple stmt, tree op)
1092 {
1093 /* It is not a simple operand when it is a declaration, */
1094 if (DECL_P (op)
1095 /* or a structure, */
1096 || AGGREGATE_TYPE_P (TREE_TYPE (op))
1097 /* or a COMPONENT_REF, */
1098 || contains_component_ref_p (op)
1099 /* or a memory access that cannot be analyzed by the data
1100 reference analysis. */
1101 || ((handled_component_p (op) || INDIRECT_REF_P (op))
1102 && !stmt_simple_memref_p (loop, stmt, op)))
1103 return false;
1104
1105 return true;
1106 }
1107
1108 /* Return true only when STMT is simple enough for being handled by
1109 Graphite. This depends on SCOP_ENTRY, as the parametetrs are
1110 initialized relatively to this basic block. */
1111
1112 static bool
1113 stmt_simple_for_scop_p (basic_block scop_entry, gimple stmt)
1114 {
1115 basic_block bb = gimple_bb (stmt);
1116 struct loop *loop = bb->loop_father;
1117
1118 /* GIMPLE_ASM and GIMPLE_CALL may embed arbitrary side effects.
1119 Calls have side-effects, except those to const or pure
1120 functions. */
1121 if (gimple_has_volatile_ops (stmt)
1122 || (gimple_code (stmt) == GIMPLE_CALL
1123 && !(gimple_call_flags (stmt) & (ECF_CONST | ECF_PURE)))
1124 || (gimple_code (stmt) == GIMPLE_ASM))
1125 return false;
1126
1127 switch (gimple_code (stmt))
1128 {
1129 case GIMPLE_RETURN:
1130 case GIMPLE_LABEL:
1131 return true;
1132
1133 case GIMPLE_COND:
1134 {
1135 tree op;
1136 ssa_op_iter op_iter;
1137 enum tree_code code = gimple_cond_code (stmt);
1138
1139 /* We can only handle this kind of conditional expressions.
1140 For inequalities like "if (i != 3 * k)" we need unions of
1141 polyhedrons. Expressions like "if (a)" or "if (a == 15)" need
1142 them for the else branch. */
1143 if (!(code == LT_EXPR
1144 || code == GT_EXPR
1145 || code == LE_EXPR
1146 || code == GE_EXPR))
1147 return false;
1148
1149 if (!scop_entry)
1150 return false;
1151
1152 FOR_EACH_SSA_TREE_OPERAND (op, stmt, op_iter, SSA_OP_ALL_USES)
1153 if (!loop_affine_expr (scop_entry, loop, op))
1154 return false;
1155
1156 return true;
1157 }
1158
1159 case GIMPLE_ASSIGN:
1160 {
1161 enum tree_code code = gimple_assign_rhs_code (stmt);
1162
1163 switch (get_gimple_rhs_class (code))
1164 {
1165 case GIMPLE_UNARY_RHS:
1166 case GIMPLE_SINGLE_RHS:
1167 return (is_simple_operand (loop, stmt, gimple_assign_lhs (stmt))
1168 && is_simple_operand (loop, stmt, gimple_assign_rhs1 (stmt)));
1169
1170 case GIMPLE_BINARY_RHS:
1171 return (is_simple_operand (loop, stmt, gimple_assign_lhs (stmt))
1172 && is_simple_operand (loop, stmt, gimple_assign_rhs1 (stmt))
1173 && is_simple_operand (loop, stmt, gimple_assign_rhs2 (stmt)));
1174
1175 case GIMPLE_INVALID_RHS:
1176 default:
1177 gcc_unreachable ();
1178 }
1179 }
1180
1181 case GIMPLE_CALL:
1182 {
1183 size_t i;
1184 size_t n = gimple_call_num_args (stmt);
1185 tree lhs = gimple_call_lhs (stmt);
1186
1187 if (lhs && !is_simple_operand (loop, stmt, lhs))
1188 return false;
1189
1190 for (i = 0; i < n; i++)
1191 if (!is_simple_operand (loop, stmt, gimple_call_arg (stmt, i)))
1192 return false;
1193
1194 return true;
1195 }
1196
1197 default:
1198 /* These nodes cut a new scope. */
1199 return false;
1200 }
1201
1202 return false;
1203 }
1204
1205 /* Returns the statement of BB that contains a harmful operation: that
1206 can be a function call with side effects, the induction variables
1207 are not linear with respect to SCOP_ENTRY, etc. The current open
1208 scop should end before this statement. */
1209
1210 static gimple
1211 harmful_stmt_in_bb (basic_block scop_entry, basic_block bb)
1212 {
1213 gimple_stmt_iterator gsi;
1214 gimple stmt;
1215
1216 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1217 if (!stmt_simple_for_scop_p (scop_entry, gsi_stmt (gsi)))
1218 return gsi_stmt (gsi);
1219
1220 stmt = last_stmt (bb);
1221 if (stmt && gimple_code (stmt) == GIMPLE_COND)
1222 {
1223 tree lhs = gimple_cond_lhs (stmt);
1224 tree rhs = gimple_cond_rhs (stmt);
1225
1226 if (TREE_CODE (TREE_TYPE (lhs)) == REAL_TYPE
1227 || TREE_CODE (TREE_TYPE (rhs)) == REAL_TYPE)
1228 return stmt;
1229 }
1230
1231 return NULL;
1232 }
1233
1234 /* Returns true when BB will be represented in graphite. Return false
1235 for the basic blocks that contain code eliminated in the code
1236 generation pass: i.e. induction variables and exit conditions. */
1237
1238 static bool
1239 graphite_stmt_p (scop_p scop, basic_block bb,
1240 VEC (data_reference_p, heap) *drs)
1241 {
1242 gimple_stmt_iterator gsi;
1243 loop_p loop = bb->loop_father;
1244
1245 if (VEC_length (data_reference_p, drs) > 0)
1246 return true;
1247
1248 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1249 {
1250 gimple stmt = gsi_stmt (gsi);
1251
1252 switch (gimple_code (stmt))
1253 {
1254 /* Control flow expressions can be ignored, as they are
1255 represented in the iteration domains and will be
1256 regenerated by graphite. */
1257 case GIMPLE_COND:
1258 case GIMPLE_GOTO:
1259 case GIMPLE_SWITCH:
1260 break;
1261
1262 case GIMPLE_ASSIGN:
1263 {
1264 tree var = gimple_assign_lhs (stmt);
1265 var = analyze_scalar_evolution (loop, var);
1266 var = instantiate_scev (block_before_scop (scop), loop, var);
1267
1268 if (chrec_contains_undetermined (var))
1269 return true;
1270
1271 break;
1272 }
1273
1274 default:
1275 return true;
1276 }
1277 }
1278
1279 return false;
1280 }
1281
1282 /* Store the GRAPHITE representation of BB. */
1283
1284 static void
1285 new_graphite_bb (scop_p scop, basic_block bb)
1286 {
1287 struct graphite_bb *gbb;
1288 VEC (data_reference_p, heap) *drs = VEC_alloc (data_reference_p, heap, 5);
1289 struct loop *nest = outermost_loop_in_scop (scop, bb);
1290 gimple_stmt_iterator gsi;
1291
1292 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1293 find_data_references_in_stmt (nest, gsi_stmt (gsi), &drs);
1294
1295 if (!graphite_stmt_p (scop, bb, drs))
1296 {
1297 free_data_refs (drs);
1298 return;
1299 }
1300
1301 gbb = XNEW (struct graphite_bb);
1302 bb->aux = gbb;
1303 GBB_BB (gbb) = bb;
1304 GBB_SCOP (gbb) = scop;
1305 GBB_DATA_REFS (gbb) = drs;
1306 GBB_DOMAIN (gbb) = NULL;
1307 GBB_CONDITIONS (gbb) = NULL;
1308 GBB_CONDITION_CASES (gbb) = NULL;
1309 GBB_LOOPS (gbb) = NULL;
1310 GBB_STATIC_SCHEDULE (gbb) = NULL;
1311 GBB_CLOOG_IV_TYPES (gbb) = NULL;
1312 VEC_safe_push (graphite_bb_p, heap, SCOP_BBS (scop), gbb);
1313 }
1314
1315 /* Frees GBB. */
1316
1317 static void
1318 free_graphite_bb (struct graphite_bb *gbb)
1319 {
1320 if (GBB_DOMAIN (gbb))
1321 cloog_matrix_free (GBB_DOMAIN (gbb));
1322
1323 if (GBB_CLOOG_IV_TYPES (gbb))
1324 htab_delete (GBB_CLOOG_IV_TYPES (gbb));
1325
1326 /* FIXME: free_data_refs is disabled for the moment, but should be
1327 enabled.
1328
1329 free_data_refs (GBB_DATA_REFS (gbb)); */
1330
1331 VEC_free (gimple, heap, GBB_CONDITIONS (gbb));
1332 VEC_free (gimple, heap, GBB_CONDITION_CASES (gbb));
1333 VEC_free (loop_p, heap, GBB_LOOPS (gbb));
1334 GBB_BB (gbb)->aux = 0;
1335 XDELETE (gbb);
1336 }
1337
1338 \f
1339
1340 /* Structure containing the mapping between the old names and the new
1341 names used after block copy in the new loop context. */
1342 typedef struct rename_map_elt_d
1343 {
1344 tree old_name, new_name;
1345 } *rename_map_elt;
1346
1347
1348 /* Print to stderr the element ELT. */
1349
1350 static void
1351 debug_rename_elt (rename_map_elt elt)
1352 {
1353 fprintf (stderr, "(");
1354 print_generic_expr (stderr, elt->old_name, 0);
1355 fprintf (stderr, ", ");
1356 print_generic_expr (stderr, elt->new_name, 0);
1357 fprintf (stderr, ")\n");
1358 }
1359
1360 /* Helper function for debug_rename_map. */
1361
1362 static int
1363 debug_rename_map_1 (void **slot, void *s ATTRIBUTE_UNUSED)
1364 {
1365 struct rename_map_elt_d *entry = (struct rename_map_elt_d *) *slot;
1366 debug_rename_elt (entry);
1367 return 1;
1368 }
1369
1370 /* Print to stderr all the elements of MAP. */
1371
1372 void
1373 debug_rename_map (htab_t map)
1374 {
1375 htab_traverse (map, debug_rename_map_1, NULL);
1376 }
1377
1378 /* Constructs a new SCEV_INFO_STR structure for VAR and INSTANTIATED_BELOW. */
1379
1380 static inline rename_map_elt
1381 new_rename_map_elt (tree old_name, tree new_name)
1382 {
1383 rename_map_elt res;
1384
1385 res = XNEW (struct rename_map_elt_d);
1386 res->old_name = old_name;
1387 res->new_name = new_name;
1388
1389 return res;
1390 }
1391
1392 /* Computes a hash function for database element ELT. */
1393
1394 static hashval_t
1395 rename_map_elt_info (const void *elt)
1396 {
1397 return htab_hash_pointer (((const struct rename_map_elt_d *) elt)->old_name);
1398 }
1399
1400 /* Compares database elements E1 and E2. */
1401
1402 static int
1403 eq_rename_map_elts (const void *e1, const void *e2)
1404 {
1405 const struct rename_map_elt_d *elt1 = (const struct rename_map_elt_d *) e1;
1406 const struct rename_map_elt_d *elt2 = (const struct rename_map_elt_d *) e2;
1407
1408 return (elt1->old_name == elt2->old_name);
1409 }
1410
1411 /* Returns the new name associated to OLD_NAME in MAP. */
1412
1413 static tree
1414 get_new_name_from_old_name (htab_t map, tree old_name)
1415 {
1416 struct rename_map_elt_d tmp;
1417 PTR *slot;
1418
1419 tmp.old_name = old_name;
1420 slot = htab_find_slot (map, &tmp, NO_INSERT);
1421
1422 if (slot && *slot)
1423 return ((rename_map_elt) *slot)->new_name;
1424
1425 return old_name;
1426 }
1427
1428 \f
1429
1430 /* Creates a new scop starting with ENTRY. */
1431
1432 static scop_p
1433 new_scop (edge entry, edge exit)
1434 {
1435 scop_p scop = XNEW (struct scop);
1436
1437 gcc_assert (entry && exit);
1438
1439 SCOP_REGION (scop) = new_sese (entry, exit);
1440 SCOP_BBS (scop) = VEC_alloc (graphite_bb_p, heap, 3);
1441 SCOP_OLDIVS (scop) = VEC_alloc (name_tree, heap, 3);
1442 SCOP_LOOPS (scop) = BITMAP_ALLOC (NULL);
1443 SCOP_LOOP_NEST (scop) = VEC_alloc (loop_p, heap, 3);
1444 SCOP_ADD_PARAMS (scop) = true;
1445 SCOP_PARAMS (scop) = VEC_alloc (name_tree, heap, 3);
1446 SCOP_PROG (scop) = cloog_program_malloc ();
1447 cloog_program_set_names (SCOP_PROG (scop), cloog_names_malloc ());
1448 SCOP_LOOP2CLOOG_LOOP (scop) = htab_create (10, hash_loop_to_cloog_loop,
1449 eq_loop_to_cloog_loop,
1450 free);
1451 SCOP_LIVEOUT_RENAMES (scop) = htab_create (10, rename_map_elt_info,
1452 eq_rename_map_elts, free);
1453 return scop;
1454 }
1455
1456 /* Deletes SCOP. */
1457
1458 static void
1459 free_scop (scop_p scop)
1460 {
1461 int i;
1462 name_tree p;
1463 struct graphite_bb *gb;
1464 name_tree iv;
1465
1466 for (i = 0; VEC_iterate (graphite_bb_p, SCOP_BBS (scop), i, gb); i++)
1467 free_graphite_bb (gb);
1468
1469 VEC_free (graphite_bb_p, heap, SCOP_BBS (scop));
1470 BITMAP_FREE (SCOP_LOOPS (scop));
1471 VEC_free (loop_p, heap, SCOP_LOOP_NEST (scop));
1472
1473 for (i = 0; VEC_iterate (name_tree, SCOP_OLDIVS (scop), i, iv); i++)
1474 free (iv);
1475 VEC_free (name_tree, heap, SCOP_OLDIVS (scop));
1476
1477 for (i = 0; VEC_iterate (name_tree, SCOP_PARAMS (scop), i, p); i++)
1478 free (p);
1479
1480 VEC_free (name_tree, heap, SCOP_PARAMS (scop));
1481 cloog_program_free (SCOP_PROG (scop));
1482 htab_delete (SCOP_LOOP2CLOOG_LOOP (scop));
1483 htab_delete (SCOP_LIVEOUT_RENAMES (scop));
1484 free_sese (SCOP_REGION (scop));
1485 XDELETE (scop);
1486 }
1487
1488 /* Deletes all scops in SCOPS. */
1489
1490 static void
1491 free_scops (VEC (scop_p, heap) *scops)
1492 {
1493 int i;
1494 scop_p scop;
1495
1496 for (i = 0; VEC_iterate (scop_p, scops, i, scop); i++)
1497 free_scop (scop);
1498
1499 VEC_free (scop_p, heap, scops);
1500 }
1501
1502 typedef enum gbb_type {
1503 GBB_UNKNOWN,
1504 GBB_LOOP_SING_EXIT_HEADER,
1505 GBB_LOOP_MULT_EXIT_HEADER,
1506 GBB_LOOP_EXIT,
1507 GBB_COND_HEADER,
1508 GBB_SIMPLE,
1509 GBB_LAST
1510 } gbb_type;
1511
1512 /* Detect the type of BB. Loop headers are only marked, if they are
1513 new. This means their loop_father is different to LAST_LOOP.
1514 Otherwise they are treated like any other bb and their type can be
1515 any other type. */
1516
1517 static gbb_type
1518 get_bb_type (basic_block bb, struct loop *last_loop)
1519 {
1520 VEC (basic_block, heap) *dom;
1521 int nb_dom, nb_suc;
1522 struct loop *loop = bb->loop_father;
1523
1524 /* Check, if we entry into a new loop. */
1525 if (loop != last_loop)
1526 {
1527 if (single_exit (loop) != NULL)
1528 return GBB_LOOP_SING_EXIT_HEADER;
1529 else if (loop->num != 0)
1530 return GBB_LOOP_MULT_EXIT_HEADER;
1531 else
1532 return GBB_COND_HEADER;
1533 }
1534
1535 dom = get_dominated_by (CDI_DOMINATORS, bb);
1536 nb_dom = VEC_length (basic_block, dom);
1537 VEC_free (basic_block, heap, dom);
1538
1539 if (nb_dom == 0)
1540 return GBB_LAST;
1541
1542 nb_suc = VEC_length (edge, bb->succs);
1543
1544 if (nb_dom == 1 && nb_suc == 1)
1545 return GBB_SIMPLE;
1546
1547 return GBB_COND_HEADER;
1548 }
1549
1550 /* A SCoP detection region, defined using bbs as borders.
1551 All control flow touching this region, comes in passing basic_block ENTRY and
1552 leaves passing basic_block EXIT. By using bbs instead of edges for the
1553 borders we are able to represent also regions that do not have a single
1554 entry or exit edge.
1555 But as they have a single entry basic_block and a single exit basic_block, we
1556 are able to generate for every sd_region a single entry and exit edge.
1557
1558 1 2
1559 \ /
1560 3 <- entry
1561 |
1562 4
1563 / \ This region contains: {3, 4, 5, 6, 7, 8}
1564 5 6
1565 | |
1566 7 8
1567 \ /
1568 9 <- exit */
1569
1570
1571 typedef struct sd_region_p
1572 {
1573 /* The entry bb dominates all bbs in the sd_region. It is part of the
1574 region. */
1575 basic_block entry;
1576
1577 /* The exit bb postdominates all bbs in the sd_region, but is not
1578 part of the region. */
1579 basic_block exit;
1580 } sd_region;
1581
1582 DEF_VEC_O(sd_region);
1583 DEF_VEC_ALLOC_O(sd_region, heap);
1584
1585
1586 /* Moves the scops from SOURCE to TARGET and clean up SOURCE. */
1587
1588 static void
1589 move_sd_regions (VEC (sd_region, heap) **source, VEC (sd_region, heap) **target)
1590 {
1591 sd_region *s;
1592 int i;
1593
1594 for (i = 0; VEC_iterate (sd_region, *source, i, s); i++)
1595 VEC_safe_push (sd_region, heap, *target, s);
1596
1597 VEC_free (sd_region, heap, *source);
1598 }
1599
1600 /* Return true when it is not possible to represent the upper bound of
1601 LOOP in the polyhedral representation. */
1602
1603 static bool
1604 graphite_cannot_represent_loop_niter (loop_p loop)
1605 {
1606 tree niter = number_of_latch_executions (loop);
1607
1608 return chrec_contains_undetermined (niter)
1609 || !scev_is_linear_expression (niter);
1610 }
1611 /* Store information needed by scopdet_* functions. */
1612
1613 struct scopdet_info
1614 {
1615 /* Where the last open scop would stop if the current BB is harmful. */
1616 basic_block last;
1617
1618 /* Where the next scop would start if the current BB is harmful. */
1619 basic_block next;
1620
1621 /* The bb or one of its children contains open loop exits. That means
1622 loop exit nodes that are not surrounded by a loop dominated by bb. */
1623 bool exits;
1624
1625 /* The bb or one of its children contains only structures we can handle. */
1626 bool difficult;
1627 };
1628
1629
1630 static struct scopdet_info build_scops_1 (basic_block, VEC (sd_region, heap) **,
1631 loop_p);
1632
1633 /* Calculates BB infos. If bb is difficult we add valid SCoPs dominated by BB
1634 to SCOPS. TYPE is the gbb_type of BB. */
1635
1636 static struct scopdet_info
1637 scopdet_basic_block_info (basic_block bb, VEC (sd_region, heap) **scops,
1638 gbb_type type)
1639 {
1640 struct loop *loop = bb->loop_father;
1641 struct scopdet_info result;
1642 gimple stmt;
1643
1644 /* XXX: ENTRY_BLOCK_PTR could be optimized in later steps. */
1645 stmt = harmful_stmt_in_bb (ENTRY_BLOCK_PTR, bb);
1646 result.difficult = (stmt != NULL);
1647 result.last = NULL;
1648
1649 switch (type)
1650 {
1651 case GBB_LAST:
1652 result.next = NULL;
1653 result.exits = false;
1654 result.last = bb;
1655
1656 /* Mark bbs terminating a SESE region difficult, if they start
1657 a condition. */
1658 if (VEC_length (edge, bb->succs) > 1)
1659 result.difficult = true;
1660
1661 break;
1662
1663 case GBB_SIMPLE:
1664 result.next = single_succ (bb);
1665 result.exits = false;
1666 result.last = bb;
1667 break;
1668
1669 case GBB_LOOP_SING_EXIT_HEADER:
1670 {
1671 VEC (sd_region, heap) *tmp_scops = VEC_alloc (sd_region, heap,3);
1672 struct scopdet_info sinfo;
1673
1674 sinfo = build_scops_1 (bb, &tmp_scops, loop);
1675
1676 result.last = single_exit (bb->loop_father)->src;
1677 result.next = single_exit (bb->loop_father)->dest;
1678
1679 /* If we do not dominate result.next, remove it. It's either
1680 the EXIT_BLOCK_PTR, or another bb dominates it and will
1681 call the scop detection for this bb. */
1682 if (!dominated_by_p (CDI_DOMINATORS, result.next, bb))
1683 result.next = NULL;
1684
1685 if (result.last->loop_father != loop)
1686 result.next = NULL;
1687
1688 if (graphite_cannot_represent_loop_niter (loop))
1689 result.difficult = true;
1690
1691 if (sinfo.difficult)
1692 move_sd_regions (&tmp_scops, scops);
1693 else
1694 VEC_free (sd_region, heap, tmp_scops);
1695
1696 result.exits = false;
1697 result.difficult |= sinfo.difficult;
1698 break;
1699 }
1700
1701 case GBB_LOOP_MULT_EXIT_HEADER:
1702 {
1703 /* XXX: For now we just do not join loops with multiple exits. If the
1704 exits lead to the same bb it may be possible to join the loop. */
1705 VEC (sd_region, heap) *tmp_scops = VEC_alloc (sd_region, heap, 3);
1706 VEC (edge, heap) *exits = get_loop_exit_edges (loop);
1707 edge e;
1708 int i;
1709 build_scops_1 (bb, &tmp_scops, loop);
1710
1711 /* Scan the code dominated by this loop. This means all bbs, that are
1712 are dominated by a bb in this loop, but are not part of this loop.
1713
1714 The easiest case:
1715 - The loop exit destination is dominated by the exit sources.
1716
1717 TODO: We miss here the more complex cases:
1718 - The exit destinations are dominated by another bb inside the
1719 loop.
1720 - The loop dominates bbs, that are not exit destinations. */
1721 for (i = 0; VEC_iterate (edge, exits, i, e); i++)
1722 if (e->src->loop_father == loop
1723 && dominated_by_p (CDI_DOMINATORS, e->dest, e->src))
1724 {
1725 /* Pass loop_outer to recognize e->dest as loop header in
1726 build_scops_1. */
1727 if (e->dest->loop_father->header == e->dest)
1728 build_scops_1 (e->dest, &tmp_scops,
1729 loop_outer (e->dest->loop_father));
1730 else
1731 build_scops_1 (e->dest, &tmp_scops, e->dest->loop_father);
1732 }
1733
1734 result.next = NULL;
1735 result.last = NULL;
1736 result.difficult = true;
1737 result.exits = false;
1738 move_sd_regions (&tmp_scops, scops);
1739 VEC_free (edge, heap, exits);
1740 break;
1741 }
1742 case GBB_COND_HEADER:
1743 {
1744 VEC (sd_region, heap) *tmp_scops = VEC_alloc (sd_region, heap, 3);
1745 struct scopdet_info sinfo;
1746 VEC (basic_block, heap) *dominated;
1747 int i;
1748 basic_block dom_bb;
1749 basic_block last_bb = NULL;
1750 edge e;
1751 result.exits = false;
1752
1753 /* First check the successors of BB, and check if it is possible to join
1754 the different branches. */
1755 for (i = 0; VEC_iterate (edge, bb->succs, i, e); i++)
1756 {
1757 /* Ignore loop exits. They will be handled after the loop body. */
1758 if (is_loop_exit (loop, e->dest))
1759 {
1760 result.exits = true;
1761 continue;
1762 }
1763
1764 /* Do not follow edges that lead to the end of the
1765 conditions block. For example, in
1766
1767 | 0
1768 | /|\
1769 | 1 2 |
1770 | | | |
1771 | 3 4 |
1772 | \|/
1773 | 6
1774
1775 the edge from 0 => 6. Only check if all paths lead to
1776 the same node 6. */
1777
1778 if (!single_pred_p (e->dest))
1779 {
1780 /* Check, if edge leads directly to the end of this
1781 condition. */
1782 if (!last_bb)
1783 {
1784 last_bb = e->dest;
1785 }
1786
1787 if (e->dest != last_bb)
1788 result.difficult = true;
1789
1790 continue;
1791 }
1792
1793 if (!dominated_by_p (CDI_DOMINATORS, e->dest, bb))
1794 {
1795 result.difficult = true;
1796 continue;
1797 }
1798
1799 sinfo = build_scops_1 (e->dest, &tmp_scops, loop);
1800
1801 result.exits |= sinfo.exits;
1802 result.last = sinfo.last;
1803 result.difficult |= sinfo.difficult;
1804
1805 /* Checks, if all branches end at the same point.
1806 If that is true, the condition stays joinable.
1807 Have a look at the example above. */
1808 if (sinfo.last && single_succ_p (sinfo.last))
1809 {
1810 basic_block next_tmp = single_succ (sinfo.last);
1811
1812 if (!last_bb)
1813 last_bb = next_tmp;
1814
1815 if (next_tmp != last_bb)
1816 result.difficult = true;
1817 }
1818 else
1819 result.difficult = true;
1820 }
1821
1822 /* If the condition is joinable. */
1823 if (!result.exits && !result.difficult)
1824 {
1825 /* Only return a next pointer if we dominate this pointer.
1826 Otherwise it will be handled by the bb dominating it. */
1827 if (dominated_by_p (CDI_DOMINATORS, last_bb, bb) && last_bb != bb)
1828 result.next = last_bb;
1829 else
1830 result.next = NULL;
1831
1832 VEC_free (sd_region, heap, tmp_scops);
1833 break;
1834 }
1835
1836 /* Scan remaining bbs dominated by BB. */
1837 dominated = get_dominated_by (CDI_DOMINATORS, bb);
1838
1839 for (i = 0; VEC_iterate (basic_block, dominated, i, dom_bb); i++)
1840 {
1841 /* Ignore loop exits: they will be handled after the loop body. */
1842 if (loop_depth (find_common_loop (loop, dom_bb->loop_father))
1843 < loop_depth (loop))
1844 {
1845 result.exits = true;
1846 continue;
1847 }
1848
1849 /* Ignore the bbs processed above. */
1850 if (single_pred_p (dom_bb) && single_pred (dom_bb) == bb)
1851 continue;
1852
1853 if (loop_depth (loop) > loop_depth (dom_bb->loop_father))
1854 sinfo = build_scops_1 (dom_bb, &tmp_scops, loop_outer (loop));
1855 else
1856 sinfo = build_scops_1 (dom_bb, &tmp_scops, loop);
1857
1858
1859 result.exits |= sinfo.exits;
1860 result.difficult = true;
1861 result.last = NULL;
1862 }
1863
1864 VEC_free (basic_block, heap, dominated);
1865
1866 result.next = NULL;
1867 move_sd_regions (&tmp_scops, scops);
1868
1869 break;
1870 }
1871
1872 default:
1873 gcc_unreachable ();
1874 }
1875
1876 return result;
1877 }
1878
1879 /* Creates the SCoPs and writes entry and exit points for every SCoP. */
1880
1881 static struct scopdet_info
1882 build_scops_1 (basic_block current, VEC (sd_region, heap) **scops, loop_p loop)
1883 {
1884 bool in_scop = false;
1885 sd_region open_scop;
1886 struct scopdet_info sinfo;
1887
1888 /* Initialize result. */
1889 struct scopdet_info result;
1890 result.exits = false;
1891 result.difficult = false;
1892 result.next = NULL;
1893 result.last = NULL;
1894 open_scop.entry = NULL;
1895 open_scop.exit = NULL;
1896 sinfo.last = NULL;
1897
1898 /* Loop over the dominance tree. If we meet a difficult bb, close
1899 the current SCoP. Loop and condition header start a new layer,
1900 and can only be added if all bbs in deeper layers are simple. */
1901 while (current != NULL)
1902 {
1903 sinfo = scopdet_basic_block_info (current, scops, get_bb_type (current,
1904 loop));
1905
1906 if (!in_scop && !(sinfo.exits || sinfo.difficult))
1907 {
1908 open_scop.entry = current;
1909 open_scop.exit = NULL;
1910 in_scop = true;
1911 }
1912 else if (in_scop && (sinfo.exits || sinfo.difficult))
1913 {
1914 open_scop.exit = current;
1915 VEC_safe_push (sd_region, heap, *scops, &open_scop);
1916 in_scop = false;
1917 }
1918
1919 result.difficult |= sinfo.difficult;
1920 result.exits |= sinfo.exits;
1921
1922 current = sinfo.next;
1923 }
1924
1925 /* Try to close open_scop, if we are still in an open SCoP. */
1926 if (in_scop)
1927 {
1928 int i;
1929 edge e;
1930
1931 for (i = 0; VEC_iterate (edge, sinfo.last->succs, i, e); i++)
1932 if (dominated_by_p (CDI_POST_DOMINATORS, sinfo.last, e->dest))
1933 open_scop.exit = e->dest;
1934
1935 if (!open_scop.exit && open_scop.entry != sinfo.last)
1936 open_scop.exit = sinfo.last;
1937
1938 if (open_scop.exit)
1939 VEC_safe_push (sd_region, heap, *scops, &open_scop);
1940
1941 }
1942
1943 result.last = sinfo.last;
1944 return result;
1945 }
1946
1947 /* Checks if a bb is contained in REGION. */
1948
1949 static bool
1950 bb_in_sd_region (basic_block bb, sd_region *region)
1951 {
1952 return dominated_by_p (CDI_DOMINATORS, bb, region->entry)
1953 && !(dominated_by_p (CDI_DOMINATORS, bb, region->exit)
1954 && !dominated_by_p (CDI_DOMINATORS, region->entry,
1955 region->exit));
1956 }
1957
1958 /* Returns the single entry edge of REGION, if it does not exits NULL. */
1959
1960 static edge
1961 find_single_entry_edge (sd_region *region)
1962 {
1963 edge e;
1964 edge_iterator ei;
1965 edge entry = NULL;
1966
1967 FOR_EACH_EDGE (e, ei, region->entry->preds)
1968 if (!bb_in_sd_region (e->src, region))
1969 {
1970 if (entry)
1971 {
1972 entry = NULL;
1973 break;
1974 }
1975
1976 else
1977 entry = e;
1978 }
1979
1980 return entry;
1981 }
1982
1983 /* Returns the single exit edge of REGION, if it does not exits NULL. */
1984
1985 static edge
1986 find_single_exit_edge (sd_region *region)
1987 {
1988 edge e;
1989 edge_iterator ei;
1990 edge exit = NULL;
1991
1992 FOR_EACH_EDGE (e, ei, region->exit->preds)
1993 if (bb_in_sd_region (e->src, region))
1994 {
1995 if (exit)
1996 {
1997 exit = NULL;
1998 break;
1999 }
2000
2001 else
2002 exit = e;
2003 }
2004
2005 return exit;
2006 }
2007
2008 /* Create a single entry edge for REGION. */
2009
2010 static void
2011 create_single_entry_edge (sd_region *region)
2012 {
2013 if (find_single_entry_edge (region))
2014 return;
2015
2016 /* There are multiple predecessors for bb_3
2017
2018 | 1 2
2019 | | /
2020 | |/
2021 | 3 <- entry
2022 | |\
2023 | | |
2024 | 4 ^
2025 | | |
2026 | |/
2027 | 5
2028
2029 There are two edges (1->3, 2->3), that point from outside into the region,
2030 and another one (5->3), a loop latch, lead to bb_3.
2031
2032 We split bb_3.
2033
2034 | 1 2
2035 | | /
2036 | |/
2037 |3.0
2038 | |\ (3.0 -> 3.1) = single entry edge
2039 |3.1 | <- entry
2040 | | |
2041 | | |
2042 | 4 ^
2043 | | |
2044 | |/
2045 | 5
2046
2047 If the loop is part of the SCoP, we have to redirect the loop latches.
2048
2049 | 1 2
2050 | | /
2051 | |/
2052 |3.0
2053 | | (3.0 -> 3.1) = entry edge
2054 |3.1 <- entry
2055 | |\
2056 | | |
2057 | 4 ^
2058 | | |
2059 | |/
2060 | 5 */
2061
2062 if (region->entry->loop_father->header != region->entry
2063 || dominated_by_p (CDI_DOMINATORS,
2064 loop_latch_edge (region->entry->loop_father)->src,
2065 region->exit))
2066 {
2067 edge forwarder = split_block_after_labels (region->entry);
2068 region->entry = forwarder->dest;
2069 }
2070 else
2071 /* This case is never executed, as the loop headers seem always to have a
2072 single edge pointing from outside into the loop. */
2073 gcc_unreachable ();
2074
2075 #ifdef ENABLE_CHECKING
2076 gcc_assert (find_single_entry_edge (region));
2077 #endif
2078 }
2079
2080 /* Check if the sd_region, mentioned in EDGE, has no exit bb. */
2081
2082 static bool
2083 sd_region_without_exit (edge e)
2084 {
2085 sd_region *r = (sd_region *) e->aux;
2086
2087 if (r)
2088 return r->exit == NULL;
2089 else
2090 return false;
2091 }
2092
2093 /* Create a single exit edge for REGION. */
2094
2095 static void
2096 create_single_exit_edge (sd_region *region)
2097 {
2098 edge e;
2099 edge_iterator ei;
2100 edge forwarder = NULL;
2101 basic_block exit;
2102
2103 if (find_single_exit_edge (region))
2104 return;
2105
2106 /* We create a forwarder bb (5) for all edges leaving this region
2107 (3->5, 4->5). All other edges leading to the same bb, are moved
2108 to a new bb (6). If these edges where part of another region (2->5)
2109 we update the region->exit pointer, of this region.
2110
2111 To identify which edge belongs to which region we depend on the e->aux
2112 pointer in every edge. It points to the region of the edge or to NULL,
2113 if the edge is not part of any region.
2114
2115 1 2 3 4 1->5 no region, 2->5 region->exit = 5,
2116 \| |/ 3->5 region->exit = NULL, 4->5 region->exit = NULL
2117 5 <- exit
2118
2119 changes to
2120
2121 1 2 3 4 1->6 no region, 2->6 region->exit = 6,
2122 | | \/ 3->5 no region, 4->5 no region,
2123 | | 5
2124 \| / 5->6 region->exit = 6
2125 6
2126
2127 Now there is only a single exit edge (5->6). */
2128 exit = region->exit;
2129 region->exit = NULL;
2130 forwarder = make_forwarder_block (exit, &sd_region_without_exit, NULL);
2131
2132 /* Unmark the edges, that are no longer exit edges. */
2133 FOR_EACH_EDGE (e, ei, forwarder->src->preds)
2134 if (e->aux)
2135 e->aux = NULL;
2136
2137 /* Mark the new exit edge. */
2138 single_succ_edge (forwarder->src)->aux = region;
2139
2140 /* Update the exit bb of all regions, where exit edges lead to
2141 forwarder->dest. */
2142 FOR_EACH_EDGE (e, ei, forwarder->dest->preds)
2143 if (e->aux)
2144 ((sd_region *) e->aux)->exit = forwarder->dest;
2145
2146 #ifdef ENABLE_CHECKING
2147 gcc_assert (find_single_exit_edge (region));
2148 #endif
2149 }
2150
2151 /* Unmark the exit edges of all REGIONS.
2152 See comment in "create_single_exit_edge". */
2153
2154 static void
2155 unmark_exit_edges (VEC (sd_region, heap) *regions)
2156 {
2157 int i;
2158 sd_region *s;
2159 edge e;
2160 edge_iterator ei;
2161
2162 for (i = 0; VEC_iterate (sd_region, regions, i, s); i++)
2163 FOR_EACH_EDGE (e, ei, s->exit->preds)
2164 e->aux = NULL;
2165 }
2166
2167
2168 /* Mark the exit edges of all REGIONS.
2169 See comment in "create_single_exit_edge". */
2170
2171 static void
2172 mark_exit_edges (VEC (sd_region, heap) *regions)
2173 {
2174 int i;
2175 sd_region *s;
2176 edge e;
2177 edge_iterator ei;
2178
2179 for (i = 0; VEC_iterate (sd_region, regions, i, s); i++)
2180 FOR_EACH_EDGE (e, ei, s->exit->preds)
2181 if (bb_in_sd_region (e->src, s))
2182 e->aux = s;
2183 }
2184
2185 /* Free and compute again all the dominators information. */
2186
2187 static inline void
2188 recompute_all_dominators (void)
2189 {
2190 mark_irreducible_loops ();
2191 free_dominance_info (CDI_DOMINATORS);
2192 free_dominance_info (CDI_POST_DOMINATORS);
2193 calculate_dominance_info (CDI_DOMINATORS);
2194 calculate_dominance_info (CDI_POST_DOMINATORS);
2195 }
2196
2197 /* Verifies properties that GRAPHITE should maintain during translation. */
2198
2199 static inline void
2200 graphite_verify (void)
2201 {
2202 #ifdef ENABLE_CHECKING
2203 verify_loop_structure ();
2204 verify_dominators (CDI_DOMINATORS);
2205 verify_dominators (CDI_POST_DOMINATORS);
2206 verify_ssa (false);
2207 verify_loop_closed_ssa ();
2208 #endif
2209 }
2210
2211 /* Create for all scop regions a single entry and a single exit edge. */
2212
2213 static void
2214 create_sese_edges (VEC (sd_region, heap) *regions)
2215 {
2216 int i;
2217 sd_region *s;
2218
2219 for (i = 0; VEC_iterate (sd_region, regions, i, s); i++)
2220 create_single_entry_edge (s);
2221
2222 mark_exit_edges (regions);
2223
2224 for (i = 0; VEC_iterate (sd_region, regions, i, s); i++)
2225 create_single_exit_edge (s);
2226
2227 unmark_exit_edges (regions);
2228
2229 fix_loop_structure (NULL);
2230
2231 #ifdef ENABLE_CHECKING
2232 verify_loop_structure ();
2233 verify_dominators (CDI_DOMINATORS);
2234 verify_ssa (false);
2235 #endif
2236 }
2237
2238 /* Create graphite SCoPs from an array of scop detection regions. */
2239
2240 static void
2241 build_graphite_scops (VEC (sd_region, heap) *scop_regions)
2242 {
2243 int i;
2244 sd_region *s;
2245
2246 for (i = 0; VEC_iterate (sd_region, scop_regions, i, s); i++)
2247 {
2248 edge entry = find_single_entry_edge (s);
2249 edge exit = find_single_exit_edge (s);
2250 scop_p scop = new_scop (entry, exit);
2251 VEC_safe_push (scop_p, heap, current_scops, scop);
2252
2253 /* Are there overlapping SCoPs? */
2254 #ifdef ENABLE_CHECKING
2255 {
2256 int j;
2257 sd_region *s2;
2258
2259 for (j = 0; VEC_iterate (sd_region, scop_regions, j, s2); j++)
2260 if (s != s2)
2261 gcc_assert (!bb_in_sd_region (s->entry, s2));
2262 }
2263 #endif
2264 }
2265 }
2266
2267 /* Find static control parts. */
2268
2269 static void
2270 build_scops (void)
2271 {
2272 struct loop *loop = current_loops->tree_root;
2273 VEC (sd_region, heap) *tmp_scops = VEC_alloc (sd_region, heap, 3);
2274
2275 build_scops_1 (single_succ (ENTRY_BLOCK_PTR), &tmp_scops, loop);
2276 create_sese_edges (tmp_scops);
2277 build_graphite_scops (tmp_scops);
2278 VEC_free (sd_region, heap, tmp_scops);
2279 }
2280
2281 /* Gather the basic blocks belonging to the SCOP. */
2282
2283 static void
2284 build_scop_bbs (scop_p scop)
2285 {
2286 basic_block *stack = XNEWVEC (basic_block, n_basic_blocks + 1);
2287 sbitmap visited = sbitmap_alloc (last_basic_block);
2288 int sp = 0;
2289
2290 sbitmap_zero (visited);
2291 stack[sp++] = SCOP_ENTRY (scop);
2292
2293 while (sp)
2294 {
2295 basic_block bb = stack[--sp];
2296 int depth = loop_depth (bb->loop_father);
2297 int num = bb->loop_father->num;
2298 edge_iterator ei;
2299 edge e;
2300
2301 /* Scop's exit is not in the scop. Exclude also bbs, which are
2302 dominated by the SCoP exit. These are e.g. loop latches. */
2303 if (TEST_BIT (visited, bb->index)
2304 || dominated_by_p (CDI_DOMINATORS, bb, SCOP_EXIT (scop))
2305 /* Every block in the scop is dominated by scop's entry. */
2306 || !dominated_by_p (CDI_DOMINATORS, bb, SCOP_ENTRY (scop)))
2307 continue;
2308
2309 new_graphite_bb (scop, bb);
2310 SET_BIT (visited, bb->index);
2311
2312 /* First push the blocks that have to be processed last. Note
2313 that this means that the order in which the code is organized
2314 below is important: do not reorder the following code. */
2315 FOR_EACH_EDGE (e, ei, bb->succs)
2316 if (! TEST_BIT (visited, e->dest->index)
2317 && (int) loop_depth (e->dest->loop_father) < depth)
2318 stack[sp++] = e->dest;
2319
2320 FOR_EACH_EDGE (e, ei, bb->succs)
2321 if (! TEST_BIT (visited, e->dest->index)
2322 && (int) loop_depth (e->dest->loop_father) == depth
2323 && e->dest->loop_father->num != num)
2324 stack[sp++] = e->dest;
2325
2326 FOR_EACH_EDGE (e, ei, bb->succs)
2327 if (! TEST_BIT (visited, e->dest->index)
2328 && (int) loop_depth (e->dest->loop_father) == depth
2329 && e->dest->loop_father->num == num
2330 && EDGE_COUNT (e->dest->preds) > 1)
2331 stack[sp++] = e->dest;
2332
2333 FOR_EACH_EDGE (e, ei, bb->succs)
2334 if (! TEST_BIT (visited, e->dest->index)
2335 && (int) loop_depth (e->dest->loop_father) == depth
2336 && e->dest->loop_father->num == num
2337 && EDGE_COUNT (e->dest->preds) == 1)
2338 stack[sp++] = e->dest;
2339
2340 FOR_EACH_EDGE (e, ei, bb->succs)
2341 if (! TEST_BIT (visited, e->dest->index)
2342 && (int) loop_depth (e->dest->loop_father) > depth)
2343 stack[sp++] = e->dest;
2344 }
2345
2346 free (stack);
2347 sbitmap_free (visited);
2348 }
2349
2350 /* Returns the number of reduction phi nodes in LOOP. */
2351
2352 static int
2353 nb_reductions_in_loop (loop_p loop)
2354 {
2355 int res = 0;
2356 gimple_stmt_iterator gsi;
2357
2358 for (gsi = gsi_start_phis (loop->header); !gsi_end_p (gsi); gsi_next (&gsi))
2359 {
2360 gimple phi = gsi_stmt (gsi);
2361 tree scev;
2362 affine_iv iv;
2363
2364 if (!is_gimple_reg (PHI_RESULT (phi)))
2365 continue;
2366
2367 scev = analyze_scalar_evolution (loop, PHI_RESULT (phi));
2368 scev = instantiate_parameters (loop, scev);
2369 if (!simple_iv (loop, loop, PHI_RESULT (phi), &iv, true))
2370 res++;
2371 }
2372
2373 return res;
2374 }
2375
2376 /* A LOOP is in normal form when it contains only one scalar phi node
2377 that defines the main induction variable of the loop, only one
2378 increment of the IV, and only one exit condition. */
2379
2380 static tree
2381 graphite_loop_normal_form (loop_p loop)
2382 {
2383 struct tree_niter_desc niter;
2384 tree nit;
2385 gimple_seq stmts;
2386 edge exit = single_dom_exit (loop);
2387 bool known_niter = number_of_iterations_exit (loop, exit, &niter, false);
2388
2389 gcc_assert (known_niter);
2390
2391 nit = force_gimple_operand (unshare_expr (niter.niter), &stmts, true,
2392 NULL_TREE);
2393 if (stmts)
2394 gsi_insert_seq_on_edge_immediate (loop_preheader_edge (loop), stmts);
2395
2396 /* One IV per loop. */
2397 if (nb_reductions_in_loop (loop) > 0)
2398 return NULL_TREE;
2399
2400 return canonicalize_loop_ivs (loop, NULL, &nit);
2401 }
2402
2403 /* Record LOOP as occuring in SCOP. Returns true when the operation
2404 was successful. */
2405
2406 static bool
2407 scop_record_loop (scop_p scop, loop_p loop)
2408 {
2409 tree induction_var;
2410 name_tree oldiv;
2411
2412 if (bitmap_bit_p (SCOP_LOOPS (scop), loop->num))
2413 return true;
2414
2415 bitmap_set_bit (SCOP_LOOPS (scop), loop->num);
2416 VEC_safe_push (loop_p, heap, SCOP_LOOP_NEST (scop), loop);
2417
2418 induction_var = graphite_loop_normal_form (loop);
2419 if (!induction_var)
2420 return false;
2421
2422 oldiv = XNEW (struct name_tree_d);
2423 oldiv->t = induction_var;
2424 oldiv->name = get_name (SSA_NAME_VAR (oldiv->t));
2425 oldiv->loop = loop;
2426 VEC_safe_push (name_tree, heap, SCOP_OLDIVS (scop), oldiv);
2427 return true;
2428 }
2429
2430 /* Build the loop nests contained in SCOP. Returns true when the
2431 operation was successful. */
2432
2433 static bool
2434 build_scop_loop_nests (scop_p scop)
2435 {
2436 unsigned i;
2437 basic_block bb;
2438 struct loop *loop0, *loop1;
2439
2440 FOR_EACH_BB (bb)
2441 if (bb_in_sese_p (bb, SCOP_REGION (scop)))
2442 {
2443 struct loop *loop = bb->loop_father;
2444
2445 /* Only add loops if they are completely contained in the SCoP. */
2446 if (loop->header == bb
2447 && bb_in_sese_p (loop->latch, SCOP_REGION (scop)))
2448 {
2449 if (!scop_record_loop (scop, loop))
2450 return false;
2451 }
2452 }
2453
2454 /* Make sure that the loops in the SCOP_LOOP_NEST are ordered. It
2455 can be the case that an inner loop is inserted before an outer
2456 loop. To avoid this, semi-sort once. */
2457 for (i = 0; VEC_iterate (loop_p, SCOP_LOOP_NEST (scop), i, loop0); i++)
2458 {
2459 if (VEC_length (loop_p, SCOP_LOOP_NEST (scop)) == i + 1)
2460 break;
2461
2462 loop1 = VEC_index (loop_p, SCOP_LOOP_NEST (scop), i + 1);
2463 if (loop0->num > loop1->num)
2464 {
2465 VEC_replace (loop_p, SCOP_LOOP_NEST (scop), i, loop1);
2466 VEC_replace (loop_p, SCOP_LOOP_NEST (scop), i + 1, loop0);
2467 }
2468 }
2469
2470 return true;
2471 }
2472
2473 /* Calculate the number of loops around LOOP in the SCOP. */
2474
2475 static inline int
2476 nb_loops_around_loop_in_scop (struct loop *l, scop_p scop)
2477 {
2478 int d = 0;
2479
2480 for (; loop_in_sese_p (l, SCOP_REGION (scop)); d++, l = loop_outer (l));
2481
2482 return d;
2483 }
2484
2485 /* Calculate the number of loops around GB in the current SCOP. */
2486
2487 int
2488 nb_loops_around_gb (graphite_bb_p gb)
2489 {
2490 return nb_loops_around_loop_in_scop (gbb_loop (gb), GBB_SCOP (gb));
2491 }
2492
2493 /* Returns the dimensionality of an enclosing loop iteration domain
2494 with respect to enclosing SCoP for a given data reference REF. The
2495 returned dimensionality is homogeneous (depth of loop nest + number
2496 of SCoP parameters + const). */
2497
2498 int
2499 ref_nb_loops (data_reference_p ref)
2500 {
2501 loop_p loop = loop_containing_stmt (DR_STMT (ref));
2502 scop_p scop = DR_SCOP (ref);
2503
2504 return nb_loops_around_loop_in_scop (loop, scop) + scop_nb_params (scop) + 2;
2505 }
2506
2507 /* Build dynamic schedules for all the BBs. */
2508
2509 static void
2510 build_scop_dynamic_schedules (scop_p scop)
2511 {
2512 int i, dim, loop_num, row, col;
2513 graphite_bb_p gb;
2514
2515 for (i = 0; VEC_iterate (graphite_bb_p, SCOP_BBS (scop), i, gb); i++)
2516 {
2517 loop_num = GBB_BB (gb)->loop_father->num;
2518
2519 if (loop_num != 0)
2520 {
2521 dim = nb_loops_around_gb (gb);
2522 GBB_DYNAMIC_SCHEDULE (gb) = cloog_matrix_alloc (dim, dim);
2523
2524 for (row = 0; row < GBB_DYNAMIC_SCHEDULE (gb)->NbRows; row++)
2525 for (col = 0; col < GBB_DYNAMIC_SCHEDULE (gb)->NbColumns; col++)
2526 if (row == col)
2527 value_set_si (GBB_DYNAMIC_SCHEDULE (gb)->p[row][col], 1);
2528 else
2529 value_set_si (GBB_DYNAMIC_SCHEDULE (gb)->p[row][col], 0);
2530 }
2531 else
2532 GBB_DYNAMIC_SCHEDULE (gb) = NULL;
2533 }
2534 }
2535
2536 /* Returns the number of loops that are identical at the beginning of
2537 the vectors A and B. */
2538
2539 static int
2540 compare_prefix_loops (VEC (loop_p, heap) *a, VEC (loop_p, heap) *b)
2541 {
2542 int i;
2543 loop_p ea;
2544 int lb;
2545
2546 if (!a || !b)
2547 return 0;
2548
2549 lb = VEC_length (loop_p, b);
2550
2551 for (i = 0; VEC_iterate (loop_p, a, i, ea); i++)
2552 if (i >= lb
2553 || ea != VEC_index (loop_p, b, i))
2554 return i;
2555
2556 return 0;
2557 }
2558
2559 /* Build for BB the static schedule.
2560
2561 The STATIC_SCHEDULE is defined like this:
2562
2563 A
2564 for (i: ...)
2565 {
2566 for (j: ...)
2567 {
2568 B
2569 C
2570 }
2571
2572 for (k: ...)
2573 {
2574 D
2575 E
2576 }
2577 }
2578 F
2579
2580 Static schedules for A to F:
2581
2582 DEPTH
2583 0 1 2
2584 A 0
2585 B 1 0 0
2586 C 1 0 1
2587 D 1 1 0
2588 E 1 1 1
2589 F 2
2590 */
2591
2592 static void
2593 build_scop_canonical_schedules (scop_p scop)
2594 {
2595 int i;
2596 graphite_bb_p gb;
2597 int nb_loops = scop_nb_loops (scop);
2598 lambda_vector static_schedule = lambda_vector_new (nb_loops + 1);
2599 VEC (loop_p, heap) *loops_previous = NULL;
2600
2601 /* We have to start schedules at 0 on the first component and
2602 because we cannot compare_prefix_loops against a previous loop,
2603 prefix will be equal to zero, and that index will be
2604 incremented before copying. */
2605 static_schedule[0] = -1;
2606
2607 for (i = 0; VEC_iterate (graphite_bb_p, SCOP_BBS (scop), i, gb); i++)
2608 {
2609 int prefix = compare_prefix_loops (loops_previous, GBB_LOOPS (gb));
2610 int nb = gbb_nb_loops (gb);
2611
2612 loops_previous = GBB_LOOPS (gb);
2613 memset (&(static_schedule[prefix + 1]), 0, sizeof (int) * (nb_loops - prefix));
2614 ++static_schedule[prefix];
2615 GBB_STATIC_SCHEDULE (gb) = lambda_vector_new (nb + 1);
2616 lambda_vector_copy (static_schedule,
2617 GBB_STATIC_SCHEDULE (gb), nb + 1);
2618 }
2619 }
2620
2621 /* Build the LOOPS vector for all bbs in SCOP. */
2622
2623 static void
2624 build_bb_loops (scop_p scop)
2625 {
2626 graphite_bb_p gb;
2627 int i;
2628
2629 for (i = 0; VEC_iterate (graphite_bb_p, SCOP_BBS (scop), i, gb); i++)
2630 {
2631 loop_p loop;
2632 int depth;
2633
2634 depth = nb_loops_around_gb (gb) - 1;
2635
2636 GBB_LOOPS (gb) = VEC_alloc (loop_p, heap, 3);
2637 VEC_safe_grow_cleared (loop_p, heap, GBB_LOOPS (gb), depth + 1);
2638
2639 loop = GBB_BB (gb)->loop_father;
2640
2641 while (scop_contains_loop (scop, loop))
2642 {
2643 VEC_replace (loop_p, GBB_LOOPS (gb), depth, loop);
2644 loop = loop_outer (loop);
2645 depth--;
2646 }
2647 }
2648 }
2649
2650 /* Get the index for parameter VAR in SCOP. */
2651
2652 static int
2653 param_index (tree var, scop_p scop)
2654 {
2655 int i;
2656 name_tree p;
2657 name_tree nvar;
2658
2659 gcc_assert (TREE_CODE (var) == SSA_NAME);
2660
2661 for (i = 0; VEC_iterate (name_tree, SCOP_PARAMS (scop), i, p); i++)
2662 if (p->t == var)
2663 return i;
2664
2665 gcc_assert (SCOP_ADD_PARAMS (scop));
2666
2667 nvar = XNEW (struct name_tree_d);
2668 nvar->t = var;
2669 nvar->name = NULL;
2670 VEC_safe_push (name_tree, heap, SCOP_PARAMS (scop), nvar);
2671 return VEC_length (name_tree, SCOP_PARAMS (scop)) - 1;
2672 }
2673
2674 /* Scan EXPR and translate it to an inequality vector INEQ that will
2675 be added, or subtracted, in the constraint domain matrix C at row
2676 R. K is the number of columns for loop iterators in C. */
2677
2678 static void
2679 scan_tree_for_params (scop_p s, tree e, CloogMatrix *c, int r, Value k,
2680 bool subtract)
2681 {
2682 int cst_col, param_col;
2683
2684 if (e == chrec_dont_know)
2685 return;
2686
2687 switch (TREE_CODE (e))
2688 {
2689 case POLYNOMIAL_CHREC:
2690 {
2691 tree left = CHREC_LEFT (e);
2692 tree right = CHREC_RIGHT (e);
2693 int var = CHREC_VARIABLE (e);
2694
2695 if (TREE_CODE (right) != INTEGER_CST)
2696 return;
2697
2698 if (c)
2699 {
2700 int loop_col = scop_gimple_loop_depth (s, get_loop (var)) + 1;
2701
2702 if (subtract)
2703 value_sub_int (c->p[r][loop_col], c->p[r][loop_col],
2704 int_cst_value (right));
2705 else
2706 value_add_int (c->p[r][loop_col], c->p[r][loop_col],
2707 int_cst_value (right));
2708 }
2709
2710 switch (TREE_CODE (left))
2711 {
2712 case POLYNOMIAL_CHREC:
2713 scan_tree_for_params (s, left, c, r, k, subtract);
2714 return;
2715
2716 case INTEGER_CST:
2717 /* Constant part. */
2718 if (c)
2719 {
2720 int v = int_cst_value (left);
2721 cst_col = c->NbColumns - 1;
2722
2723 if (v < 0)
2724 {
2725 v = -v;
2726 subtract = subtract ? false : true;
2727 }
2728
2729 if (subtract)
2730 value_sub_int (c->p[r][cst_col], c->p[r][cst_col], v);
2731 else
2732 value_add_int (c->p[r][cst_col], c->p[r][cst_col], v);
2733 }
2734 return;
2735
2736 default:
2737 scan_tree_for_params (s, left, c, r, k, subtract);
2738 return;
2739 }
2740 }
2741 break;
2742
2743 case MULT_EXPR:
2744 if (chrec_contains_symbols (TREE_OPERAND (e, 0)))
2745 {
2746 if (c)
2747 {
2748 Value val;
2749 gcc_assert (host_integerp (TREE_OPERAND (e, 1), 0));
2750 value_init (val);
2751 value_set_si (val, int_cst_value (TREE_OPERAND (e, 1)));
2752 value_multiply (k, k, val);
2753 value_clear (val);
2754 }
2755 scan_tree_for_params (s, TREE_OPERAND (e, 0), c, r, k, subtract);
2756 }
2757 else
2758 {
2759 if (c)
2760 {
2761 Value val;
2762 gcc_assert (host_integerp (TREE_OPERAND (e, 0), 0));
2763 value_init (val);
2764 value_set_si (val, int_cst_value (TREE_OPERAND (e, 0)));
2765 value_multiply (k, k, val);
2766 value_clear (val);
2767 }
2768 scan_tree_for_params (s, TREE_OPERAND (e, 1), c, r, k, subtract);
2769 }
2770 break;
2771
2772 case PLUS_EXPR:
2773 case POINTER_PLUS_EXPR:
2774 scan_tree_for_params (s, TREE_OPERAND (e, 0), c, r, k, subtract);
2775 scan_tree_for_params (s, TREE_OPERAND (e, 1), c, r, k, subtract);
2776 break;
2777
2778 case MINUS_EXPR:
2779 scan_tree_for_params (s, TREE_OPERAND (e, 0), c, r, k, subtract);
2780 scan_tree_for_params (s, TREE_OPERAND (e, 1), c, r, k, !subtract);
2781 break;
2782
2783 case NEGATE_EXPR:
2784 scan_tree_for_params (s, TREE_OPERAND (e, 0), c, r, k, !subtract);
2785 break;
2786
2787 case SSA_NAME:
2788 param_col = param_index (e, s);
2789
2790 if (c)
2791 {
2792 param_col += c->NbColumns - scop_nb_params (s) - 1;
2793
2794 if (subtract)
2795 value_subtract (c->p[r][param_col], c->p[r][param_col], k);
2796 else
2797 value_addto (c->p[r][param_col], c->p[r][param_col], k);
2798 }
2799 break;
2800
2801 case INTEGER_CST:
2802 if (c)
2803 {
2804 int v = int_cst_value (e);
2805 cst_col = c->NbColumns - 1;
2806
2807 if (v < 0)
2808 {
2809 v = -v;
2810 subtract = subtract ? false : true;
2811 }
2812
2813 if (subtract)
2814 value_sub_int (c->p[r][cst_col], c->p[r][cst_col], v);
2815 else
2816 value_add_int (c->p[r][cst_col], c->p[r][cst_col], v);
2817 }
2818 break;
2819
2820 CASE_CONVERT:
2821 case NON_LVALUE_EXPR:
2822 scan_tree_for_params (s, TREE_OPERAND (e, 0), c, r, k, subtract);
2823 break;
2824
2825 default:
2826 gcc_unreachable ();
2827 break;
2828 }
2829 }
2830
2831 /* Data structure for idx_record_params. */
2832
2833 struct irp_data
2834 {
2835 struct loop *loop;
2836 scop_p scop;
2837 };
2838
2839 /* For a data reference with an ARRAY_REF as its BASE, record the
2840 parameters occurring in IDX. DTA is passed in as complementary
2841 information, and is used by the automatic walker function. This
2842 function is a callback for for_each_index. */
2843
2844 static bool
2845 idx_record_params (tree base, tree *idx, void *dta)
2846 {
2847 struct irp_data *data = (struct irp_data *) dta;
2848
2849 if (TREE_CODE (base) != ARRAY_REF)
2850 return true;
2851
2852 if (TREE_CODE (*idx) == SSA_NAME)
2853 {
2854 tree scev;
2855 scop_p scop = data->scop;
2856 struct loop *loop = data->loop;
2857 Value one;
2858
2859 scev = analyze_scalar_evolution (loop, *idx);
2860 scev = instantiate_scev (block_before_scop (scop), loop, scev);
2861
2862 value_init (one);
2863 value_set_si (one, 1);
2864 scan_tree_for_params (scop, scev, NULL, 0, one, false);
2865 value_clear (one);
2866 }
2867
2868 return true;
2869 }
2870
2871 /* Find parameters with respect to SCOP in BB. We are looking in memory
2872 access functions, conditions and loop bounds. */
2873
2874 static void
2875 find_params_in_bb (scop_p scop, graphite_bb_p gb)
2876 {
2877 int i;
2878 data_reference_p dr;
2879 gimple stmt;
2880 loop_p father = GBB_BB (gb)->loop_father;
2881
2882 for (i = 0; VEC_iterate (data_reference_p, GBB_DATA_REFS (gb), i, dr); i++)
2883 {
2884 struct irp_data irp;
2885
2886 irp.loop = father;
2887 irp.scop = scop;
2888 for_each_index (&dr->ref, idx_record_params, &irp);
2889 }
2890
2891 /* Find parameters in conditional statements. */
2892 for (i = 0; VEC_iterate (gimple, GBB_CONDITIONS (gb), i, stmt); i++)
2893 {
2894 Value one;
2895 loop_p loop = father;
2896
2897 tree lhs, rhs;
2898
2899 lhs = gimple_cond_lhs (stmt);
2900 lhs = analyze_scalar_evolution (loop, lhs);
2901 lhs = instantiate_scev (block_before_scop (scop), loop, lhs);
2902
2903 rhs = gimple_cond_rhs (stmt);
2904 rhs = analyze_scalar_evolution (loop, rhs);
2905 rhs = instantiate_scev (block_before_scop (scop), loop, rhs);
2906
2907 value_init (one);
2908 scan_tree_for_params (scop, lhs, NULL, 0, one, false);
2909 value_set_si (one, 1);
2910 scan_tree_for_params (scop, rhs, NULL, 0, one, false);
2911 value_clear (one);
2912 }
2913 }
2914
2915 /* Saves in NV the name of variable P->T. */
2916
2917 static void
2918 save_var_name (char **nv, int i, name_tree p)
2919 {
2920 const char *name = get_name (SSA_NAME_VAR (p->t));
2921
2922 if (name)
2923 {
2924 int len = strlen (name) + 16;
2925 nv[i] = XNEWVEC (char, len);
2926 snprintf (nv[i], len, "%s_%d", name, SSA_NAME_VERSION (p->t));
2927 }
2928 else
2929 {
2930 nv[i] = XNEWVEC (char, 16);
2931 snprintf (nv[i], 2 + 16, "T_%d", SSA_NAME_VERSION (p->t));
2932 }
2933
2934 p->name = nv[i];
2935 }
2936
2937 /* Return the maximal loop depth in SCOP. */
2938
2939 static int
2940 scop_max_loop_depth (scop_p scop)
2941 {
2942 int i;
2943 graphite_bb_p gbb;
2944 int max_nb_loops = 0;
2945
2946 for (i = 0; VEC_iterate (graphite_bb_p, SCOP_BBS (scop), i, gbb); i++)
2947 {
2948 int nb_loops = gbb_nb_loops (gbb);
2949 if (max_nb_loops < nb_loops)
2950 max_nb_loops = nb_loops;
2951 }
2952
2953 return max_nb_loops;
2954 }
2955
2956 /* Initialize Cloog's parameter names from the names used in GIMPLE.
2957 Initialize Cloog's iterator names, using 'graphite_iterator_%d'
2958 from 0 to scop_nb_loops (scop). */
2959
2960 static void
2961 initialize_cloog_names (scop_p scop)
2962 {
2963 int i, nb_params = VEC_length (name_tree, SCOP_PARAMS (scop));
2964 char **params = XNEWVEC (char *, nb_params);
2965 int nb_iterators = scop_max_loop_depth (scop);
2966 int nb_scattering= cloog_program_nb_scattdims (SCOP_PROG (scop));
2967 char **iterators = XNEWVEC (char *, nb_iterators * 2);
2968 char **scattering = XNEWVEC (char *, nb_scattering);
2969 name_tree p;
2970
2971 for (i = 0; VEC_iterate (name_tree, SCOP_PARAMS (scop), i, p); i++)
2972 save_var_name (params, i, p);
2973
2974 cloog_names_set_nb_parameters (cloog_program_names (SCOP_PROG (scop)),
2975 nb_params);
2976 cloog_names_set_parameters (cloog_program_names (SCOP_PROG (scop)),
2977 params);
2978
2979 for (i = 0; i < nb_iterators; i++)
2980 {
2981 int len = 18 + 16;
2982 iterators[i] = XNEWVEC (char, len);
2983 snprintf (iterators[i], len, "graphite_iterator_%d", i);
2984 }
2985
2986 cloog_names_set_nb_iterators (cloog_program_names (SCOP_PROG (scop)),
2987 nb_iterators);
2988 cloog_names_set_iterators (cloog_program_names (SCOP_PROG (scop)),
2989 iterators);
2990
2991 for (i = 0; i < nb_scattering; i++)
2992 {
2993 int len = 2 + 16;
2994 scattering[i] = XNEWVEC (char, len);
2995 snprintf (scattering[i], len, "s_%d", i);
2996 }
2997
2998 cloog_names_set_nb_scattering (cloog_program_names (SCOP_PROG (scop)),
2999 nb_scattering);
3000 cloog_names_set_scattering (cloog_program_names (SCOP_PROG (scop)),
3001 scattering);
3002 }
3003
3004 /* Record the parameters used in the SCOP. A variable is a parameter
3005 in a scop if it does not vary during the execution of that scop. */
3006
3007 static void
3008 find_scop_parameters (scop_p scop)
3009 {
3010 graphite_bb_p gb;
3011 unsigned i;
3012 struct loop *loop;
3013 Value one;
3014
3015 value_init (one);
3016 value_set_si (one, 1);
3017
3018 /* Find the parameters used in the loop bounds. */
3019 for (i = 0; VEC_iterate (loop_p, SCOP_LOOP_NEST (scop), i, loop); i++)
3020 {
3021 tree nb_iters = number_of_latch_executions (loop);
3022
3023 if (!chrec_contains_symbols (nb_iters))
3024 continue;
3025
3026 nb_iters = analyze_scalar_evolution (loop, nb_iters);
3027 nb_iters = instantiate_scev (block_before_scop (scop), loop, nb_iters);
3028 scan_tree_for_params (scop, nb_iters, NULL, 0, one, false);
3029 }
3030
3031 value_clear (one);
3032
3033 /* Find the parameters used in data accesses. */
3034 for (i = 0; VEC_iterate (graphite_bb_p, SCOP_BBS (scop), i, gb); i++)
3035 find_params_in_bb (scop, gb);
3036
3037 SCOP_ADD_PARAMS (scop) = false;
3038 }
3039
3040 /* Build the context constraints for SCOP: constraints and relations
3041 on parameters. */
3042
3043 static void
3044 build_scop_context (scop_p scop)
3045 {
3046 int nb_params = scop_nb_params (scop);
3047 CloogMatrix *matrix = cloog_matrix_alloc (1, nb_params + 2);
3048
3049 /* Insert '0 >= 0' in the context matrix, as it is not allowed to be
3050 empty. */
3051
3052 value_set_si (matrix->p[0][0], 1);
3053
3054 value_set_si (matrix->p[0][nb_params + 1], 0);
3055
3056 cloog_program_set_context (SCOP_PROG (scop),
3057 cloog_domain_matrix2domain (matrix));
3058 cloog_matrix_free (matrix);
3059 }
3060
3061 /* Returns a graphite_bb from BB. */
3062
3063 static inline graphite_bb_p
3064 gbb_from_bb (basic_block bb)
3065 {
3066 return (graphite_bb_p) bb->aux;
3067 }
3068
3069 /* Builds the constraint matrix for LOOP in SCOP. NB_OUTER_LOOPS is the
3070 number of loops surrounding LOOP in SCOP. OUTER_CSTR gives the
3071 constraints matrix for the surrounding loops. */
3072
3073 static void
3074 build_loop_iteration_domains (scop_p scop, struct loop *loop,
3075 CloogMatrix *outer_cstr, int nb_outer_loops)
3076 {
3077 int i, j, row;
3078 CloogMatrix *cstr;
3079 graphite_bb_p gb;
3080
3081 int nb_rows = outer_cstr->NbRows + 1;
3082 int nb_cols = outer_cstr->NbColumns + 1;
3083
3084 /* Last column of CSTR is the column of constants. */
3085 int cst_col = nb_cols - 1;
3086
3087 /* The column for the current loop is just after the columns of
3088 other outer loops. */
3089 int loop_col = nb_outer_loops + 1;
3090
3091 tree nb_iters = number_of_latch_executions (loop);
3092
3093 /* When the number of iterations is a constant or a parameter, we
3094 add a constraint for the upper bound of the loop. So add a row
3095 to the constraint matrix before allocating it. */
3096 if (TREE_CODE (nb_iters) == INTEGER_CST
3097 || !chrec_contains_undetermined (nb_iters))
3098 nb_rows++;
3099
3100 cstr = cloog_matrix_alloc (nb_rows, nb_cols);
3101
3102 /* Copy the outer constraints. */
3103 for (i = 0; i < outer_cstr->NbRows; i++)
3104 {
3105 /* Copy the eq/ineq and loops columns. */
3106 for (j = 0; j < loop_col; j++)
3107 value_assign (cstr->p[i][j], outer_cstr->p[i][j]);
3108
3109 /* Leave an empty column in CSTR for the current loop, and then
3110 copy the parameter columns. */
3111 for (j = loop_col; j < outer_cstr->NbColumns; j++)
3112 value_assign (cstr->p[i][j + 1], outer_cstr->p[i][j]);
3113 }
3114
3115 /* 0 <= loop_i */
3116 row = outer_cstr->NbRows;
3117 value_set_si (cstr->p[row][0], 1);
3118 value_set_si (cstr->p[row][loop_col], 1);
3119
3120 /* loop_i <= nb_iters */
3121 if (TREE_CODE (nb_iters) == INTEGER_CST)
3122 {
3123 row++;
3124 value_set_si (cstr->p[row][0], 1);
3125 value_set_si (cstr->p[row][loop_col], -1);
3126
3127 value_set_si (cstr->p[row][cst_col],
3128 int_cst_value (nb_iters));
3129 }
3130 else if (!chrec_contains_undetermined (nb_iters))
3131 {
3132 /* Otherwise nb_iters contains parameters: scan the nb_iters
3133 expression and build its matrix representation. */
3134 Value one;
3135
3136 row++;
3137 value_set_si (cstr->p[row][0], 1);
3138 value_set_si (cstr->p[row][loop_col], -1);
3139
3140 nb_iters = analyze_scalar_evolution (loop, nb_iters);
3141 nb_iters = instantiate_scev (block_before_scop (scop), loop, nb_iters);
3142
3143 value_init (one);
3144 value_set_si (one, 1);
3145 scan_tree_for_params (scop, nb_iters, cstr, row, one, false);
3146 value_clear (one);
3147 }
3148 else
3149 gcc_unreachable ();
3150
3151 if (loop->inner && loop_in_sese_p (loop->inner, SCOP_REGION (scop)))
3152 build_loop_iteration_domains (scop, loop->inner, cstr, nb_outer_loops + 1);
3153
3154 /* Only go to the next loops, if we are not at the outermost layer. These
3155 have to be handled seperately, as we can be sure, that the chain at this
3156 layer will be connected. */
3157 if (nb_outer_loops != 0 && loop->next && loop_in_sese_p (loop->next,
3158 SCOP_REGION (scop)))
3159 build_loop_iteration_domains (scop, loop->next, outer_cstr, nb_outer_loops);
3160
3161 for (i = 0; VEC_iterate (graphite_bb_p, SCOP_BBS (scop), i, gb); i++)
3162 if (gbb_loop (gb) == loop)
3163 GBB_DOMAIN (gb) = cloog_matrix_copy (cstr);
3164
3165 cloog_matrix_free (cstr);
3166 }
3167
3168 /* Add conditions to the domain of GB. */
3169
3170 static void
3171 add_conditions_to_domain (graphite_bb_p gb)
3172 {
3173 unsigned int i,j;
3174 gimple stmt;
3175 VEC (gimple, heap) *conditions = GBB_CONDITIONS (gb);
3176 CloogMatrix *domain = GBB_DOMAIN (gb);
3177 scop_p scop = GBB_SCOP (gb);
3178
3179 unsigned nb_rows;
3180 unsigned nb_cols;
3181 unsigned nb_new_rows = 0;
3182 unsigned row;
3183
3184 if (VEC_empty (gimple, conditions))
3185 return;
3186
3187 if (domain)
3188 {
3189 nb_rows = domain->NbRows;
3190 nb_cols = domain->NbColumns;
3191 }
3192 else
3193 {
3194 nb_rows = 0;
3195 nb_cols = nb_loops_around_gb (gb) + scop_nb_params (scop) + 2;
3196 }
3197
3198 /* Count number of necessary new rows to add the conditions to the
3199 domain. */
3200 for (i = 0; VEC_iterate (gimple, conditions, i, stmt); i++)
3201 {
3202 switch (gimple_code (stmt))
3203 {
3204 case GIMPLE_COND:
3205 {
3206 enum tree_code code = gimple_cond_code (stmt);
3207
3208 switch (code)
3209 {
3210 case NE_EXPR:
3211 case EQ_EXPR:
3212 /* NE and EQ statements are not supported right know. */
3213 gcc_unreachable ();
3214 break;
3215 case LT_EXPR:
3216 case GT_EXPR:
3217 case LE_EXPR:
3218 case GE_EXPR:
3219 nb_new_rows++;
3220 break;
3221 default:
3222 gcc_unreachable ();
3223 break;
3224 }
3225 break;
3226 }
3227 case GIMPLE_SWITCH:
3228 /* Switch statements are not supported right know. */
3229 gcc_unreachable ();
3230 break;
3231
3232 default:
3233 gcc_unreachable ();
3234 break;
3235 }
3236 }
3237
3238
3239 /* Enlarge the matrix. */
3240 {
3241 CloogMatrix *new_domain;
3242 new_domain = cloog_matrix_alloc (nb_rows + nb_new_rows, nb_cols);
3243
3244 if (domain)
3245 {
3246 for (i = 0; i < nb_rows; i++)
3247 for (j = 0; j < nb_cols; j++)
3248 value_assign (new_domain->p[i][j], domain->p[i][j]);
3249
3250 cloog_matrix_free (domain);
3251 }
3252
3253 domain = new_domain;
3254 GBB_DOMAIN (gb) = new_domain;
3255 }
3256
3257 /* Add the conditions to the new enlarged domain matrix. */
3258 row = nb_rows;
3259 for (i = 0; VEC_iterate (gimple, conditions, i, stmt); i++)
3260 {
3261 switch (gimple_code (stmt))
3262 {
3263 case GIMPLE_COND:
3264 {
3265 Value one;
3266 enum tree_code code;
3267 tree left;
3268 tree right;
3269 loop_p loop = GBB_BB (gb)->loop_father;
3270
3271 left = gimple_cond_lhs (stmt);
3272 right = gimple_cond_rhs (stmt);
3273
3274 left = analyze_scalar_evolution (loop, left);
3275 right = analyze_scalar_evolution (loop, right);
3276
3277 left = instantiate_scev (block_before_scop (scop), loop, left);
3278 right = instantiate_scev (block_before_scop (scop), loop, right);
3279
3280 code = gimple_cond_code (stmt);
3281
3282 /* The conditions for ELSE-branches are inverted. */
3283 if (VEC_index (gimple, gb->condition_cases, i) == NULL)
3284 code = invert_tree_comparison (code, false);
3285
3286 switch (code)
3287 {
3288 case NE_EXPR:
3289 /* NE statements are not supported right know. */
3290 gcc_unreachable ();
3291 break;
3292 case EQ_EXPR:
3293 value_set_si (domain->p[row][0], 1);
3294 value_init (one);
3295 value_set_si (one, 1);
3296 scan_tree_for_params (scop, left, domain, row, one, true);
3297 value_set_si (one, 1);
3298 scan_tree_for_params (scop, right, domain, row, one, false);
3299 row++;
3300 value_set_si (domain->p[row][0], 1);
3301 value_set_si (one, 1);
3302 scan_tree_for_params (scop, left, domain, row, one, false);
3303 value_set_si (one, 1);
3304 scan_tree_for_params (scop, right, domain, row, one, true);
3305 value_clear (one);
3306 row++;
3307 break;
3308 case LT_EXPR:
3309 value_set_si (domain->p[row][0], 1);
3310 value_init (one);
3311 value_set_si (one, 1);
3312 scan_tree_for_params (scop, left, domain, row, one, true);
3313 value_set_si (one, 1);
3314 scan_tree_for_params (scop, right, domain, row, one, false);
3315 value_sub_int (domain->p[row][nb_cols - 1],
3316 domain->p[row][nb_cols - 1], 1);
3317 value_clear (one);
3318 row++;
3319 break;
3320 case GT_EXPR:
3321 value_set_si (domain->p[row][0], 1);
3322 value_init (one);
3323 value_set_si (one, 1);
3324 scan_tree_for_params (scop, left, domain, row, one, false);
3325 value_set_si (one, 1);
3326 scan_tree_for_params (scop, right, domain, row, one, true);
3327 value_sub_int (domain->p[row][nb_cols - 1],
3328 domain->p[row][nb_cols - 1], 1);
3329 value_clear (one);
3330 row++;
3331 break;
3332 case LE_EXPR:
3333 value_set_si (domain->p[row][0], 1);
3334 value_init (one);
3335 value_set_si (one, 1);
3336 scan_tree_for_params (scop, left, domain, row, one, true);
3337 value_set_si (one, 1);
3338 scan_tree_for_params (scop, right, domain, row, one, false);
3339 value_clear (one);
3340 row++;
3341 break;
3342 case GE_EXPR:
3343 value_set_si (domain->p[row][0], 1);
3344 value_init (one);
3345 value_set_si (one, 1);
3346 scan_tree_for_params (scop, left, domain, row, one, false);
3347 value_set_si (one, 1);
3348 scan_tree_for_params (scop, right, domain, row, one, true);
3349 value_clear (one);
3350 row++;
3351 break;
3352 default:
3353 gcc_unreachable ();
3354 break;
3355 }
3356 break;
3357 }
3358 case GIMPLE_SWITCH:
3359 /* Switch statements are not supported right know. */
3360 gcc_unreachable ();
3361 break;
3362
3363 default:
3364 gcc_unreachable ();
3365 break;
3366 }
3367 }
3368 }
3369
3370 /* Returns true when PHI defines an induction variable in the loop
3371 containing the PHI node. */
3372
3373 static bool
3374 phi_node_is_iv (gimple phi)
3375 {
3376 loop_p loop = gimple_bb (phi)->loop_father;
3377 tree scev = analyze_scalar_evolution (loop, gimple_phi_result (phi));
3378
3379 return tree_contains_chrecs (scev, NULL);
3380 }
3381
3382 /* Returns true when BB contains scalar phi nodes that are not an
3383 induction variable of a loop. */
3384
3385 static bool
3386 bb_contains_non_iv_scalar_phi_nodes (basic_block bb)
3387 {
3388 gimple phi = NULL;
3389 gimple_stmt_iterator si;
3390
3391 for (si = gsi_start_phis (bb); !gsi_end_p (si); gsi_next (&si))
3392 if (is_gimple_reg (gimple_phi_result (gsi_stmt (si))))
3393 {
3394 /* Store the unique scalar PHI node: at this point, loops
3395 should be in cannonical form, so we expect to see at most
3396 one scalar phi node in the loop header. */
3397 if (phi
3398 || bb != bb->loop_father->header)
3399 return true;
3400
3401 phi = gsi_stmt (si);
3402 }
3403
3404 if (!phi
3405 || phi_node_is_iv (phi))
3406 return false;
3407
3408 return true;
3409 }
3410
3411 /* Helper recursive function. Record in CONDITIONS and CASES all
3412 conditions from 'if's and 'switch'es occurring in BB from SCOP.
3413
3414 Returns false when the conditions contain scalar computations that
3415 depend on the condition, i.e. when there are scalar phi nodes on
3416 the junction after the condition. Only the computations occurring
3417 on memory can be handled in the polyhedral model: operations that
3418 define scalar evolutions in conditions, that can potentially be
3419 used to index memory, can't be handled by the polyhedral model. */
3420
3421 static bool
3422 build_scop_conditions_1 (VEC (gimple, heap) **conditions,
3423 VEC (gimple, heap) **cases, basic_block bb,
3424 scop_p scop)
3425 {
3426 bool res = true;
3427 int i, j;
3428 graphite_bb_p gbb;
3429 basic_block bb_child, bb_iter;
3430 VEC (basic_block, heap) *dom;
3431 gimple stmt;
3432
3433 /* Make sure we are in the SCoP. */
3434 if (!bb_in_sese_p (bb, SCOP_REGION (scop)))
3435 return true;
3436
3437 if (bb_contains_non_iv_scalar_phi_nodes (bb))
3438 return false;
3439
3440 gbb = gbb_from_bb (bb);
3441 if (gbb)
3442 {
3443 GBB_CONDITIONS (gbb) = VEC_copy (gimple, heap, *conditions);
3444 GBB_CONDITION_CASES (gbb) = VEC_copy (gimple, heap, *cases);
3445 }
3446
3447 dom = get_dominated_by (CDI_DOMINATORS, bb);
3448
3449 stmt = last_stmt (bb);
3450 if (stmt)
3451 {
3452 VEC (edge, gc) *edges;
3453 edge e;
3454
3455 switch (gimple_code (stmt))
3456 {
3457 case GIMPLE_COND:
3458 edges = bb->succs;
3459 for (i = 0; VEC_iterate (edge, edges, i, e); i++)
3460 if ((dominated_by_p (CDI_DOMINATORS, e->dest, bb))
3461 && VEC_length (edge, e->dest->preds) == 1)
3462 {
3463 /* Remove the scanned block from the dominator successors. */
3464 for (j = 0; VEC_iterate (basic_block, dom, j, bb_iter); j++)
3465 if (bb_iter == e->dest)
3466 {
3467 VEC_unordered_remove (basic_block, dom, j);
3468 break;
3469 }
3470
3471 /* Recursively scan the then or else part. */
3472 if (e->flags & EDGE_TRUE_VALUE)
3473 VEC_safe_push (gimple, heap, *cases, stmt);
3474 else
3475 {
3476 gcc_assert (e->flags & EDGE_FALSE_VALUE);
3477 VEC_safe_push (gimple, heap, *cases, NULL);
3478 }
3479
3480 VEC_safe_push (gimple, heap, *conditions, stmt);
3481 if (!build_scop_conditions_1 (conditions, cases, e->dest, scop))
3482 {
3483 res = false;
3484 goto done;
3485 }
3486 VEC_pop (gimple, *conditions);
3487 VEC_pop (gimple, *cases);
3488 }
3489 break;
3490
3491 case GIMPLE_SWITCH:
3492 {
3493 unsigned i;
3494 gimple_stmt_iterator gsi_search_gimple_label;
3495
3496 for (i = 0; i < gimple_switch_num_labels (stmt); ++i)
3497 {
3498 basic_block bb_iter;
3499 size_t k;
3500 size_t n_cases = VEC_length (gimple, *conditions);
3501 unsigned n = gimple_switch_num_labels (stmt);
3502
3503 bb_child = label_to_block
3504 (CASE_LABEL (gimple_switch_label (stmt, i)));
3505
3506 for (k = 0; k < n; k++)
3507 if (i != k
3508 && label_to_block
3509 (CASE_LABEL (gimple_switch_label (stmt, k))) == bb_child)
3510 break;
3511
3512 /* Switches with multiple case values for the same
3513 block are not handled. */
3514 if (k != n
3515 /* Switch cases with more than one predecessor are
3516 not handled. */
3517 || VEC_length (edge, bb_child->preds) != 1)
3518 {
3519 res = false;
3520 goto done;
3521 }
3522
3523 /* Recursively scan the corresponding 'case' block. */
3524 for (gsi_search_gimple_label = gsi_start_bb (bb_child);
3525 !gsi_end_p (gsi_search_gimple_label);
3526 gsi_next (&gsi_search_gimple_label))
3527 {
3528 gimple label = gsi_stmt (gsi_search_gimple_label);
3529
3530 if (gimple_code (label) == GIMPLE_LABEL)
3531 {
3532 tree t = gimple_label_label (label);
3533
3534 gcc_assert (t == gimple_switch_label (stmt, i));
3535 VEC_replace (gimple, *cases, n_cases, label);
3536 break;
3537 }
3538 }
3539
3540 if (!build_scop_conditions_1 (conditions, cases, bb_child, scop))
3541 {
3542 res = false;
3543 goto done;
3544 }
3545
3546 /* Remove the scanned block from the dominator successors. */
3547 for (j = 0; VEC_iterate (basic_block, dom, j, bb_iter); j++)
3548 if (bb_iter == bb_child)
3549 {
3550 VEC_unordered_remove (basic_block, dom, j);
3551 break;
3552 }
3553 }
3554
3555 VEC_pop (gimple, *conditions);
3556 VEC_pop (gimple, *cases);
3557 break;
3558 }
3559
3560 default:
3561 break;
3562 }
3563 }
3564
3565 /* Scan all immediate dominated successors. */
3566 for (i = 0; VEC_iterate (basic_block, dom, i, bb_child); i++)
3567 if (!build_scop_conditions_1 (conditions, cases, bb_child, scop))
3568 {
3569 res = false;
3570 goto done;
3571 }
3572
3573 done:
3574 VEC_free (basic_block, heap, dom);
3575 return res;
3576 }
3577
3578 /* Record all conditions from SCOP.
3579
3580 Returns false when the conditions contain scalar computations that
3581 depend on the condition, i.e. when there are scalar phi nodes on
3582 the junction after the condition. Only the computations occurring
3583 on memory can be handled in the polyhedral model: operations that
3584 define scalar evolutions in conditions, that can potentially be
3585 used to index memory, can't be handled by the polyhedral model. */
3586
3587 static bool
3588 build_scop_conditions (scop_p scop)
3589 {
3590 bool res;
3591 VEC (gimple, heap) *conditions = NULL;
3592 VEC (gimple, heap) *cases = NULL;
3593
3594 res = build_scop_conditions_1 (&conditions, &cases, SCOP_ENTRY (scop), scop);
3595
3596 VEC_free (gimple, heap, conditions);
3597 VEC_free (gimple, heap, cases);
3598 return res;
3599 }
3600
3601 /* Traverses all the GBBs of the SCOP and add their constraints to the
3602 iteration domains. */
3603
3604 static void
3605 add_conditions_to_constraints (scop_p scop)
3606 {
3607 int i;
3608 graphite_bb_p gbb;
3609
3610 for (i = 0; VEC_iterate (graphite_bb_p, SCOP_BBS (scop), i, gbb); i++)
3611 add_conditions_to_domain (gbb);
3612 }
3613
3614 /* Build the current domain matrix: the loops belonging to the current
3615 SCOP, and that vary for the execution of the current basic block.
3616 Returns false if there is no loop in SCOP. */
3617
3618 static bool
3619 build_scop_iteration_domain (scop_p scop)
3620 {
3621 struct loop *loop;
3622 CloogMatrix *outer_cstr;
3623 int i;
3624
3625 /* Build cloog loop for all loops, that are in the uppermost loop layer of
3626 this SCoP. */
3627 for (i = 0; VEC_iterate (loop_p, SCOP_LOOP_NEST (scop), i, loop); i++)
3628 if (!loop_in_sese_p (loop_outer (loop), SCOP_REGION (scop)))
3629 {
3630 /* The outermost constraints is a matrix that has:
3631 -first column: eq/ineq boolean
3632 -last column: a constant
3633 -scop_nb_params columns for the parameters used in the scop. */
3634 outer_cstr = cloog_matrix_alloc (0, scop_nb_params (scop) + 2);
3635 build_loop_iteration_domains (scop, loop, outer_cstr, 0);
3636 cloog_matrix_free (outer_cstr);
3637 }
3638
3639 return (i != 0);
3640 }
3641
3642 /* Initializes an equation CY of the access matrix using the
3643 information for a subscript from AF, relatively to the loop
3644 indexes from LOOP_NEST and parameter indexes from PARAMS. NDIM is
3645 the dimension of the array access, i.e. the number of
3646 subscripts. Returns true when the operation succeeds. */
3647
3648 static bool
3649 build_access_matrix_with_af (tree af, lambda_vector cy,
3650 scop_p scop, int ndim)
3651 {
3652 int param_col;
3653
3654 switch (TREE_CODE (af))
3655 {
3656 case POLYNOMIAL_CHREC:
3657 {
3658 struct loop *outer_loop;
3659 tree left = CHREC_LEFT (af);
3660 tree right = CHREC_RIGHT (af);
3661 int var;
3662
3663 if (TREE_CODE (right) != INTEGER_CST)
3664 return false;
3665
3666 outer_loop = get_loop (CHREC_VARIABLE (af));
3667 var = nb_loops_around_loop_in_scop (outer_loop, scop);
3668 cy[var] = int_cst_value (right);
3669
3670 switch (TREE_CODE (left))
3671 {
3672 case POLYNOMIAL_CHREC:
3673 return build_access_matrix_with_af (left, cy, scop, ndim);
3674
3675 case INTEGER_CST:
3676 cy[ndim - 1] = int_cst_value (left);
3677 return true;
3678
3679 default:
3680 return build_access_matrix_with_af (left, cy, scop, ndim);
3681 }
3682 }
3683
3684 case PLUS_EXPR:
3685 build_access_matrix_with_af (TREE_OPERAND (af, 0), cy, scop, ndim);
3686 build_access_matrix_with_af (TREE_OPERAND (af, 1), cy, scop, ndim);
3687 return true;
3688
3689 case MINUS_EXPR:
3690 build_access_matrix_with_af (TREE_OPERAND (af, 0), cy, scop, ndim);
3691 build_access_matrix_with_af (TREE_OPERAND (af, 1), cy, scop, ndim);
3692 return true;
3693
3694 case INTEGER_CST:
3695 cy[ndim - 1] = int_cst_value (af);
3696 return true;
3697
3698 case SSA_NAME:
3699 param_col = param_index (af, scop);
3700 cy [ndim - scop_nb_params (scop) + param_col - 1] = 1;
3701 return true;
3702
3703 default:
3704 /* FIXME: access_fn can have parameters. */
3705 return false;
3706 }
3707 }
3708
3709 /* Initialize the access matrix in the data reference REF with respect
3710 to the loop nesting LOOP_NEST. Return true when the operation
3711 succeeded. */
3712
3713 static bool
3714 build_access_matrix (data_reference_p ref, graphite_bb_p gb)
3715 {
3716 int i, ndim = DR_NUM_DIMENSIONS (ref);
3717 struct access_matrix *am = GGC_NEW (struct access_matrix);
3718
3719 AM_MATRIX (am) = VEC_alloc (lambda_vector, gc, ndim);
3720 DR_SCOP (ref) = GBB_SCOP (gb);
3721
3722 for (i = 0; i < ndim; i++)
3723 {
3724 lambda_vector v = lambda_vector_new (ref_nb_loops (ref));
3725 scop_p scop = GBB_SCOP (gb);
3726 tree af = DR_ACCESS_FN (ref, i);
3727
3728 if (!build_access_matrix_with_af (af, v, scop, ref_nb_loops (ref)))
3729 return false;
3730
3731 VEC_quick_push (lambda_vector, AM_MATRIX (am), v);
3732 }
3733
3734 DR_ACCESS_MATRIX (ref) = am;
3735 return true;
3736 }
3737
3738 /* Build the access matrices for the data references in the SCOP. */
3739
3740 static void
3741 build_scop_data_accesses (scop_p scop)
3742 {
3743 int i;
3744 graphite_bb_p gb;
3745
3746 /* FIXME: Construction of access matrix is disabled until some
3747 pass, like the data dependence analysis, is using it. */
3748 return;
3749
3750 for (i = 0; VEC_iterate (graphite_bb_p, SCOP_BBS (scop), i, gb); i++)
3751 {
3752 int j;
3753 data_reference_p dr;
3754
3755 /* Construct the access matrix for each data ref, with respect to
3756 the loop nest of the current BB in the considered SCOP. */
3757 for (j = 0;
3758 VEC_iterate (data_reference_p, GBB_DATA_REFS (gb), j, dr);
3759 j++)
3760 {
3761 bool res = build_access_matrix (dr, gb);
3762
3763 /* FIXME: At this point the DRs should always have an affine
3764 form. For the moment this fails as build_access_matrix
3765 does not build matrices with parameters. */
3766 gcc_assert (res);
3767 }
3768 }
3769 }
3770
3771 /* Returns the tree variable from the name NAME that was given in
3772 Cloog representation. All the parameters are stored in PARAMS, and
3773 all the loop induction variables are stored in IVSTACK.
3774
3775 FIXME: This is a hack, and Cloog should be fixed to not work with
3776 variable names represented as "char *string", but with void
3777 pointers that could be casted back to a tree. The only problem in
3778 doing that is that Cloog's pretty printer still assumes that
3779 variable names are char *strings. The solution would be to have a
3780 function pointer for pretty-printing that can be redirected to be
3781 print_generic_stmt in our case, or fprintf by default.
3782 ??? Too ugly to live. */
3783
3784 static tree
3785 clast_name_to_gcc (const char *name, VEC (name_tree, heap) *params,
3786 loop_iv_stack ivstack)
3787 {
3788 int i;
3789 name_tree t;
3790 tree iv;
3791
3792 if (params)
3793 for (i = 0; VEC_iterate (name_tree, params, i, t); i++)
3794 if (!strcmp (name, t->name))
3795 return t->t;
3796
3797 iv = loop_iv_stack_get_iv_from_name (ivstack, name);
3798 if (iv)
3799 return iv;
3800
3801 gcc_unreachable ();
3802 }
3803
3804 /* Returns the maximal precision type for expressions E1 and E2. */
3805
3806 static inline tree
3807 max_precision_type (tree e1, tree e2)
3808 {
3809 tree type1 = TREE_TYPE (e1);
3810 tree type2 = TREE_TYPE (e2);
3811 return TYPE_PRECISION (type1) > TYPE_PRECISION (type2) ? type1 : type2;
3812 }
3813
3814 static tree
3815 clast_to_gcc_expression (tree, struct clast_expr *, VEC (name_tree, heap) *,
3816 loop_iv_stack);
3817
3818 /* Converts a Cloog reduction expression R with reduction operation OP
3819 to a GCC expression tree of type TYPE. PARAMS is a vector of
3820 parameters of the scop, and IVSTACK contains the stack of induction
3821 variables. */
3822
3823 static tree
3824 clast_to_gcc_expression_red (tree type, enum tree_code op,
3825 struct clast_reduction *r,
3826 VEC (name_tree, heap) *params,
3827 loop_iv_stack ivstack)
3828 {
3829 int i;
3830 tree res = clast_to_gcc_expression (type, r->elts[0], params, ivstack);
3831
3832 for (i = 1; i < r->n; i++)
3833 {
3834 tree t = clast_to_gcc_expression (type, r->elts[i], params, ivstack);
3835 res = fold_build2 (op, type, res, t);
3836 }
3837 return res;
3838 }
3839
3840 /* Converts a Cloog AST expression E back to a GCC expression tree of
3841 type TYPE. PARAMS is a vector of parameters of the scop, and
3842 IVSTACK contains the stack of induction variables. */
3843
3844 static tree
3845 clast_to_gcc_expression (tree type, struct clast_expr *e,
3846 VEC (name_tree, heap) *params,
3847 loop_iv_stack ivstack)
3848 {
3849 switch (e->type)
3850 {
3851 case expr_term:
3852 {
3853 struct clast_term *t = (struct clast_term *) e;
3854
3855 if (t->var)
3856 {
3857 if (value_one_p (t->val))
3858 {
3859 tree name = clast_name_to_gcc (t->var, params, ivstack);
3860 return fold_convert (type, name);
3861 }
3862
3863 else if (value_mone_p (t->val))
3864 {
3865 tree name = clast_name_to_gcc (t->var, params, ivstack);
3866 name = fold_convert (type, name);
3867 return fold_build1 (NEGATE_EXPR, type, name);
3868 }
3869 else
3870 {
3871 tree name = clast_name_to_gcc (t->var, params, ivstack);
3872 tree cst = gmp_cst_to_tree (type, t->val);
3873 name = fold_convert (type, name);
3874 return fold_build2 (MULT_EXPR, type, cst, name);
3875 }
3876 }
3877 else
3878 return gmp_cst_to_tree (type, t->val);
3879 }
3880
3881 case expr_red:
3882 {
3883 struct clast_reduction *r = (struct clast_reduction *) e;
3884
3885 switch (r->type)
3886 {
3887 case clast_red_sum:
3888 return clast_to_gcc_expression_red (type, PLUS_EXPR, r, params, ivstack);
3889
3890 case clast_red_min:
3891 return clast_to_gcc_expression_red (type, MIN_EXPR, r, params, ivstack);
3892
3893 case clast_red_max:
3894 return clast_to_gcc_expression_red (type, MAX_EXPR, r, params, ivstack);
3895
3896 default:
3897 gcc_unreachable ();
3898 }
3899 break;
3900 }
3901
3902 case expr_bin:
3903 {
3904 struct clast_binary *b = (struct clast_binary *) e;
3905 struct clast_expr *lhs = (struct clast_expr *) b->LHS;
3906 tree tl = clast_to_gcc_expression (type, lhs, params, ivstack);
3907 tree tr = gmp_cst_to_tree (type, b->RHS);
3908
3909 switch (b->type)
3910 {
3911 case clast_bin_fdiv:
3912 return fold_build2 (FLOOR_DIV_EXPR, type, tl, tr);
3913
3914 case clast_bin_cdiv:
3915 return fold_build2 (CEIL_DIV_EXPR, type, tl, tr);
3916
3917 case clast_bin_div:
3918 return fold_build2 (EXACT_DIV_EXPR, type, tl, tr);
3919
3920 case clast_bin_mod:
3921 return fold_build2 (TRUNC_MOD_EXPR, type, tl, tr);
3922
3923 default:
3924 gcc_unreachable ();
3925 }
3926 }
3927
3928 default:
3929 gcc_unreachable ();
3930 }
3931
3932 return NULL_TREE;
3933 }
3934
3935 /* Returns the type for the expression E. */
3936
3937 static tree
3938 gcc_type_for_clast_expr (struct clast_expr *e,
3939 VEC (name_tree, heap) *params,
3940 loop_iv_stack ivstack)
3941 {
3942 switch (e->type)
3943 {
3944 case expr_term:
3945 {
3946 struct clast_term *t = (struct clast_term *) e;
3947
3948 if (t->var)
3949 return TREE_TYPE (clast_name_to_gcc (t->var, params, ivstack));
3950 else
3951 return NULL_TREE;
3952 }
3953
3954 case expr_red:
3955 {
3956 struct clast_reduction *r = (struct clast_reduction *) e;
3957
3958 if (r->n == 1)
3959 return gcc_type_for_clast_expr (r->elts[0], params, ivstack);
3960 else
3961 {
3962 int i;
3963 for (i = 0; i < r->n; i++)
3964 {
3965 tree type = gcc_type_for_clast_expr (r->elts[i], params, ivstack);
3966 if (type)
3967 return type;
3968 }
3969 return NULL_TREE;
3970 }
3971 }
3972
3973 case expr_bin:
3974 {
3975 struct clast_binary *b = (struct clast_binary *) e;
3976 struct clast_expr *lhs = (struct clast_expr *) b->LHS;
3977 return gcc_type_for_clast_expr (lhs, params, ivstack);
3978 }
3979
3980 default:
3981 gcc_unreachable ();
3982 }
3983
3984 return NULL_TREE;
3985 }
3986
3987 /* Returns the type for the equation CLEQ. */
3988
3989 static tree
3990 gcc_type_for_clast_eq (struct clast_equation *cleq,
3991 VEC (name_tree, heap) *params,
3992 loop_iv_stack ivstack)
3993 {
3994 tree type = gcc_type_for_clast_expr (cleq->LHS, params, ivstack);
3995 if (type)
3996 return type;
3997
3998 return gcc_type_for_clast_expr (cleq->RHS, params, ivstack);
3999 }
4000
4001 /* Translates a clast equation CLEQ to a tree. */
4002
4003 static tree
4004 graphite_translate_clast_equation (scop_p scop,
4005 struct clast_equation *cleq,
4006 loop_iv_stack ivstack)
4007 {
4008 enum tree_code comp;
4009 tree type = gcc_type_for_clast_eq (cleq, SCOP_PARAMS (scop), ivstack);
4010 tree lhs = clast_to_gcc_expression (type, cleq->LHS, SCOP_PARAMS (scop), ivstack);
4011 tree rhs = clast_to_gcc_expression (type, cleq->RHS, SCOP_PARAMS (scop), ivstack);
4012
4013 if (cleq->sign == 0)
4014 comp = EQ_EXPR;
4015
4016 else if (cleq->sign > 0)
4017 comp = GE_EXPR;
4018
4019 else
4020 comp = LE_EXPR;
4021
4022 return fold_build2 (comp, type, lhs, rhs);
4023 }
4024
4025 /* Creates the test for the condition in STMT. */
4026
4027 static tree
4028 graphite_create_guard_cond_expr (scop_p scop, struct clast_guard *stmt,
4029 loop_iv_stack ivstack)
4030 {
4031 tree cond = NULL;
4032 int i;
4033
4034 for (i = 0; i < stmt->n; i++)
4035 {
4036 tree eq = graphite_translate_clast_equation (scop, &stmt->eq[i], ivstack);
4037
4038 if (cond)
4039 cond = fold_build2 (TRUTH_AND_EXPR, TREE_TYPE (eq), cond, eq);
4040 else
4041 cond = eq;
4042 }
4043
4044 return cond;
4045 }
4046
4047 /* Creates a new if region corresponding to Cloog's guard. */
4048
4049 static edge
4050 graphite_create_new_guard (scop_p scop, edge entry_edge,
4051 struct clast_guard *stmt,
4052 loop_iv_stack ivstack)
4053 {
4054 tree cond_expr = graphite_create_guard_cond_expr (scop, stmt, ivstack);
4055 edge exit_edge = create_empty_if_region_on_edge (entry_edge, cond_expr);
4056 return exit_edge;
4057 }
4058
4059 /* Walks a CLAST and returns the first statement in the body of a
4060 loop. */
4061
4062 static struct clast_user_stmt *
4063 clast_get_body_of_loop (struct clast_stmt *stmt)
4064 {
4065 if (!stmt
4066 || CLAST_STMT_IS_A (stmt, stmt_user))
4067 return (struct clast_user_stmt *) stmt;
4068
4069 if (CLAST_STMT_IS_A (stmt, stmt_for))
4070 return clast_get_body_of_loop (((struct clast_for *) stmt)->body);
4071
4072 if (CLAST_STMT_IS_A (stmt, stmt_guard))
4073 return clast_get_body_of_loop (((struct clast_guard *) stmt)->then);
4074
4075 if (CLAST_STMT_IS_A (stmt, stmt_block))
4076 return clast_get_body_of_loop (((struct clast_block *) stmt)->body);
4077
4078 gcc_unreachable ();
4079 }
4080
4081 /* Returns the induction variable for the loop that gets translated to
4082 STMT. */
4083
4084 static tree
4085 gcc_type_for_iv_of_clast_loop (struct clast_for *stmt_for)
4086 {
4087 struct clast_user_stmt *stmt = clast_get_body_of_loop ((struct clast_stmt *) stmt_for);
4088 const char *cloog_iv = stmt_for->iterator;
4089 CloogStatement *cs = stmt->statement;
4090 graphite_bb_p gbb = (graphite_bb_p) cloog_statement_usr (cs);
4091
4092 return gcc_type_for_cloog_iv (cloog_iv, gbb);
4093 }
4094
4095 /* Creates a new LOOP corresponding to Cloog's STMT. Inserts an induction
4096 variable for the new LOOP. New LOOP is attached to CFG starting at
4097 ENTRY_EDGE. LOOP is inserted into the loop tree and becomes the child
4098 loop of the OUTER_LOOP. */
4099
4100 static struct loop *
4101 graphite_create_new_loop (scop_p scop, edge entry_edge,
4102 struct clast_for *stmt, loop_iv_stack ivstack,
4103 loop_p outer)
4104 {
4105 tree type = gcc_type_for_iv_of_clast_loop (stmt);
4106 VEC (name_tree, heap) *params = SCOP_PARAMS (scop);
4107 tree lb = clast_to_gcc_expression (type, stmt->LB, params, ivstack);
4108 tree ub = clast_to_gcc_expression (type, stmt->UB, params, ivstack);
4109 tree stride = gmp_cst_to_tree (type, stmt->stride);
4110 tree ivvar = create_tmp_var (type, "graphiteIV");
4111 tree iv_before;
4112 loop_p loop = create_empty_loop_on_edge
4113 (entry_edge, lb, stride, ub, ivvar, &iv_before,
4114 outer ? outer : entry_edge->src->loop_father);
4115
4116 add_referenced_var (ivvar);
4117 loop_iv_stack_push_iv (ivstack, iv_before, stmt->iterator);
4118 return loop;
4119 }
4120
4121 /* Rename the SSA_NAMEs used in STMT and that appear in IVSTACK. */
4122
4123 static void
4124 rename_variables_in_stmt (gimple stmt, htab_t map)
4125 {
4126 ssa_op_iter iter;
4127 use_operand_p use_p;
4128
4129 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES)
4130 {
4131 tree use = USE_FROM_PTR (use_p);
4132 tree new_name = get_new_name_from_old_name (map, use);
4133
4134 replace_exp (use_p, new_name);
4135 }
4136
4137 update_stmt (stmt);
4138 }
4139
4140 /* Returns true if SSA_NAME is a parameter of SCOP. */
4141
4142 static bool
4143 is_parameter (scop_p scop, tree ssa_name)
4144 {
4145 int i;
4146 VEC (name_tree, heap) *params = SCOP_PARAMS (scop);
4147 name_tree param;
4148
4149 for (i = 0; VEC_iterate (name_tree, params, i, param); i++)
4150 if (param->t == ssa_name)
4151 return true;
4152
4153 return false;
4154 }
4155
4156 /* Returns true if NAME is an induction variable. */
4157
4158 static bool
4159 is_iv (tree name)
4160 {
4161 return gimple_code (SSA_NAME_DEF_STMT (name)) == GIMPLE_PHI;
4162 }
4163
4164 static void expand_scalar_variables_stmt (gimple, basic_block, scop_p,
4165 htab_t);
4166 static tree
4167 expand_scalar_variables_expr (tree, tree, enum tree_code, tree, basic_block,
4168 scop_p, htab_t, gimple_stmt_iterator *);
4169
4170 /* Copies at GSI all the scalar computations on which the ssa_name OP0
4171 depends on in the SCOP: these are all the scalar variables used in
4172 the definition of OP0, that are defined outside BB and still in the
4173 SCOP, i.e. not a parameter of the SCOP. The expression that is
4174 returned contains only induction variables from the generated code:
4175 MAP contains the induction variables renaming mapping, and is used
4176 to translate the names of induction variables. */
4177
4178 static tree
4179 expand_scalar_variables_ssa_name (tree op0, basic_block bb,
4180 scop_p scop, htab_t map,
4181 gimple_stmt_iterator *gsi)
4182 {
4183 tree var0, var1, type;
4184 gimple def_stmt;
4185 enum tree_code subcode;
4186
4187 if (is_parameter (scop, op0)
4188 || is_iv (op0))
4189 return get_new_name_from_old_name (map, op0);
4190
4191 def_stmt = SSA_NAME_DEF_STMT (op0);
4192
4193 if (gimple_bb (def_stmt) == bb)
4194 {
4195 /* If the defining statement is in the basic block already
4196 we do not need to create a new expression for it, we
4197 only need to ensure its operands are expanded. */
4198 expand_scalar_variables_stmt (def_stmt, bb, scop, map);
4199 return get_new_name_from_old_name (map, op0);
4200 }
4201 else
4202 {
4203 if (gimple_code (def_stmt) != GIMPLE_ASSIGN
4204 || !bb_in_sese_p (gimple_bb (def_stmt), SCOP_REGION (scop)))
4205 return get_new_name_from_old_name (map, op0);
4206
4207 var0 = gimple_assign_rhs1 (def_stmt);
4208 subcode = gimple_assign_rhs_code (def_stmt);
4209 var1 = gimple_assign_rhs2 (def_stmt);
4210 type = gimple_expr_type (def_stmt);
4211
4212 return expand_scalar_variables_expr (type, var0, subcode, var1, bb, scop,
4213 map, gsi);
4214 }
4215 }
4216
4217 /* Copies at GSI all the scalar computations on which the expression
4218 OP0 CODE OP1 depends on in the SCOP: these are all the scalar
4219 variables used in OP0 and OP1, defined outside BB and still defined
4220 in the SCOP, i.e. not a parameter of the SCOP. The expression that
4221 is returned contains only induction variables from the generated
4222 code: MAP contains the induction variables renaming mapping, and is
4223 used to translate the names of induction variables. */
4224
4225 static tree
4226 expand_scalar_variables_expr (tree type, tree op0, enum tree_code code,
4227 tree op1, basic_block bb, scop_p scop,
4228 htab_t map, gimple_stmt_iterator *gsi)
4229 {
4230 if (TREE_CODE_CLASS (code) == tcc_constant
4231 || TREE_CODE_CLASS (code) == tcc_declaration)
4232 return op0;
4233
4234 /* For data references we have to duplicate also its memory
4235 indexing. */
4236 if (TREE_CODE_CLASS (code) == tcc_reference)
4237 {
4238 switch (code)
4239 {
4240 case INDIRECT_REF:
4241 {
4242 tree old_name = TREE_OPERAND (op0, 0);
4243 tree expr = expand_scalar_variables_ssa_name
4244 (old_name, bb, scop, map, gsi);
4245 tree new_name = force_gimple_operand_gsi (gsi, expr, true, NULL,
4246 true, GSI_SAME_STMT);
4247
4248 return fold_build1 (code, type, new_name);
4249 }
4250
4251 case ARRAY_REF:
4252 {
4253 tree op00 = TREE_OPERAND (op0, 0);
4254 tree op01 = TREE_OPERAND (op0, 1);
4255 tree op02 = TREE_OPERAND (op0, 2);
4256 tree op03 = TREE_OPERAND (op0, 3);
4257 tree base = expand_scalar_variables_expr
4258 (TREE_TYPE (op00), op00, TREE_CODE (op00), NULL, bb, scop,
4259 map, gsi);
4260 tree subscript = expand_scalar_variables_expr
4261 (TREE_TYPE (op01), op01, TREE_CODE (op01), NULL, bb, scop,
4262 map, gsi);
4263
4264 return build4 (ARRAY_REF, type, base, subscript, op02, op03);
4265 }
4266
4267 default:
4268 /* The above cases should catch everything. */
4269 gcc_unreachable ();
4270 }
4271 }
4272
4273 if (TREE_CODE_CLASS (code) == tcc_unary)
4274 {
4275 tree op0_type = TREE_TYPE (op0);
4276 enum tree_code op0_code = TREE_CODE (op0);
4277 tree op0_expr = expand_scalar_variables_expr (op0_type, op0, op0_code,
4278 NULL, bb, scop, map, gsi);
4279
4280 return fold_build1 (code, type, op0_expr);
4281 }
4282
4283 if (TREE_CODE_CLASS (code) == tcc_binary)
4284 {
4285 tree op0_type = TREE_TYPE (op0);
4286 enum tree_code op0_code = TREE_CODE (op0);
4287 tree op0_expr = expand_scalar_variables_expr (op0_type, op0, op0_code,
4288 NULL, bb, scop, map, gsi);
4289 tree op1_type = TREE_TYPE (op1);
4290 enum tree_code op1_code = TREE_CODE (op1);
4291 tree op1_expr = expand_scalar_variables_expr (op1_type, op1, op1_code,
4292 NULL, bb, scop, map, gsi);
4293
4294 return fold_build2 (code, type, op0_expr, op1_expr);
4295 }
4296
4297 if (code == SSA_NAME)
4298 return expand_scalar_variables_ssa_name (op0, bb, scop, map, gsi);
4299
4300 gcc_unreachable ();
4301 return NULL;
4302 }
4303
4304 /* Copies at the beginning of BB all the scalar computations on which
4305 STMT depends on in the SCOP: these are all the scalar variables used
4306 in STMT, defined outside BB and still defined in the SCOP, i.e. not a
4307 parameter of the SCOP. The expression that is returned contains
4308 only induction variables from the generated code: MAP contains the
4309 induction variables renaming mapping, and is used to translate the
4310 names of induction variables. */
4311
4312 static void
4313 expand_scalar_variables_stmt (gimple stmt, basic_block bb, scop_p scop,
4314 htab_t map)
4315 {
4316 ssa_op_iter iter;
4317 use_operand_p use_p;
4318 gimple_stmt_iterator gsi = gsi_after_labels (bb);
4319
4320 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE)
4321 {
4322 tree use = USE_FROM_PTR (use_p);
4323 tree type = TREE_TYPE (use);
4324 enum tree_code code = TREE_CODE (use);
4325 tree use_expr = expand_scalar_variables_expr (type, use, code, NULL, bb,
4326 scop, map, &gsi);
4327 if (use_expr != use)
4328 {
4329 tree new_use =
4330 force_gimple_operand_gsi (&gsi, use_expr, true, NULL,
4331 true, GSI_NEW_STMT);
4332 replace_exp (use_p, new_use);
4333 }
4334 }
4335
4336 update_stmt (stmt);
4337 }
4338
4339 /* Copies at the beginning of BB all the scalar computations on which
4340 BB depends on in the SCOP: these are all the scalar variables used
4341 in BB, defined outside BB and still defined in the SCOP, i.e. not a
4342 parameter of the SCOP. The expression that is returned contains
4343 only induction variables from the generated code: MAP contains the
4344 induction variables renaming mapping, and is used to translate the
4345 names of induction variables. */
4346
4347 static void
4348 expand_scalar_variables (basic_block bb, scop_p scop, htab_t map)
4349 {
4350 gimple_stmt_iterator gsi;
4351
4352 for (gsi = gsi_after_labels (bb); !gsi_end_p (gsi);)
4353 {
4354 gimple stmt = gsi_stmt (gsi);
4355 expand_scalar_variables_stmt (stmt, bb, scop, map);
4356 gsi_next (&gsi);
4357 }
4358 }
4359
4360 /* Rename all the SSA_NAMEs from block BB according to the MAP. */
4361
4362 static void
4363 rename_variables (basic_block bb, htab_t map)
4364 {
4365 gimple_stmt_iterator gsi;
4366
4367 for (gsi = gsi_after_labels (bb); !gsi_end_p (gsi); gsi_next (&gsi))
4368 rename_variables_in_stmt (gsi_stmt (gsi), map);
4369 }
4370
4371 /* Remove condition from BB. */
4372
4373 static void
4374 remove_condition (basic_block bb)
4375 {
4376 gimple last = last_stmt (bb);
4377
4378 if (last && gimple_code (last) == GIMPLE_COND)
4379 {
4380 gimple_stmt_iterator gsi = gsi_last_bb (bb);
4381 gsi_remove (&gsi, true);
4382 }
4383 }
4384
4385 /* Returns the first successor edge of BB with EDGE_TRUE_VALUE flag set. */
4386
4387 static edge
4388 get_true_edge_from_guard_bb (basic_block bb)
4389 {
4390 edge e;
4391 edge_iterator ei;
4392
4393 FOR_EACH_EDGE (e, ei, bb->succs)
4394 if (e->flags & EDGE_TRUE_VALUE)
4395 return e;
4396
4397 gcc_unreachable ();
4398 return NULL;
4399 }
4400
4401 /* Returns the first successor edge of BB with EDGE_TRUE_VALUE flag cleared. */
4402
4403 static edge
4404 get_false_edge_from_guard_bb (basic_block bb)
4405 {
4406 edge e;
4407 edge_iterator ei;
4408
4409 FOR_EACH_EDGE (e, ei, bb->succs)
4410 if (!(e->flags & EDGE_TRUE_VALUE))
4411 return e;
4412
4413 gcc_unreachable ();
4414 return NULL;
4415 }
4416
4417 /* Inserts in MAP a tuple (OLD_NAME, NEW_NAME) for the induction
4418 variables of the loops around GBB in SCOP, i.e. GBB_LOOPS.
4419 NEW_NAME is obtained from IVSTACK. IVSTACK has the same stack
4420 ordering as GBB_LOOPS. */
4421
4422 static void
4423 build_iv_mapping (loop_iv_stack ivstack, htab_t map, gbb_p gbb, scop_p scop)
4424 {
4425 int i;
4426 name_tree iv;
4427 PTR *slot;
4428
4429 for (i = 0; VEC_iterate (name_tree, SCOP_OLDIVS (scop), i, iv); i++)
4430 {
4431 struct rename_map_elt_d tmp;
4432
4433 if (!flow_bb_inside_loop_p (iv->loop, GBB_BB (gbb)))
4434 continue;
4435
4436 tmp.old_name = iv->t;
4437 slot = htab_find_slot (map, &tmp, INSERT);
4438
4439 if (!*slot)
4440 {
4441 tree new_name = loop_iv_stack_get_iv (ivstack,
4442 gbb_loop_index (gbb, iv->loop));
4443 *slot = new_rename_map_elt (iv->t, new_name);
4444 }
4445 }
4446 }
4447
4448 /* Register in MAP the tuple (old_name, new_name). */
4449
4450 static void
4451 register_old_and_new_names (htab_t map, tree old_name, tree new_name)
4452 {
4453 struct rename_map_elt_d tmp;
4454 PTR *slot;
4455
4456 tmp.old_name = old_name;
4457 slot = htab_find_slot (map, &tmp, INSERT);
4458
4459 if (!*slot)
4460 *slot = new_rename_map_elt (old_name, new_name);
4461 }
4462
4463 /* Create a duplicate of the basic block BB. NOTE: This does not
4464 preserve SSA form. */
4465
4466 static void
4467 graphite_copy_stmts_from_block (basic_block bb, basic_block new_bb, htab_t map)
4468 {
4469 gimple_stmt_iterator gsi, gsi_tgt;
4470
4471 gsi_tgt = gsi_start_bb (new_bb);
4472 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
4473 {
4474 def_operand_p def_p;
4475 ssa_op_iter op_iter;
4476 int region;
4477 gimple stmt = gsi_stmt (gsi);
4478 gimple copy;
4479
4480 if (gimple_code (stmt) == GIMPLE_LABEL)
4481 continue;
4482
4483 /* Create a new copy of STMT and duplicate STMT's virtual
4484 operands. */
4485 copy = gimple_copy (stmt);
4486 gsi_insert_after (&gsi_tgt, copy, GSI_NEW_STMT);
4487 mark_sym_for_renaming (gimple_vop (cfun));
4488
4489 region = lookup_stmt_eh_region (stmt);
4490 if (region >= 0)
4491 add_stmt_to_eh_region (copy, region);
4492 gimple_duplicate_stmt_histograms (cfun, copy, cfun, stmt);
4493
4494 /* Create new names for all the definitions created by COPY and
4495 add replacement mappings for each new name. */
4496 FOR_EACH_SSA_DEF_OPERAND (def_p, copy, op_iter, SSA_OP_ALL_DEFS)
4497 {
4498 tree old_name = DEF_FROM_PTR (def_p);
4499 tree new_name = create_new_def_for (old_name, copy, def_p);
4500 register_old_and_new_names (map, old_name, new_name);
4501 }
4502 }
4503 }
4504
4505 /* Records in SCOP_LIVEOUT_RENAMES the names that are live out of
4506 the SCOP and that appear in the RENAME_MAP. */
4507
4508 static void
4509 register_scop_liveout_renames (scop_p scop, htab_t rename_map)
4510 {
4511 int i;
4512 sese region = SCOP_REGION (scop);
4513
4514 for (i = 0; i < SESE_NUM_VER (region); i++)
4515 if (bitmap_bit_p (SESE_LIVEOUT (region), i)
4516 && is_gimple_reg (ssa_name (i)))
4517 {
4518 tree old_name = ssa_name (i);
4519 tree new_name = get_new_name_from_old_name (rename_map, old_name);
4520
4521 register_old_and_new_names (SCOP_LIVEOUT_RENAMES (scop),
4522 old_name, new_name);
4523 }
4524 }
4525
4526 /* Copies BB and includes in the copied BB all the statements that can
4527 be reached following the use-def chains from the memory accesses,
4528 and returns the next edge following this new block. */
4529
4530 static edge
4531 copy_bb_and_scalar_dependences (basic_block bb, scop_p scop,
4532 edge next_e, htab_t map)
4533 {
4534 basic_block new_bb = split_edge (next_e);
4535
4536 next_e = single_succ_edge (new_bb);
4537 graphite_copy_stmts_from_block (bb, new_bb, map);
4538 remove_condition (new_bb);
4539 rename_variables (new_bb, map);
4540 remove_phi_nodes (new_bb);
4541 expand_scalar_variables (new_bb, scop, map);
4542 register_scop_liveout_renames (scop, map);
4543
4544 return next_e;
4545 }
4546
4547 /* Helper function for htab_traverse in insert_loop_close_phis. */
4548
4549 static int
4550 add_loop_exit_phis (void **slot, void *s)
4551 {
4552 struct rename_map_elt_d *entry = (struct rename_map_elt_d *) *slot;
4553 tree new_name = entry->new_name;
4554 basic_block bb = (basic_block) s;
4555 gimple phi = create_phi_node (new_name, bb);
4556 tree res = create_new_def_for (gimple_phi_result (phi), phi,
4557 gimple_phi_result_ptr (phi));
4558
4559 add_phi_arg (phi, new_name, single_pred_edge (bb));
4560
4561 entry->new_name = res;
4562 *slot = entry;
4563 return 1;
4564 }
4565
4566 /* Iterate over the SCOP_LIVEOUT_RENAMES (SCOP) and get tuples of the
4567 form (OLD_NAME, NEW_NAME). Insert in BB "RES = phi (NEW_NAME)",
4568 and finally register in SCOP_LIVEOUT_RENAMES (scop) the tuple
4569 (OLD_NAME, RES). */
4570
4571 static void
4572 insert_loop_close_phis (scop_p scop, basic_block bb)
4573 {
4574 update_ssa (TODO_update_ssa);
4575 htab_traverse (SCOP_LIVEOUT_RENAMES (scop), add_loop_exit_phis, bb);
4576 update_ssa (TODO_update_ssa);
4577 }
4578
4579 /* Helper structure for htab_traverse in insert_guard_phis. */
4580
4581 struct igp {
4582 basic_block bb;
4583 edge true_edge, false_edge;
4584 htab_t liveout_before_guard;
4585 };
4586
4587 /* Return the default name that is before the guard. */
4588
4589 static tree
4590 default_liveout_before_guard (htab_t liveout_before_guard, tree old_name)
4591 {
4592 tree res = get_new_name_from_old_name (liveout_before_guard, old_name);
4593
4594 if (res == old_name)
4595 {
4596 if (is_gimple_reg (res))
4597 return fold_convert (TREE_TYPE (res), integer_zero_node);
4598 return gimple_default_def (cfun, res);
4599 }
4600
4601 return res;
4602 }
4603
4604 /* Helper function for htab_traverse in insert_guard_phis. */
4605
4606 static int
4607 add_guard_exit_phis (void **slot, void *s)
4608 {
4609 struct rename_map_elt_d *entry = (struct rename_map_elt_d *) *slot;
4610 struct igp *i = (struct igp *) s;
4611 basic_block bb = i->bb;
4612 edge true_edge = i->true_edge;
4613 edge false_edge = i->false_edge;
4614 tree name1 = entry->new_name;
4615 tree name2 = default_liveout_before_guard (i->liveout_before_guard,
4616 entry->old_name);
4617 gimple phi = create_phi_node (name1, bb);
4618 tree res = create_new_def_for (gimple_phi_result (phi), phi,
4619 gimple_phi_result_ptr (phi));
4620
4621 add_phi_arg (phi, name1, true_edge);
4622 add_phi_arg (phi, name2, false_edge);
4623
4624 entry->new_name = res;
4625 *slot = entry;
4626 return 1;
4627 }
4628
4629 /* Iterate over the SCOP_LIVEOUT_RENAMES (SCOP) and get tuples of the
4630 form (OLD_NAME, NAME1). If there is a correspondent tuple of
4631 OLD_NAME in LIVEOUT_BEFORE_GUARD, i.e. (OLD_NAME, NAME2) then
4632 insert in BB
4633
4634 | RES = phi (NAME1 (on TRUE_EDGE), NAME2 (on FALSE_EDGE))"
4635
4636 if there is no tuple for OLD_NAME in LIVEOUT_BEFORE_GUARD, insert
4637
4638 | RES = phi (NAME1 (on TRUE_EDGE),
4639 | DEFAULT_DEFINITION of NAME1 (on FALSE_EDGE))".
4640
4641 Finally register in SCOP_LIVEOUT_RENAMES (scop) the tuple
4642 (OLD_NAME, RES). */
4643
4644 static void
4645 insert_guard_phis (scop_p scop, basic_block bb, edge true_edge,
4646 edge false_edge, htab_t liveout_before_guard)
4647 {
4648 struct igp i;
4649 i.bb = bb;
4650 i.true_edge = true_edge;
4651 i.false_edge = false_edge;
4652 i.liveout_before_guard = liveout_before_guard;
4653
4654 update_ssa (TODO_update_ssa);
4655 htab_traverse (SCOP_LIVEOUT_RENAMES (scop), add_guard_exit_phis, &i);
4656 update_ssa (TODO_update_ssa);
4657 }
4658
4659 /* Helper function for htab_traverse. */
4660
4661 static int
4662 copy_renames (void **slot, void *s)
4663 {
4664 struct rename_map_elt_d *entry = (struct rename_map_elt_d *) *slot;
4665 htab_t res = (htab_t) s;
4666 tree old_name = entry->old_name;
4667 tree new_name = entry->new_name;
4668 struct rename_map_elt_d tmp;
4669 PTR *x;
4670
4671 tmp.old_name = old_name;
4672 x = htab_find_slot (res, &tmp, INSERT);
4673
4674 if (!*x)
4675 *x = new_rename_map_elt (old_name, new_name);
4676
4677 return 1;
4678 }
4679
4680 /* Translates a CLAST statement STMT to GCC representation in the
4681 context of a SCOP.
4682
4683 - NEXT_E is the edge where new generated code should be attached.
4684 - CONTEXT_LOOP is the loop in which the generated code will be placed
4685 (might be NULL).
4686 - IVSTACK contains the surrounding loops around the statement to be
4687 translated.
4688 */
4689
4690 static edge
4691 translate_clast (scop_p scop, struct loop *context_loop,
4692 struct clast_stmt *stmt, edge next_e, loop_iv_stack ivstack)
4693 {
4694 if (!stmt)
4695 return next_e;
4696
4697 if (CLAST_STMT_IS_A (stmt, stmt_root))
4698 return translate_clast (scop, context_loop, stmt->next, next_e, ivstack);
4699
4700 if (CLAST_STMT_IS_A (stmt, stmt_user))
4701 {
4702 htab_t map;
4703 CloogStatement *cs = ((struct clast_user_stmt *) stmt)->statement;
4704 graphite_bb_p gbb = (graphite_bb_p) cloog_statement_usr (cs);
4705
4706 if (GBB_BB (gbb) == ENTRY_BLOCK_PTR)
4707 return next_e;
4708
4709 map = htab_create (10, rename_map_elt_info, eq_rename_map_elts, free);
4710 loop_iv_stack_patch_for_consts (ivstack, (struct clast_user_stmt *) stmt);
4711 build_iv_mapping (ivstack, map, gbb, scop);
4712 next_e = copy_bb_and_scalar_dependences (GBB_BB (gbb), scop,
4713 next_e, map);
4714 htab_delete (map);
4715 loop_iv_stack_remove_constants (ivstack);
4716 recompute_all_dominators ();
4717 update_ssa (TODO_update_ssa);
4718 graphite_verify ();
4719 return translate_clast (scop, context_loop, stmt->next, next_e, ivstack);
4720 }
4721
4722 if (CLAST_STMT_IS_A (stmt, stmt_for))
4723 {
4724 struct loop *loop
4725 = graphite_create_new_loop (scop, next_e, (struct clast_for *) stmt,
4726 ivstack, context_loop ? context_loop
4727 : get_loop (0));
4728 edge last_e = single_exit (loop);
4729
4730 next_e = translate_clast (scop, loop, ((struct clast_for *) stmt)->body,
4731 single_pred_edge (loop->latch), ivstack);
4732 redirect_edge_succ_nodup (next_e, loop->latch);
4733
4734 set_immediate_dominator (CDI_DOMINATORS, next_e->dest, next_e->src);
4735 loop_iv_stack_pop (ivstack);
4736 last_e = single_succ_edge (split_edge (last_e));
4737 insert_loop_close_phis (scop, last_e->src);
4738
4739 recompute_all_dominators ();
4740 graphite_verify ();
4741 return translate_clast (scop, context_loop, stmt->next, last_e, ivstack);
4742 }
4743
4744 if (CLAST_STMT_IS_A (stmt, stmt_guard))
4745 {
4746 htab_t liveout_before_guard = htab_create (10, rename_map_elt_info,
4747 eq_rename_map_elts, free);
4748 edge last_e = graphite_create_new_guard (scop, next_e,
4749 ((struct clast_guard *) stmt),
4750 ivstack);
4751 edge true_e = get_true_edge_from_guard_bb (next_e->dest);
4752 edge false_e = get_false_edge_from_guard_bb (next_e->dest);
4753 edge exit_true_e = single_succ_edge (true_e->dest);
4754 edge exit_false_e = single_succ_edge (false_e->dest);
4755
4756 htab_traverse (SCOP_LIVEOUT_RENAMES (scop), copy_renames,
4757 liveout_before_guard);
4758
4759 next_e = translate_clast (scop, context_loop,
4760 ((struct clast_guard *) stmt)->then,
4761 true_e, ivstack);
4762 insert_guard_phis (scop, last_e->src, exit_true_e, exit_false_e,
4763 liveout_before_guard);
4764 htab_delete (liveout_before_guard);
4765 recompute_all_dominators ();
4766 graphite_verify ();
4767
4768 return translate_clast (scop, context_loop, stmt->next, last_e, ivstack);
4769 }
4770
4771 if (CLAST_STMT_IS_A (stmt, stmt_block))
4772 {
4773 next_e = translate_clast (scop, context_loop,
4774 ((struct clast_block *) stmt)->body,
4775 next_e, ivstack);
4776 recompute_all_dominators ();
4777 graphite_verify ();
4778 return translate_clast (scop, context_loop, stmt->next, next_e, ivstack);
4779 }
4780
4781 gcc_unreachable ();
4782 }
4783
4784 /* Free the SCATTERING domain list. */
4785
4786 static void
4787 free_scattering (CloogDomainList *scattering)
4788 {
4789 while (scattering)
4790 {
4791 CloogDomain *dom = cloog_domain (scattering);
4792 CloogDomainList *next = cloog_next_domain (scattering);
4793
4794 cloog_domain_free (dom);
4795 free (scattering);
4796 scattering = next;
4797 }
4798 }
4799
4800 /* Build cloog program for SCoP. */
4801
4802 static void
4803 build_cloog_prog (scop_p scop)
4804 {
4805 int i;
4806 int max_nb_loops = scop_max_loop_depth (scop);
4807 graphite_bb_p gbb;
4808 CloogLoop *loop_list = NULL;
4809 CloogBlockList *block_list = NULL;
4810 CloogDomainList *scattering = NULL;
4811 CloogProgram *prog = SCOP_PROG (scop);
4812 int nbs = 2 * max_nb_loops + 1;
4813 int *scaldims = (int *) xmalloc (nbs * (sizeof (int)));
4814
4815 cloog_program_set_nb_scattdims (prog, nbs);
4816 initialize_cloog_names (scop);
4817
4818 for (i = 0; VEC_iterate (graphite_bb_p, SCOP_BBS (scop), i, gbb); i++)
4819 {
4820 /* Build new block. */
4821 CloogMatrix *domain = GBB_DOMAIN (gbb);
4822 CloogStatement *stmt = cloog_statement_alloc (GBB_BB (gbb)->index);
4823 CloogBlock *block = cloog_block_alloc (stmt, 0, NULL,
4824 nb_loops_around_gb (gbb));
4825 cloog_statement_set_usr (stmt, gbb);
4826
4827 /* Add empty domain to all bbs, which do not yet have a domain, as they
4828 are not part of any loop. */
4829 if (domain == NULL)
4830 {
4831 domain = cloog_matrix_alloc (0, scop_nb_params (scop) + 2);
4832 GBB_DOMAIN (gbb) = domain;
4833 }
4834
4835 /* Build loop list. */
4836 {
4837 CloogLoop *new_loop_list = cloog_loop_malloc ();
4838 cloog_loop_set_next (new_loop_list, loop_list);
4839 cloog_loop_set_domain (new_loop_list,
4840 cloog_domain_matrix2domain (domain));
4841 cloog_loop_set_block (new_loop_list, block);
4842 loop_list = new_loop_list;
4843 }
4844
4845 /* Build block list. */
4846 {
4847 CloogBlockList *new_block_list = cloog_block_list_malloc ();
4848
4849 cloog_block_list_set_next (new_block_list, block_list);
4850 cloog_block_list_set_block (new_block_list, block);
4851 block_list = new_block_list;
4852 }
4853
4854 /* Build scattering list. */
4855 {
4856 /* XXX: Replace with cloog_domain_list_alloc(), when available. */
4857 CloogDomainList *new_scattering
4858 = (CloogDomainList *) xmalloc (sizeof (CloogDomainList));
4859 CloogMatrix *scat_mat = schedule_to_scattering (gbb, nbs);
4860
4861 cloog_set_next_domain (new_scattering, scattering);
4862 cloog_set_domain (new_scattering,
4863 cloog_domain_matrix2domain (scat_mat));
4864 scattering = new_scattering;
4865 cloog_matrix_free (scat_mat);
4866 }
4867 }
4868
4869 cloog_program_set_loop (prog, loop_list);
4870 cloog_program_set_blocklist (prog, block_list);
4871
4872 for (i = 0; i < nbs; i++)
4873 scaldims[i] = 0 ;
4874
4875 cloog_program_set_scaldims (prog, scaldims);
4876
4877 /* Extract scalar dimensions to simplify the code generation problem. */
4878 cloog_program_extract_scalars (prog, scattering);
4879
4880 /* Apply scattering. */
4881 cloog_program_scatter (prog, scattering);
4882 free_scattering (scattering);
4883
4884 /* Iterators corresponding to scalar dimensions have to be extracted. */
4885 cloog_names_scalarize (cloog_program_names (prog), nbs,
4886 cloog_program_scaldims (prog));
4887
4888 /* Free blocklist. */
4889 {
4890 CloogBlockList *next = cloog_program_blocklist (prog);
4891
4892 while (next)
4893 {
4894 CloogBlockList *toDelete = next;
4895 next = cloog_block_list_next (next);
4896 cloog_block_list_set_next (toDelete, NULL);
4897 cloog_block_list_set_block (toDelete, NULL);
4898 cloog_block_list_free (toDelete);
4899 }
4900 cloog_program_set_blocklist (prog, NULL);
4901 }
4902 }
4903
4904 /* Return the options that will be used in GLOOG. */
4905
4906 static CloogOptions *
4907 set_cloog_options (void)
4908 {
4909 CloogOptions *options = cloog_options_malloc ();
4910
4911 /* Change cloog output language to C. If we do use FORTRAN instead, cloog
4912 will stop e.g. with "ERROR: unbounded loops not allowed in FORTRAN.", if
4913 we pass an incomplete program to cloog. */
4914 options->language = LANGUAGE_C;
4915
4916 /* Enable complex equality spreading: removes dummy statements
4917 (assignments) in the generated code which repeats the
4918 substitution equations for statements. This is useless for
4919 GLooG. */
4920 options->esp = 1;
4921
4922 /* Enable C pretty-printing mode: normalizes the substitution
4923 equations for statements. */
4924 options->cpp = 1;
4925
4926 /* Allow cloog to build strides with a stride width different to one.
4927 This example has stride = 4:
4928
4929 for (i = 0; i < 20; i += 4)
4930 A */
4931 options->strides = 1;
4932
4933 /* Disable optimizations and make cloog generate source code closer to the
4934 input. This is useful for debugging, but later we want the optimized
4935 code.
4936
4937 XXX: We can not disable optimizations, as loop blocking is not working
4938 without them. */
4939 if (0)
4940 {
4941 options->f = -1;
4942 options->l = INT_MAX;
4943 }
4944
4945 return options;
4946 }
4947
4948 /* Prints STMT to STDERR. */
4949
4950 void
4951 debug_clast_stmt (struct clast_stmt *stmt)
4952 {
4953 CloogOptions *options = set_cloog_options ();
4954
4955 pprint (stderr, stmt, 0, options);
4956 }
4957
4958 /* Find the right transform for the SCOP, and return a Cloog AST
4959 representing the new form of the program. */
4960
4961 static struct clast_stmt *
4962 find_transform (scop_p scop)
4963 {
4964 struct clast_stmt *stmt;
4965 CloogOptions *options = set_cloog_options ();
4966
4967 /* Connect new cloog prog generation to graphite. */
4968 build_cloog_prog (scop);
4969
4970 if (dump_file && (dump_flags & TDF_DETAILS))
4971 {
4972 fprintf (dump_file, "Cloog Input [\n");
4973 cloog_program_print (dump_file, SCOP_PROG(scop));
4974 fprintf (dump_file, "]\n");
4975 }
4976
4977 SCOP_PROG (scop) = cloog_program_generate (SCOP_PROG (scop), options);
4978 stmt = cloog_clast_create (SCOP_PROG (scop), options);
4979
4980 if (dump_file && (dump_flags & TDF_DETAILS))
4981 {
4982 fprintf (dump_file, "Cloog Output[\n");
4983 pprint (dump_file, stmt, 0, options);
4984 cloog_program_dump_cloog (dump_file, SCOP_PROG (scop));
4985 fprintf (dump_file, "]\n");
4986 }
4987
4988 cloog_options_free (options);
4989 return stmt;
4990 }
4991
4992 /* Remove from the CFG the REGION. */
4993
4994 static inline void
4995 remove_sese_region (sese region)
4996 {
4997 VEC (basic_block, heap) *bbs = NULL;
4998 basic_block entry_bb = SESE_ENTRY (region)->dest;
4999 basic_block exit_bb = SESE_EXIT (region)->dest;
5000 basic_block bb;
5001 int i;
5002
5003 VEC_safe_push (basic_block, heap, bbs, entry_bb);
5004 gather_blocks_in_sese_region (entry_bb, exit_bb, &bbs);
5005
5006 for (i = 0; VEC_iterate (basic_block, bbs, i, bb); i++)
5007 delete_basic_block (bb);
5008
5009 VEC_free (basic_block, heap, bbs);
5010 }
5011
5012 typedef struct ifsese_d
5013 {
5014 sese region;
5015 sese true_region;
5016 sese false_region;
5017 } *ifsese;
5018
5019 static inline edge
5020 if_region_entry (ifsese if_region)
5021 {
5022 return SESE_ENTRY (if_region->region);
5023 }
5024
5025 static inline edge
5026 if_region_exit (ifsese if_region)
5027 {
5028 return SESE_EXIT (if_region->region);
5029 }
5030
5031 static inline basic_block
5032 if_region_get_condition_block (ifsese if_region)
5033 {
5034 return if_region_entry (if_region)->dest;
5035 }
5036
5037 static inline void
5038 if_region_set_false_region (ifsese if_region, sese region)
5039 {
5040 basic_block condition = if_region_get_condition_block (if_region);
5041 edge false_edge = get_false_edge_from_guard_bb (condition);
5042 basic_block dummy = false_edge->dest;
5043 edge entry_region = SESE_ENTRY (region);
5044 edge exit_region = SESE_EXIT (region);
5045 basic_block before_region = entry_region->src;
5046 basic_block last_in_region = exit_region->src;
5047 void **slot = htab_find_slot_with_hash (current_loops->exits, exit_region,
5048 htab_hash_pointer (exit_region),
5049 NO_INSERT);
5050
5051 entry_region->flags = false_edge->flags;
5052 false_edge->flags = exit_region->flags;
5053
5054 redirect_edge_pred (entry_region, condition);
5055 redirect_edge_pred (exit_region, before_region);
5056 redirect_edge_pred (false_edge, last_in_region);
5057 redirect_edge_succ (false_edge, single_succ (dummy));
5058 delete_basic_block (dummy);
5059
5060 exit_region->flags = EDGE_FALLTHRU;
5061 recompute_all_dominators ();
5062
5063 SESE_EXIT (region) = false_edge;
5064 if_region->false_region = region;
5065
5066 if (slot)
5067 {
5068 struct loop_exit *loop_exit = GGC_CNEW (struct loop_exit);
5069
5070 memcpy (loop_exit, *((struct loop_exit **) slot), sizeof (struct loop_exit));
5071 htab_clear_slot (current_loops->exits, slot);
5072
5073 slot = htab_find_slot_with_hash (current_loops->exits, false_edge,
5074 htab_hash_pointer (false_edge),
5075 INSERT);
5076 loop_exit->e = false_edge;
5077 *slot = loop_exit;
5078 false_edge->src->loop_father->exits->next = loop_exit;
5079 }
5080 }
5081
5082 static ifsese
5083 create_if_region_on_edge (edge entry, tree condition)
5084 {
5085 edge e;
5086 edge_iterator ei;
5087 sese sese_region = GGC_NEW (struct sese_d);
5088 sese true_region = GGC_NEW (struct sese_d);
5089 sese false_region = GGC_NEW (struct sese_d);
5090 ifsese if_region = GGC_NEW (struct ifsese_d);
5091 edge exit = create_empty_if_region_on_edge (entry, condition);
5092
5093 if_region->region = sese_region;
5094 if_region->region->entry = entry;
5095 if_region->region->exit = exit;
5096
5097 FOR_EACH_EDGE (e, ei, entry->dest->succs)
5098 {
5099 if (e->flags & EDGE_TRUE_VALUE)
5100 {
5101 true_region->entry = e;
5102 true_region->exit = single_succ_edge (e->dest);
5103 if_region->true_region = true_region;
5104 }
5105 else if (e->flags & EDGE_FALSE_VALUE)
5106 {
5107 false_region->entry = e;
5108 false_region->exit = single_succ_edge (e->dest);
5109 if_region->false_region = false_region;
5110 }
5111 }
5112
5113 return if_region;
5114 }
5115
5116 /* Moves REGION in a condition expression:
5117 | if (1)
5118 | ;
5119 | else
5120 | REGION;
5121 */
5122
5123 static ifsese
5124 move_sese_in_condition (sese region)
5125 {
5126 basic_block pred_block = split_edge (SESE_ENTRY (region));
5127 ifsese if_region = NULL;
5128
5129 SESE_ENTRY (region) = single_succ_edge (pred_block);
5130 if_region = create_if_region_on_edge (single_pred_edge (pred_block), integer_one_node);
5131 if_region_set_false_region (if_region, region);
5132
5133 return if_region;
5134 }
5135
5136 /* Add exit phis for USE on EXIT. */
5137
5138 static void
5139 scop_add_exit_phis_edge (basic_block exit, tree use, edge false_e, edge true_e)
5140 {
5141 gimple phi = create_phi_node (use, exit);
5142
5143 create_new_def_for (gimple_phi_result (phi), phi,
5144 gimple_phi_result_ptr (phi));
5145 add_phi_arg (phi, use, false_e);
5146 add_phi_arg (phi, use, true_e);
5147 }
5148
5149 /* Add phi nodes for VAR that is used in LIVEIN. Phi nodes are
5150 inserted in block BB. */
5151
5152 static void
5153 scop_add_exit_phis_var (basic_block bb, tree var, bitmap livein,
5154 edge false_e, edge true_e)
5155 {
5156 bitmap def;
5157 basic_block def_bb = gimple_bb (SSA_NAME_DEF_STMT (var));
5158
5159 if (is_gimple_reg (var))
5160 bitmap_clear_bit (livein, def_bb->index);
5161 else
5162 bitmap_set_bit (livein, def_bb->index);
5163
5164 def = BITMAP_ALLOC (NULL);
5165 bitmap_set_bit (def, def_bb->index);
5166 compute_global_livein (livein, def);
5167 BITMAP_FREE (def);
5168
5169 scop_add_exit_phis_edge (bb, var, false_e, true_e);
5170 }
5171
5172 /* Insert in the block BB phi nodes for variables defined in REGION
5173 and used outside the REGION. The code generation moves REGION in
5174 the else clause of an "if (1)" and generates code in the then
5175 clause that is at this point empty:
5176
5177 | if (1)
5178 | empty;
5179 | else
5180 | REGION;
5181 */
5182
5183 static void
5184 scop_insert_phis_for_liveouts (sese region, basic_block bb,
5185 edge false_e, edge true_e)
5186 {
5187 unsigned i;
5188 bitmap_iterator bi;
5189
5190 update_ssa (TODO_update_ssa);
5191
5192 EXECUTE_IF_SET_IN_BITMAP (SESE_LIVEOUT (region), 0, i, bi)
5193 scop_add_exit_phis_var (bb, ssa_name (i), SESE_LIVEIN_VER (region, i),
5194 false_e, true_e);
5195
5196 update_ssa (TODO_update_ssa);
5197 }
5198
5199 /* Get the definition of NAME before the SCOP. Keep track of the
5200 basic blocks that have been VISITED in a bitmap. */
5201
5202 static tree
5203 get_vdef_before_scop (scop_p scop, tree name, sbitmap visited)
5204 {
5205 unsigned i;
5206 gimple def_stmt = SSA_NAME_DEF_STMT (name);
5207 basic_block def_bb = gimple_bb (def_stmt);
5208
5209 if (!def_bb
5210 || !bb_in_sese_p (def_bb, SCOP_REGION (scop)))
5211 return name;
5212
5213 if (TEST_BIT (visited, def_bb->index))
5214 return NULL_TREE;
5215
5216 SET_BIT (visited, def_bb->index);
5217
5218 switch (gimple_code (def_stmt))
5219 {
5220 case GIMPLE_PHI:
5221 for (i = 0; i < gimple_phi_num_args (def_stmt); i++)
5222 {
5223 tree arg = gimple_phi_arg_def (def_stmt, i);
5224 tree res = get_vdef_before_scop (scop, arg, visited);
5225 if (res)
5226 return res;
5227 }
5228 return NULL_TREE;
5229
5230 default:
5231 return NULL_TREE;
5232 }
5233 }
5234
5235 /* Adjust a virtual phi node PHI that is placed at the end of the
5236 generated code for SCOP:
5237
5238 | if (1)
5239 | generated code from REGION;
5240 | else
5241 | REGION;
5242
5243 The FALSE_E edge comes from the original code, TRUE_E edge comes
5244 from the code generated for the SCOP. */
5245
5246 static void
5247 scop_adjust_vphi (scop_p scop, gimple phi, edge true_e)
5248 {
5249 unsigned i;
5250
5251 gcc_assert (gimple_phi_num_args (phi) == 2);
5252
5253 for (i = 0; i < gimple_phi_num_args (phi); i++)
5254 if (gimple_phi_arg_edge (phi, i) == true_e)
5255 {
5256 tree true_arg, false_arg, before_scop_arg;
5257 sbitmap visited;
5258
5259 true_arg = gimple_phi_arg_def (phi, i);
5260 if (!SSA_NAME_IS_DEFAULT_DEF (true_arg))
5261 return;
5262
5263 false_arg = gimple_phi_arg_def (phi, i == 0 ? 1 : 0);
5264 if (SSA_NAME_IS_DEFAULT_DEF (false_arg))
5265 return;
5266
5267 visited = sbitmap_alloc (last_basic_block);
5268 sbitmap_zero (visited);
5269 before_scop_arg = get_vdef_before_scop (scop, false_arg, visited);
5270 gcc_assert (before_scop_arg != NULL_TREE);
5271 SET_PHI_ARG_DEF (phi, i, before_scop_arg);
5272 sbitmap_free (visited);
5273 }
5274 }
5275
5276 /* Adjusts the phi nodes in the block BB for variables defined in
5277 SCOP_REGION and used outside the SCOP_REGION. The code generation
5278 moves SCOP_REGION in the else clause of an "if (1)" and generates
5279 code in the then clause:
5280
5281 | if (1)
5282 | generated code from REGION;
5283 | else
5284 | REGION;
5285
5286 To adjust the phi nodes after the condition, SCOP_LIVEOUT_RENAMES
5287 hash table is used: this stores for a name that is part of the
5288 LIVEOUT of SCOP_REGION its new name in the generated code. */
5289
5290 static void
5291 scop_adjust_phis_for_liveouts (scop_p scop, basic_block bb, edge false_e,
5292 edge true_e)
5293 {
5294 gimple_stmt_iterator si;
5295
5296 for (si = gsi_start_phis (bb); !gsi_end_p (si); gsi_next (&si))
5297 {
5298 unsigned i;
5299 unsigned false_i = 0;
5300 gimple phi = gsi_stmt (si);
5301
5302 if (!is_gimple_reg (PHI_RESULT (phi)))
5303 {
5304 scop_adjust_vphi (scop, phi, true_e);
5305 continue;
5306 }
5307
5308 for (i = 0; i < gimple_phi_num_args (phi); i++)
5309 if (gimple_phi_arg_edge (phi, i) == false_e)
5310 {
5311 false_i = i;
5312 break;
5313 }
5314
5315 for (i = 0; i < gimple_phi_num_args (phi); i++)
5316 if (gimple_phi_arg_edge (phi, i) == true_e)
5317 {
5318 tree old_name = gimple_phi_arg_def (phi, false_i);
5319 tree new_name = get_new_name_from_old_name
5320 (SCOP_LIVEOUT_RENAMES (scop), old_name);
5321
5322 gcc_assert (old_name != new_name);
5323 SET_PHI_ARG_DEF (phi, i, new_name);
5324 }
5325 }
5326 }
5327
5328 /* Returns the first cloog name used in EXPR. */
5329
5330 static const char *
5331 find_cloog_iv_in_expr (struct clast_expr *expr)
5332 {
5333 struct clast_term *term = (struct clast_term *) expr;
5334
5335 if (expr->type == expr_term
5336 && !term->var)
5337 return NULL;
5338
5339 if (expr->type == expr_term)
5340 return term->var;
5341
5342 if (expr->type == expr_red)
5343 {
5344 int i;
5345 struct clast_reduction *red = (struct clast_reduction *) expr;
5346
5347 for (i = 0; i < red->n; i++)
5348 {
5349 const char *res = find_cloog_iv_in_expr ((red)->elts[i]);
5350
5351 if (res)
5352 return res;
5353 }
5354 }
5355
5356 return NULL;
5357 }
5358
5359 /* Build for a clast_user_stmt USER_STMT a map between the CLAST
5360 induction variables and the corresponding GCC old induction
5361 variables. This information is stored on each GRAPHITE_BB. */
5362
5363 static void
5364 compute_cloog_iv_types_1 (graphite_bb_p gbb,
5365 struct clast_user_stmt *user_stmt)
5366 {
5367 struct clast_stmt *t;
5368 int index = 0;
5369
5370 for (t = user_stmt->substitutions; t; t = t->next, index++)
5371 {
5372 PTR *slot;
5373 struct ivtype_map_elt_d tmp;
5374 struct clast_expr *expr = (struct clast_expr *)
5375 ((struct clast_assignment *)t)->RHS;
5376
5377 /* Create an entry (clast_var, type). */
5378 tmp.cloog_iv = find_cloog_iv_in_expr (expr);
5379 if (!tmp.cloog_iv)
5380 continue;
5381
5382 slot = htab_find_slot (GBB_CLOOG_IV_TYPES (gbb), &tmp, INSERT);
5383
5384 if (!*slot)
5385 {
5386 loop_p loop = gbb_loop_at_index (gbb, index);
5387 tree oldiv = oldiv_for_loop (GBB_SCOP (gbb), loop);
5388 tree type = oldiv ? TREE_TYPE (oldiv) : integer_type_node;
5389 *slot = new_ivtype_map_elt (tmp.cloog_iv, type);
5390 }
5391 }
5392 }
5393
5394 /* Walk the CLAST tree starting from STMT and build for each
5395 clast_user_stmt a map between the CLAST induction variables and the
5396 corresponding GCC old induction variables. This information is
5397 stored on each GRAPHITE_BB. */
5398
5399 static void
5400 compute_cloog_iv_types (struct clast_stmt *stmt)
5401 {
5402 if (!stmt)
5403 return;
5404
5405 if (CLAST_STMT_IS_A (stmt, stmt_root))
5406 goto next;
5407
5408 if (CLAST_STMT_IS_A (stmt, stmt_user))
5409 {
5410 CloogStatement *cs = ((struct clast_user_stmt *) stmt)->statement;
5411 graphite_bb_p gbb = (graphite_bb_p) cloog_statement_usr (cs);
5412 GBB_CLOOG_IV_TYPES (gbb) = htab_create (10, ivtype_map_elt_info,
5413 eq_ivtype_map_elts, free);
5414 compute_cloog_iv_types_1 (gbb, (struct clast_user_stmt *) stmt);
5415 goto next;
5416 }
5417
5418 if (CLAST_STMT_IS_A (stmt, stmt_for))
5419 {
5420 struct clast_stmt *s = ((struct clast_for *) stmt)->body;
5421 compute_cloog_iv_types (s);
5422 goto next;
5423 }
5424
5425 if (CLAST_STMT_IS_A (stmt, stmt_guard))
5426 {
5427 struct clast_stmt *s = ((struct clast_guard *) stmt)->then;
5428 compute_cloog_iv_types (s);
5429 goto next;
5430 }
5431
5432 if (CLAST_STMT_IS_A (stmt, stmt_block))
5433 {
5434 struct clast_stmt *s = ((struct clast_block *) stmt)->body;
5435 compute_cloog_iv_types (s);
5436 goto next;
5437 }
5438
5439 gcc_unreachable ();
5440
5441 next:
5442 compute_cloog_iv_types (stmt->next);
5443 }
5444
5445 /* GIMPLE Loop Generator: generates loops from STMT in GIMPLE form for
5446 the given SCOP. Return true if code generation succeeded. */
5447
5448 static bool
5449 gloog (scop_p scop, struct clast_stmt *stmt)
5450 {
5451 edge new_scop_exit_edge = NULL;
5452 VEC (iv_stack_entry_p, heap) *ivstack = VEC_alloc (iv_stack_entry_p, heap,
5453 10);
5454 loop_p context_loop;
5455 ifsese if_region = NULL;
5456
5457 recompute_all_dominators ();
5458 graphite_verify ();
5459 if_region = move_sese_in_condition (SCOP_REGION (scop));
5460 sese_build_livein_liveouts (SCOP_REGION (scop));
5461 scop_insert_phis_for_liveouts (SCOP_REGION (scop),
5462 if_region->region->exit->src,
5463 if_region->false_region->exit,
5464 if_region->true_region->exit);
5465 recompute_all_dominators ();
5466 graphite_verify ();
5467 context_loop = SESE_ENTRY (SCOP_REGION (scop))->src->loop_father;
5468 compute_cloog_iv_types (stmt);
5469
5470 new_scop_exit_edge = translate_clast (scop, context_loop, stmt,
5471 if_region->true_region->entry,
5472 &ivstack);
5473 free_loop_iv_stack (&ivstack);
5474 cloog_clast_free (stmt);
5475
5476 graphite_verify ();
5477 scop_adjust_phis_for_liveouts (scop,
5478 if_region->region->exit->src,
5479 if_region->false_region->exit,
5480 if_region->true_region->exit);
5481
5482 recompute_all_dominators ();
5483 graphite_verify ();
5484 return true;
5485 }
5486
5487 /* Returns the number of data references in SCOP. */
5488
5489 static int
5490 nb_data_refs_in_scop (scop_p scop)
5491 {
5492 int i;
5493 graphite_bb_p gbb;
5494 int res = 0;
5495
5496 for (i = 0; VEC_iterate (graphite_bb_p, SCOP_BBS (scop), i, gbb); i++)
5497 res += VEC_length (data_reference_p, GBB_DATA_REFS (gbb));
5498
5499 return res;
5500 }
5501
5502 /* Move the loop at index LOOP and insert it before index NEW_LOOP_POS.
5503 This transformartion is only valid, if the loop nest between i and k is
5504 perfectly nested. Therefore we do not need to change the static schedule.
5505
5506 Example:
5507
5508 for (i = 0; i < 50; i++)
5509 for (j ...)
5510 for (k = 5; k < 100; k++)
5511 A
5512
5513 To move k before i use:
5514
5515 graphite_trans_bb_move_loop (A, 2, 0)
5516
5517 for (k = 5; k < 100; k++)
5518 for (i = 0; i < 50; i++)
5519 for (j ...)
5520 A
5521
5522 And to move k back:
5523
5524 graphite_trans_bb_move_loop (A, 0, 2)
5525
5526 This function does not check the validity of interchanging loops.
5527 This should be checked before calling this function. */
5528
5529 static void
5530 graphite_trans_bb_move_loop (graphite_bb_p gb, int loop,
5531 int new_loop_pos)
5532 {
5533 CloogMatrix *domain = GBB_DOMAIN (gb);
5534 int row, j;
5535 loop_p tmp_loop_p;
5536
5537 gcc_assert (loop < gbb_nb_loops (gb)
5538 && new_loop_pos < gbb_nb_loops (gb));
5539
5540 /* Update LOOPS vector. */
5541 tmp_loop_p = VEC_index (loop_p, GBB_LOOPS (gb), loop);
5542 VEC_ordered_remove (loop_p, GBB_LOOPS (gb), loop);
5543 VEC_safe_insert (loop_p, heap, GBB_LOOPS (gb), new_loop_pos, tmp_loop_p);
5544
5545 /* Move the domain columns. */
5546 if (loop < new_loop_pos)
5547 for (row = 0; row < domain->NbRows; row++)
5548 {
5549 Value tmp;
5550 value_init (tmp);
5551 value_assign (tmp, domain->p[row][loop + 1]);
5552
5553 for (j = loop ; j < new_loop_pos - 1; j++)
5554 value_assign (domain->p[row][j + 1], domain->p[row][j + 2]);
5555
5556 value_assign (domain->p[row][new_loop_pos], tmp);
5557 value_clear (tmp);
5558 }
5559 else
5560 for (row = 0; row < domain->NbRows; row++)
5561 {
5562 Value tmp;
5563 value_init (tmp);
5564 value_assign (tmp, domain->p[row][loop + 1]);
5565
5566 for (j = loop ; j > new_loop_pos; j--)
5567 value_assign (domain->p[row][j + 1], domain->p[row][j]);
5568
5569 value_assign (domain->p[row][new_loop_pos + 1], tmp);
5570 value_clear (tmp);
5571 }
5572 }
5573
5574 /* Get the index of the column representing constants in the DOMAIN
5575 matrix. */
5576
5577 static int
5578 const_column_index (CloogMatrix *domain)
5579 {
5580 return domain->NbColumns - 1;
5581 }
5582
5583
5584 /* Get the first index that is positive or negative, determined
5585 following the value of POSITIVE, in matrix DOMAIN in COLUMN. */
5586
5587 static int
5588 get_first_matching_sign_row_index (CloogMatrix *domain, int column,
5589 bool positive)
5590 {
5591 int row;
5592
5593 for (row = 0; row < domain->NbRows; row++)
5594 {
5595 int val = value_get_si (domain->p[row][column]);
5596
5597 if (val > 0 && positive)
5598 return row;
5599
5600 else if (val < 0 && !positive)
5601 return row;
5602 }
5603
5604 gcc_unreachable ();
5605 }
5606
5607 /* Get the lower bound of COLUMN in matrix DOMAIN. */
5608
5609 static int
5610 get_lower_bound_row (CloogMatrix *domain, int column)
5611 {
5612 return get_first_matching_sign_row_index (domain, column, true);
5613 }
5614
5615 /* Get the upper bound of COLUMN in matrix DOMAIN. */
5616
5617 static int
5618 get_upper_bound_row (CloogMatrix *domain, int column)
5619 {
5620 return get_first_matching_sign_row_index (domain, column, false);
5621 }
5622
5623 /* Copies the OLD_ROW constraint from OLD_DOMAIN to the NEW_DOMAIN at
5624 row NEW_ROW. */
5625
5626 static void
5627 copy_constraint (CloogMatrix *old_domain, CloogMatrix *new_domain,
5628 int old_row, int new_row)
5629 {
5630 int i;
5631
5632 gcc_assert (old_domain->NbColumns == new_domain->NbColumns
5633 && old_row < old_domain->NbRows
5634 && new_row < new_domain->NbRows);
5635
5636 for (i = 0; i < old_domain->NbColumns; i++)
5637 value_assign (new_domain->p[new_row][i], old_domain->p[old_row][i]);
5638 }
5639
5640 /* Swap coefficients of variables X and Y on row R. */
5641
5642 static void
5643 swap_constraint_variables (CloogMatrix *domain,
5644 int r, int x, int y)
5645 {
5646 value_swap (domain->p[r][x], domain->p[r][y]);
5647 }
5648
5649 /* Scale by X the coefficient C of constraint at row R in DOMAIN. */
5650
5651 static void
5652 scale_constraint_variable (CloogMatrix *domain,
5653 int r, int c, int x)
5654 {
5655 Value strip_size_value;
5656 value_init (strip_size_value);
5657 value_set_si (strip_size_value, x);
5658 value_multiply (domain->p[r][c], domain->p[r][c], strip_size_value);
5659 value_clear (strip_size_value);
5660 }
5661
5662 /* Strip mines the loop of BB at the position LOOP_DEPTH with STRIDE.
5663 Always valid, but not always a performance improvement. */
5664
5665 static void
5666 graphite_trans_bb_strip_mine (graphite_bb_p gb, int loop_depth, int stride)
5667 {
5668 int row, col;
5669
5670 CloogMatrix *domain = GBB_DOMAIN (gb);
5671 CloogMatrix *new_domain = cloog_matrix_alloc (domain->NbRows + 3,
5672 domain->NbColumns + 1);
5673
5674 int col_loop_old = loop_depth + 2;
5675 int col_loop_strip = col_loop_old - 1;
5676
5677 gcc_assert (loop_depth <= gbb_nb_loops (gb) - 1);
5678
5679 VEC_safe_insert (loop_p, heap, GBB_LOOPS (gb), loop_depth, NULL);
5680
5681 GBB_DOMAIN (gb) = new_domain;
5682
5683 for (row = 0; row < domain->NbRows; row++)
5684 for (col = 0; col < domain->NbColumns; col++)
5685 if (col <= loop_depth)
5686 value_assign (new_domain->p[row][col], domain->p[row][col]);
5687 else
5688 value_assign (new_domain->p[row][col + 1], domain->p[row][col]);
5689
5690 row = domain->NbRows;
5691
5692 /* Lower bound of the outer stripped loop. */
5693 copy_constraint (new_domain, new_domain,
5694 get_lower_bound_row (new_domain, col_loop_old), row);
5695 swap_constraint_variables (new_domain, row, col_loop_old, col_loop_strip);
5696 row++;
5697
5698 /* Upper bound of the outer stripped loop. */
5699 copy_constraint (new_domain, new_domain,
5700 get_upper_bound_row (new_domain, col_loop_old), row);
5701 swap_constraint_variables (new_domain, row, col_loop_old, col_loop_strip);
5702 scale_constraint_variable (new_domain, row, col_loop_strip, stride);
5703 row++;
5704
5705 /* Lower bound of a tile starts at "stride * outer_iv". */
5706 row = get_lower_bound_row (new_domain, col_loop_old);
5707 value_set_si (new_domain->p[row][0], 1);
5708 value_set_si (new_domain->p[row][const_column_index (new_domain)], 0);
5709 value_set_si (new_domain->p[row][col_loop_old], 1);
5710 value_set_si (new_domain->p[row][col_loop_strip], -1 * stride);
5711
5712 /* Upper bound of a tile stops at "stride * outer_iv + stride - 1",
5713 or at the old upper bound that is not modified. */
5714 row = new_domain->NbRows - 1;
5715 value_set_si (new_domain->p[row][0], 1);
5716 value_set_si (new_domain->p[row][col_loop_old], -1);
5717 value_set_si (new_domain->p[row][col_loop_strip], stride);
5718 value_set_si (new_domain->p[row][const_column_index (new_domain)],
5719 stride - 1);
5720
5721 cloog_matrix_free (domain);
5722
5723 /* Update static schedule. */
5724 {
5725 int i;
5726 int nb_loops = gbb_nb_loops (gb);
5727 lambda_vector new_schedule = lambda_vector_new (nb_loops + 1);
5728
5729 for (i = 0; i <= loop_depth; i++)
5730 new_schedule[i] = GBB_STATIC_SCHEDULE (gb)[i];
5731
5732 for (i = loop_depth + 1; i <= nb_loops - 2; i++)
5733 new_schedule[i + 2] = GBB_STATIC_SCHEDULE (gb)[i];
5734
5735 GBB_STATIC_SCHEDULE (gb) = new_schedule;
5736 }
5737 }
5738
5739 /* Returns true when the strip mining of LOOP_INDEX by STRIDE is
5740 profitable or undecidable. GB is the statement around which the
5741 loops will be strip mined. */
5742
5743 static bool
5744 strip_mine_profitable_p (graphite_bb_p gb, int stride,
5745 int loop_index)
5746 {
5747 bool res = true;
5748 edge exit = NULL;
5749 tree niter;
5750 loop_p loop;
5751 long niter_val;
5752
5753 loop = VEC_index (loop_p, GBB_LOOPS (gb), loop_index);
5754 exit = single_exit (loop);
5755
5756 niter = find_loop_niter (loop, &exit);
5757 if (niter == chrec_dont_know
5758 || TREE_CODE (niter) != INTEGER_CST)
5759 return true;
5760
5761 niter_val = int_cst_value (niter);
5762
5763 if (niter_val < stride)
5764 {
5765 res = false;
5766 if (dump_file && (dump_flags & TDF_DETAILS))
5767 {
5768 fprintf (dump_file, "\nStrip Mining is not profitable for loop %d:",
5769 loop->num);
5770 fprintf (dump_file, "number of iterations is too low.\n");
5771 }
5772 }
5773
5774 return res;
5775 }
5776
5777 /* Determines when the interchange of LOOP_A and LOOP_B belonging to
5778 SCOP is legal. DEPTH is the number of loops around. */
5779
5780 static bool
5781 is_interchange_valid (scop_p scop, int loop_a, int loop_b, int depth)
5782 {
5783 bool res;
5784 VEC (ddr_p, heap) *dependence_relations;
5785 VEC (data_reference_p, heap) *datarefs;
5786
5787 struct loop *nest = VEC_index (loop_p, SCOP_LOOP_NEST (scop), loop_a);
5788 lambda_trans_matrix trans;
5789
5790 gcc_assert (loop_a < loop_b);
5791
5792 dependence_relations = VEC_alloc (ddr_p, heap, 10 * 10);
5793 datarefs = VEC_alloc (data_reference_p, heap, 10);
5794
5795 if (!compute_data_dependences_for_loop (nest, true, &datarefs,
5796 &dependence_relations))
5797 return false;
5798
5799 if (dump_file && (dump_flags & TDF_DETAILS))
5800 dump_ddrs (dump_file, dependence_relations);
5801
5802 trans = lambda_trans_matrix_new (depth, depth);
5803 lambda_matrix_id (LTM_MATRIX (trans), depth);
5804
5805 lambda_matrix_row_exchange (LTM_MATRIX (trans), 0, loop_b - loop_a);
5806
5807 if (!lambda_transform_legal_p (trans, depth, dependence_relations))
5808 {
5809 lambda_matrix_row_exchange (LTM_MATRIX (trans), 0, loop_b - loop_a);
5810 res = false;
5811 }
5812 else
5813 res = true;
5814
5815 free_dependence_relations (dependence_relations);
5816 free_data_refs (datarefs);
5817 return res;
5818 }
5819
5820 /* Loop block the LOOPS innermost loops of GB with stride size STRIDE.
5821
5822 Example
5823
5824 for (i = 0; i <= 50; i++=4)
5825 for (k = 0; k <= 100; k++=4)
5826 for (l = 0; l <= 200; l++=4)
5827 A
5828
5829 To strip mine the two inner most loops with stride = 4 call:
5830
5831 graphite_trans_bb_block (A, 4, 2)
5832
5833 for (i = 0; i <= 50; i++)
5834 for (kk = 0; kk <= 100; kk+=4)
5835 for (ll = 0; ll <= 200; ll+=4)
5836 for (k = kk; k <= min (100, kk + 3); k++)
5837 for (l = ll; l <= min (200, ll + 3); l++)
5838 A
5839 */
5840
5841 static bool
5842 graphite_trans_bb_block (graphite_bb_p gb, int stride, int loops)
5843 {
5844 int i, j;
5845 int nb_loops = gbb_nb_loops (gb);
5846 int start = nb_loops - loops;
5847 scop_p scop = GBB_SCOP (gb);
5848
5849 gcc_assert (scop_contains_loop (scop, gbb_loop (gb)));
5850
5851 for (i = start ; i < nb_loops; i++)
5852 for (j = i + 1; j < nb_loops; j++)
5853 if (!is_interchange_valid (scop, i, j, nb_loops))
5854 {
5855 if (dump_file && (dump_flags & TDF_DETAILS))
5856 fprintf (dump_file,
5857 "\nInterchange not valid for loops %d and %d:\n", i, j);
5858 return false;
5859 }
5860 else if (dump_file && (dump_flags & TDF_DETAILS))
5861 fprintf (dump_file,
5862 "\nInterchange valid for loops %d and %d:\n", i, j);
5863
5864 /* Check if strip mining is profitable for every loop. */
5865 for (i = 0; i < nb_loops - start; i++)
5866 if (!strip_mine_profitable_p (gb, stride, start + i))
5867 return false;
5868
5869 /* Strip mine loops. */
5870 for (i = 0; i < nb_loops - start; i++)
5871 graphite_trans_bb_strip_mine (gb, start + 2 * i, stride);
5872
5873 /* Interchange loops. */
5874 for (i = 1; i < nb_loops - start; i++)
5875 graphite_trans_bb_move_loop (gb, start + 2 * i, start + i);
5876
5877 if (dump_file && (dump_flags & TDF_DETAILS))
5878 fprintf (dump_file, "\nLoops containing BB %d will be loop blocked.\n",
5879 GBB_BB (gb)->index);
5880
5881 return true;
5882 }
5883
5884 /* Loop block LOOPS innermost loops of a loop nest. BBS represent the
5885 basic blocks that belong to the loop nest to be blocked. */
5886
5887 static bool
5888 graphite_trans_loop_block (VEC (graphite_bb_p, heap) *bbs, int loops)
5889 {
5890 graphite_bb_p gb;
5891 int i;
5892 bool transform_done = false;
5893
5894 /* TODO: - Calculate the stride size automatically. */
5895 int stride_size = 51;
5896
5897 for (i = 0; VEC_iterate (graphite_bb_p, bbs, i, gb); i++)
5898 transform_done |= graphite_trans_bb_block (gb, stride_size, loops);
5899
5900 return transform_done;
5901 }
5902
5903 /* Loop block all basic blocks of SCOP. Return false when the
5904 transform is not performed. */
5905
5906 static bool
5907 graphite_trans_scop_block (scop_p scop)
5908 {
5909 graphite_bb_p gb;
5910 int i, j;
5911 int last_nb_loops;
5912 int nb_loops;
5913 bool perfect = true;
5914 bool transform_done = false;
5915
5916 VEC (graphite_bb_p, heap) *bbs = VEC_alloc (graphite_bb_p, heap, 3);
5917 int max_schedule = scop_max_loop_depth (scop) + 1;
5918 lambda_vector last_schedule = lambda_vector_new (max_schedule);
5919
5920 if (VEC_length (graphite_bb_p, SCOP_BBS (scop)) == 0)
5921 return false;
5922
5923 /* Get the data of the first bb. */
5924 gb = VEC_index (graphite_bb_p, SCOP_BBS (scop), 0);
5925 last_nb_loops = gbb_nb_loops (gb);
5926 lambda_vector_copy (GBB_STATIC_SCHEDULE (gb), last_schedule,
5927 last_nb_loops + 1);
5928 VEC_safe_push (graphite_bb_p, heap, bbs, gb);
5929
5930 for (i = 0; VEC_iterate (graphite_bb_p, SCOP_BBS (scop), i, gb); i++)
5931 {
5932 /* We did the first bb before. */
5933 if (i == 0)
5934 continue;
5935
5936 nb_loops = gbb_nb_loops (gb);
5937
5938 /* If the number of loops is unchanged and only the last element of the
5939 schedule changes, we stay in the loop nest. */
5940 if (nb_loops == last_nb_loops
5941 && (last_schedule [nb_loops + 1]
5942 != GBB_STATIC_SCHEDULE (gb)[nb_loops + 1]))
5943 {
5944 VEC_safe_push (graphite_bb_p, heap, bbs, gb);
5945 continue;
5946 }
5947
5948 /* Otherwise, we left the innermost loop. So check, if the last bb was in
5949 a perfect loop nest and how many loops are contained in this perfect
5950 loop nest.
5951
5952 Count the number of zeros from the end of the schedule. They are the
5953 number of surrounding loops.
5954
5955 Example:
5956 last_bb 2 3 2 0 0 0 0 3
5957 bb 2 4 0
5958 <------ j = 4
5959
5960 last_bb 2 3 2 0 0 0 0 3
5961 bb 2 3 2 0 1
5962 <-- j = 2
5963
5964 If there is no zero, there were other bbs in outer loops and the loop
5965 nest is not perfect. */
5966 for (j = last_nb_loops - 1; j >= 0; j--)
5967 {
5968 if (last_schedule [j] != 0
5969 || (j <= nb_loops && GBB_STATIC_SCHEDULE (gb)[j] == 1))
5970 {
5971 j--;
5972 break;
5973 }
5974 }
5975
5976 j++;
5977
5978 /* Found perfect loop nest. */
5979 if (perfect && last_nb_loops - j >= 2)
5980 transform_done |= graphite_trans_loop_block (bbs, last_nb_loops - j);
5981
5982 /* Check if we start with a new loop.
5983
5984 Example:
5985
5986 last_bb 2 3 2 0 0 0 0 3
5987 bb 2 3 2 0 0 1 0
5988
5989 Here we start with the loop "2 3 2 0 0 1"
5990
5991 last_bb 2 3 2 0 0 0 0 3
5992 bb 2 3 2 0 0 1
5993
5994 But here not, so the loop nest can never be perfect. */
5995
5996 perfect = (GBB_STATIC_SCHEDULE (gb)[nb_loops] == 0);
5997
5998 /* Update the last_bb infos. We do not do that for the bbs in the same
5999 loop, as the data we use is not changed. */
6000 last_nb_loops = nb_loops;
6001 lambda_vector_copy (GBB_STATIC_SCHEDULE (gb), last_schedule,
6002 nb_loops + 1);
6003 VEC_truncate (graphite_bb_p, bbs, 0);
6004 VEC_safe_push (graphite_bb_p, heap, bbs, gb);
6005 }
6006
6007 /* Check if the last loop nest was perfect. It is the same check as above,
6008 but the comparison with the next bb is missing. */
6009 for (j = last_nb_loops - 1; j >= 0; j--)
6010 if (last_schedule [j] != 0)
6011 {
6012 j--;
6013 break;
6014 }
6015
6016 j++;
6017
6018 /* Found perfect loop nest. */
6019 if (last_nb_loops - j >= 2)
6020 transform_done |= graphite_trans_loop_block (bbs, last_nb_loops - j);
6021 VEC_free (graphite_bb_p, heap, bbs);
6022
6023 return transform_done;
6024 }
6025
6026 /* Apply graphite transformations to all the basic blocks of SCOP. */
6027
6028 static bool
6029 graphite_apply_transformations (scop_p scop)
6030 {
6031 bool transform_done = false;
6032
6033 /* Sort the list of bbs. Keep them always sorted. */
6034 graphite_sort_gbbs (scop);
6035
6036 if (flag_loop_block)
6037 transform_done = graphite_trans_scop_block (scop);
6038
6039 /* Generate code even if we did not apply any real transformation.
6040 This also allows to check the performance for the identity
6041 transformation: GIMPLE -> GRAPHITE -> GIMPLE
6042 Keep in mind that CLooG optimizes in control, so the loop structure
6043 may change, even if we only use -fgraphite-identity. */
6044 if (flag_graphite_identity)
6045 transform_done = true;
6046
6047 return transform_done;
6048 }
6049
6050 /* We limit all SCoPs to SCoPs, that are completely surrounded by a loop.
6051
6052 Example:
6053
6054 for (i |
6055 { |
6056 for (j | SCoP 1
6057 for (k |
6058 } |
6059
6060 * SCoP frontier, as this line is not surrounded by any loop. *
6061
6062 for (l | SCoP 2
6063
6064 This is necessary as scalar evolution and parameter detection need a
6065 outermost loop to initialize parameters correctly.
6066
6067 TODO: FIX scalar evolution and parameter detection to allow more flexible
6068 SCoP frontiers. */
6069
6070 static void
6071 limit_scops (void)
6072 {
6073 VEC (sd_region, heap) *tmp_scops = VEC_alloc (sd_region, heap, 3);
6074
6075 int i;
6076 scop_p scop;
6077
6078 for (i = 0; VEC_iterate (scop_p, current_scops, i, scop); i++)
6079 {
6080 int j;
6081 loop_p loop;
6082 build_scop_bbs (scop);
6083
6084 if (!build_scop_loop_nests (scop))
6085 continue;
6086
6087 for (j = 0; VEC_iterate (loop_p, SCOP_LOOP_NEST (scop), j, loop); j++)
6088 if (!loop_in_sese_p (loop_outer (loop), SCOP_REGION (scop)))
6089 {
6090 sd_region open_scop;
6091 open_scop.entry = loop->header;
6092 open_scop.exit = single_exit (loop)->dest;
6093 VEC_safe_push (sd_region, heap, tmp_scops, &open_scop);
6094 }
6095 }
6096
6097 free_scops (current_scops);
6098 current_scops = VEC_alloc (scop_p, heap, 3);
6099
6100 create_sese_edges (tmp_scops);
6101 build_graphite_scops (tmp_scops);
6102 VEC_free (sd_region, heap, tmp_scops);
6103 }
6104
6105 /* Perform a set of linear transforms on the loops of the current
6106 function. */
6107
6108 void
6109 graphite_transform_loops (void)
6110 {
6111 int i;
6112 scop_p scop;
6113 bool transform_done = false;
6114
6115 if (number_of_loops () <= 1)
6116 return;
6117
6118 current_scops = VEC_alloc (scop_p, heap, 3);
6119 recompute_all_dominators ();
6120
6121 if (dump_file && (dump_flags & TDF_DETAILS))
6122 fprintf (dump_file, "Graphite loop transformations \n");
6123
6124 initialize_original_copy_tables ();
6125 cloog_initialize ();
6126 build_scops ();
6127 limit_scops ();
6128
6129 if (dump_file && (dump_flags & TDF_DETAILS))
6130 fprintf (dump_file, "\nnumber of SCoPs: %d\n",
6131 VEC_length (scop_p, current_scops));
6132
6133 for (i = 0; VEC_iterate (scop_p, current_scops, i, scop); i++)
6134 {
6135 build_scop_bbs (scop);
6136 if (!build_scop_loop_nests (scop))
6137 continue;
6138
6139 build_bb_loops (scop);
6140
6141 if (!build_scop_conditions (scop))
6142 continue;
6143
6144 find_scop_parameters (scop);
6145 build_scop_context (scop);
6146
6147 if (dump_file && (dump_flags & TDF_DETAILS))
6148 {
6149 fprintf (dump_file, "\n(In SCoP %d:\n", i);
6150 fprintf (dump_file, "\nnumber of bbs: %d\n",
6151 VEC_length (graphite_bb_p, SCOP_BBS (scop)));
6152 fprintf (dump_file, "\nnumber of loops: %d)\n",
6153 VEC_length (loop_p, SCOP_LOOP_NEST (scop)));
6154 }
6155
6156 if (!build_scop_iteration_domain (scop))
6157 continue;
6158
6159 add_conditions_to_constraints (scop);
6160 build_scop_canonical_schedules (scop);
6161
6162 build_scop_data_accesses (scop);
6163 build_scop_dynamic_schedules (scop);
6164
6165 if (dump_file && (dump_flags & TDF_DETAILS))
6166 {
6167 int nbrefs = nb_data_refs_in_scop (scop);
6168 fprintf (dump_file, "\nnumber of data refs: %d\n", nbrefs);
6169 }
6170
6171 if (graphite_apply_transformations (scop))
6172 transform_done = gloog (scop, find_transform (scop));
6173 #ifdef ENABLE_CHECKING
6174 else
6175 {
6176 struct clast_stmt *stmt = find_transform (scop);
6177 cloog_clast_free (stmt);
6178 }
6179 #endif
6180 }
6181
6182 /* Cleanup. */
6183 if (transform_done)
6184 cleanup_tree_cfg ();
6185
6186 free_scops (current_scops);
6187 cloog_finalize ();
6188 free_original_copy_tables ();
6189 }
6190
6191 #else /* If Cloog is not available: #ifndef HAVE_cloog. */
6192
6193 void
6194 graphite_transform_loops (void)
6195 {
6196 sorry ("Graphite loop optimizations cannot be used");
6197 }
6198
6199 #endif