OSDN Git Service

Daily bump.
[pf3gnuchains/gcc-fork.git] / gcc / graphite-clast-to-gimple.c
1 /* Translation of CLAST (CLooG AST) to Gimple.
2    Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc.
3    Contributed by Sebastian Pop <sebastian.pop@amd.com>.
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 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "diagnostic-core.h"
25 #include "tree-flow.h"
26 #include "tree-dump.h"
27 #include "cfgloop.h"
28 #include "tree-chrec.h"
29 #include "tree-data-ref.h"
30 #include "tree-scalar-evolution.h"
31 #include "sese.h"
32
33 #ifdef HAVE_cloog
34 #include "cloog/cloog.h"
35 #include "ppl_c.h"
36 #include "graphite-cloog-util.h"
37 #include "graphite-ppl.h"
38 #include "graphite-poly.h"
39 #include "graphite-clast-to-gimple.h"
40 #include "graphite-dependences.h"
41 #include "graphite-cloog-compat.h"
42
43 #ifndef CLOOG_LANGUAGE_C
44 #define CLOOG_LANGUAGE_C LANGUAGE_C
45 #endif
46
47 /* This flag is set when an error occurred during the translation of
48    CLAST to Gimple.  */
49 static bool gloog_error;
50
51 /* Verifies properties that GRAPHITE should maintain during translation.  */
52
53 static inline void
54 graphite_verify (void)
55 {
56 #ifdef ENABLE_CHECKING
57   verify_loop_structure ();
58   verify_dominators (CDI_DOMINATORS);
59   verify_loop_closed_ssa (true);
60 #endif
61 }
62
63 /* Stores the INDEX in a vector and the loop nesting LEVEL for a given
64    clast NAME.  BOUND_ONE and BOUND_TWO represent the exact lower and
65    upper bounds that can be inferred from the polyhedral representation.  */
66
67 typedef struct clast_name_index {
68   int index;
69   int level;
70   mpz_t bound_one, bound_two;
71   const char *name;
72 } *clast_name_index_p;
73
74 /* Returns a pointer to a new element of type clast_name_index_p built
75    from NAME, INDEX, LEVEL, BOUND_ONE, and BOUND_TWO.  */
76
77 static inline clast_name_index_p
78 new_clast_name_index (const char *name, int index, int level,
79                       mpz_t bound_one, mpz_t bound_two)
80 {
81   clast_name_index_p res = XNEW (struct clast_name_index);
82
83   res->name = name;
84   res->level = level;
85   res->index = index;
86   mpz_init (res->bound_one);
87   mpz_init (res->bound_two);
88   mpz_set (res->bound_one, bound_one);
89   mpz_set (res->bound_two, bound_two);
90   return res;
91 }
92
93 /* Free the memory taken by a clast_name_index struct.  */
94
95 static void
96 free_clast_name_index (void *ptr)
97 {
98   struct clast_name_index *c = (struct clast_name_index *) ptr;
99   mpz_clear (c->bound_one);
100   mpz_clear (c->bound_two);
101   free (ptr);
102 }
103
104 /* For a given clast NAME, returns -1 if NAME is not in the
105    INDEX_TABLE, otherwise returns the loop level for the induction
106    variable NAME, or if it is a parameter, the parameter number in the
107    vector of parameters.  */
108
109 static inline int
110 clast_name_to_level (clast_name_p name, htab_t index_table)
111 {
112   struct clast_name_index tmp;
113   PTR *slot;
114
115 #ifdef CLOOG_ORG
116   gcc_assert (name->type == clast_expr_name);
117   tmp.name = ((const struct clast_name *) name)->name;
118 #else
119   tmp.name = name;
120 #endif
121
122   slot = htab_find_slot (index_table, &tmp, NO_INSERT);
123
124   if (slot && *slot)
125     return ((struct clast_name_index *) *slot)->level;
126
127   return -1;
128 }
129
130 /* For a given clast NAME, returns -1 if it does not correspond to any
131    parameter, or otherwise, returns the index in the PARAMS or
132    SCATTERING_DIMENSIONS vector.  */
133
134 static inline int
135 clast_name_to_index (clast_name_p name, htab_t index_table)
136 {
137   struct clast_name_index tmp;
138   PTR *slot;
139
140 #ifdef CLOOG_ORG
141   gcc_assert (name->type == clast_expr_name);
142   tmp.name = ((const struct clast_name *) name)->name;
143 #else
144   tmp.name = name;
145 #endif
146
147   slot = htab_find_slot (index_table, &tmp, NO_INSERT);
148
149   if (slot && *slot)
150     return ((struct clast_name_index *) *slot)->index;
151
152   return -1;
153 }
154
155 /* For a given clast NAME, initializes the lower and upper bounds BOUND_ONE
156    and BOUND_TWO stored in the INDEX_TABLE.  Returns true when NAME has been
157    found in the INDEX_TABLE, false otherwise.  */
158
159 static inline bool
160 clast_name_to_lb_ub (clast_name_p name, htab_t index_table, mpz_t bound_one,
161                      mpz_t bound_two)
162 {
163   struct clast_name_index tmp;
164   PTR *slot;
165
166 #ifdef CLOOG_ORG
167   gcc_assert (name->type == clast_expr_name);
168   tmp.name = ((const struct clast_name *) name)->name;
169 #else
170   tmp.name = name;
171 #endif
172
173   slot = htab_find_slot (index_table, &tmp, NO_INSERT);
174
175   if (slot && *slot)
176     {
177       mpz_set (bound_one, ((struct clast_name_index *) *slot)->bound_one);
178       mpz_set (bound_two, ((struct clast_name_index *) *slot)->bound_two);
179       return true;
180     }
181
182   return false;
183 }
184
185 /* Records in INDEX_TABLE the INDEX and LEVEL for NAME.  */
186
187 static inline void
188 save_clast_name_index (htab_t index_table, const char *name,
189                        int index, int level, mpz_t bound_one, mpz_t bound_two)
190 {
191   struct clast_name_index tmp;
192   PTR *slot;
193
194   tmp.name = name;
195   slot = htab_find_slot (index_table, &tmp, INSERT);
196
197   if (slot)
198     {
199       free (*slot);
200
201       *slot = new_clast_name_index (name, index, level, bound_one, bound_two);
202     }
203 }
204
205 /* Computes a hash function for database element ELT.  */
206
207 static inline hashval_t
208 clast_name_index_elt_info (const void *elt)
209 {
210   return htab_hash_pointer (((const struct clast_name_index *) elt)->name);
211 }
212
213 /* Compares database elements E1 and E2.  */
214
215 static inline int
216 eq_clast_name_indexes (const void *e1, const void *e2)
217 {
218   const struct clast_name_index *elt1 = (const struct clast_name_index *) e1;
219   const struct clast_name_index *elt2 = (const struct clast_name_index *) e2;
220
221   return (elt1->name == elt2->name);
222 }
223
224 \f
225
226 /* NEWIVS_INDEX binds CLooG's scattering name to the index of the tree
227    induction variable in NEWIVS.
228
229    PARAMS_INDEX binds CLooG's parameter name to the index of the tree
230    parameter in PARAMS.  */
231
232 typedef struct ivs_params {
233   VEC (tree, heap) *params, **newivs;
234   htab_t newivs_index, params_index;
235   sese region;
236 } *ivs_params_p;
237
238 /* Returns the tree variable from the name NAME that was given in
239    Cloog representation.  */
240
241 static tree
242 clast_name_to_gcc (clast_name_p name, ivs_params_p ip)
243 {
244   int index;
245
246   if (ip->params && ip->params_index)
247     {
248       index = clast_name_to_index (name, ip->params_index);
249
250       if (index >= 0)
251         return VEC_index (tree, ip->params, index);
252     }
253
254   gcc_assert (*(ip->newivs) && ip->newivs_index);
255   index = clast_name_to_index (name, ip->newivs_index);
256   gcc_assert (index >= 0);
257
258   return VEC_index (tree, *(ip->newivs), index);
259 }
260
261 /* Returns the maximal precision type for expressions TYPE1 and TYPE2.  */
262
263 static tree
264 max_precision_type (tree type1, tree type2)
265 {
266   enum machine_mode mode;
267   int p1, p2, precision;
268   tree type;
269
270   if (POINTER_TYPE_P (type1))
271     return type1;
272
273   if (POINTER_TYPE_P (type2))
274     return type2;
275
276   if (TYPE_UNSIGNED (type1)
277       && TYPE_UNSIGNED (type2))
278     return TYPE_PRECISION (type1) > TYPE_PRECISION (type2) ? type1 : type2;
279
280   p1 = TYPE_PRECISION (type1);
281   p2 = TYPE_PRECISION (type2);
282
283   if (p1 > p2)
284     precision = TYPE_UNSIGNED (type1) ? p1 * 2 : p1;
285   else
286     precision = TYPE_UNSIGNED (type2) ? p2 * 2 : p2;
287
288   if (precision > BITS_PER_WORD)
289     {
290       gloog_error = true;
291       return integer_type_node;
292     }
293
294   mode = smallest_mode_for_size (precision, MODE_INT);
295   precision = GET_MODE_PRECISION (mode);
296   type = build_nonstandard_integer_type (precision, false);
297
298   if (!type)
299     {
300       gloog_error = true;
301       return integer_type_node;
302     }
303
304   return type;
305 }
306
307 static tree
308 clast_to_gcc_expression (tree, struct clast_expr *, ivs_params_p);
309
310 /* Converts a Cloog reduction expression R with reduction operation OP
311    to a GCC expression tree of type TYPE.  */
312
313 static tree
314 clast_to_gcc_expression_red (tree type, enum tree_code op,
315                              struct clast_reduction *r, ivs_params_p ip)
316 {
317   int i;
318   tree res = clast_to_gcc_expression (type, r->elts[0], ip);
319   tree operand_type = (op == POINTER_PLUS_EXPR) ? sizetype : type;
320
321   for (i = 1; i < r->n; i++)
322     {
323       tree t = clast_to_gcc_expression (operand_type, r->elts[i], ip);
324       res = fold_build2 (op, type, res, t);
325     }
326
327   return res;
328 }
329
330 /* Converts a Cloog AST expression E back to a GCC expression tree of
331    type TYPE.  */
332
333 static tree
334 clast_to_gcc_expression (tree type, struct clast_expr *e, ivs_params_p ip)
335 {
336   switch (e->type)
337     {
338     case clast_expr_term:
339       {
340         struct clast_term *t = (struct clast_term *) e;
341
342         if (t->var)
343           {
344             if (mpz_cmp_si (t->val, 1) == 0)
345               {
346                 tree name = clast_name_to_gcc (t->var, ip);
347
348                 if (POINTER_TYPE_P (TREE_TYPE (name)) != POINTER_TYPE_P (type))
349                   name = convert_to_ptrofftype (name);
350
351                 name = fold_convert (type, name);
352                 return name;
353               }
354
355             else if (mpz_cmp_si (t->val, -1) == 0)
356               {
357                 tree name = clast_name_to_gcc (t->var, ip);
358
359                 if (POINTER_TYPE_P (TREE_TYPE (name)) != POINTER_TYPE_P (type))
360                   name = convert_to_ptrofftype (name);
361
362                 name = fold_convert (type, name);
363
364                 return fold_build1 (NEGATE_EXPR, type, name);
365               }
366             else
367               {
368                 tree name = clast_name_to_gcc (t->var, ip);
369                 tree cst = gmp_cst_to_tree (type, t->val);
370
371                 if (POINTER_TYPE_P (TREE_TYPE (name)) != POINTER_TYPE_P (type))
372                   name = convert_to_ptrofftype (name);
373
374                 name = fold_convert (type, name);
375
376                 if (!POINTER_TYPE_P (type))
377                   return fold_build2 (MULT_EXPR, type, cst, name);
378
379                 gloog_error = true;
380                 return cst;
381               }
382           }
383         else
384           return gmp_cst_to_tree (type, t->val);
385       }
386
387     case clast_expr_red:
388       {
389         struct clast_reduction *r = (struct clast_reduction *) e;
390
391         switch (r->type)
392           {
393           case clast_red_sum:
394             return clast_to_gcc_expression_red
395               (type, POINTER_TYPE_P (type) ? POINTER_PLUS_EXPR : PLUS_EXPR,
396                r, ip);
397
398           case clast_red_min:
399             return clast_to_gcc_expression_red (type, MIN_EXPR, r, ip);
400
401           case clast_red_max:
402             return clast_to_gcc_expression_red (type, MAX_EXPR, r, ip);
403
404           default:
405             gcc_unreachable ();
406           }
407         break;
408       }
409
410     case clast_expr_bin:
411       {
412         struct clast_binary *b = (struct clast_binary *) e;
413         struct clast_expr *lhs = (struct clast_expr *) b->LHS;
414         tree tl = clast_to_gcc_expression (type, lhs, ip);
415         tree tr = gmp_cst_to_tree (type, b->RHS);
416
417         switch (b->type)
418           {
419           case clast_bin_fdiv:
420             return fold_build2 (FLOOR_DIV_EXPR, type, tl, tr);
421
422           case clast_bin_cdiv:
423             return fold_build2 (CEIL_DIV_EXPR, type, tl, tr);
424
425           case clast_bin_div:
426             return fold_build2 (EXACT_DIV_EXPR, type, tl, tr);
427
428           case clast_bin_mod:
429             return fold_build2 (TRUNC_MOD_EXPR, type, tl, tr);
430
431           default:
432             gcc_unreachable ();
433           }
434       }
435
436     default:
437       gcc_unreachable ();
438     }
439
440   return NULL_TREE;
441 }
442
443 /* Return a type that could represent the values between BOUND_ONE and
444    BOUND_TWO.  */
445
446 static tree
447 type_for_interval (mpz_t bound_one, mpz_t bound_two)
448 {
449   bool unsigned_p;
450   tree type;
451   enum machine_mode mode;
452   int wider_precision;
453   int precision = MAX (mpz_sizeinbase (bound_one, 2),
454                        mpz_sizeinbase (bound_two, 2));
455
456   if (precision > BITS_PER_WORD)
457     {
458       gloog_error = true;
459       return integer_type_node;
460     }
461
462   if (mpz_cmp (bound_one, bound_two) <= 0)
463     unsigned_p = (mpz_sgn (bound_one) >= 0);
464   else
465     unsigned_p = (mpz_sgn (bound_two) >= 0);
466
467   mode = smallest_mode_for_size (precision, MODE_INT);
468   wider_precision = GET_MODE_PRECISION (mode);
469
470   /* As we want to generate signed types as much as possible, try to
471      fit the interval [bound_one, bound_two] in a signed type.  For example,
472      supposing that we have the interval [0, 100], instead of
473      generating unsigned char, we want to generate a signed char.  */
474   if (unsigned_p && precision < wider_precision)
475     unsigned_p = false;
476
477   type = build_nonstandard_integer_type (wider_precision, unsigned_p);
478
479   if (!type)
480     {
481       gloog_error = true;
482       return integer_type_node;
483     }
484
485   return type;
486 }
487
488 /* Return a type that could represent the integer value VAL, or
489    otherwise return NULL_TREE.  */
490
491 static tree
492 type_for_value (mpz_t val)
493 {
494   return type_for_interval (val, val);
495 }
496
497 /* Return the type for the clast_term T.  Initializes BOUND_ONE and
498    BOUND_TWO to the bounds of the term.  */
499
500 static tree
501 type_for_clast_term (struct clast_term *t, ivs_params_p ip, mpz_t bound_one,
502                      mpz_t bound_two)
503 {
504   clast_name_p name = t->var;
505   bool found = false;
506
507   gcc_assert (t->expr.type == clast_expr_term);
508
509   if (!name)
510     {
511       mpz_set (bound_one, t->val);
512       mpz_set (bound_two, t->val);
513       return type_for_value (t->val);
514     }
515
516   if (ip->params && ip->params_index)
517     found = clast_name_to_lb_ub (name, ip->params_index, bound_one, bound_two);
518
519   if (!found)
520     {
521       gcc_assert (*(ip->newivs) && ip->newivs_index);
522       found = clast_name_to_lb_ub (name, ip->newivs_index,
523                                    bound_one, bound_two);
524       gcc_assert (found);
525     }
526
527   mpz_mul (bound_one, bound_one, t->val);
528   mpz_mul (bound_two, bound_two, t->val);
529
530   return TREE_TYPE (clast_name_to_gcc (name, ip));
531 }
532
533 static tree
534 type_for_clast_expr (struct clast_expr *, ivs_params_p, mpz_t, mpz_t);
535
536 /* Return the type for the clast_reduction R.  Initializes BOUND_ONE
537    and BOUND_TWO to the bounds of the reduction expression.  */
538
539 static tree
540 type_for_clast_red (struct clast_reduction *r, ivs_params_p ip,
541                     mpz_t bound_one, mpz_t bound_two)
542 {
543   int i;
544   tree type = type_for_clast_expr (r->elts[0], ip, bound_one, bound_two);
545   mpz_t b1, b2, m1, m2;
546
547   if (r->n == 1)
548     return type;
549
550   mpz_init (b1);
551   mpz_init (b2);
552   mpz_init (m1);
553   mpz_init (m2);
554
555   for (i = 1; i < r->n; i++)
556     {
557       tree t = type_for_clast_expr (r->elts[i], ip, b1, b2);
558       type = max_precision_type (type, t);
559
560       switch (r->type)
561         {
562         case clast_red_sum:
563           value_min (m1, bound_one, bound_two);
564           value_min (m2, b1, b2);
565           mpz_add (bound_one, m1, m2);
566
567           value_max (m1, bound_one, bound_two);
568           value_max (m2, b1, b2);
569           mpz_add (bound_two, m1, m2);
570           break;
571
572         case clast_red_min:
573           value_min (bound_one, bound_one, bound_two);
574           value_min (bound_two, b1, b2);
575           break;
576
577         case clast_red_max:
578           value_max (bound_one, bound_one, bound_two);
579           value_max (bound_two, b1, b2);
580           break;
581
582         default:
583           gcc_unreachable ();
584           break;
585         }
586     }
587
588   mpz_clear (b1);
589   mpz_clear (b2);
590   mpz_clear (m1);
591   mpz_clear (m2);
592
593   /* Return a type that can represent the result of the reduction.  */
594   return max_precision_type (type, type_for_interval (bound_one, bound_two));
595 }
596
597 /* Return the type for the clast_binary B used in STMT.  */
598
599 static tree
600 type_for_clast_bin (struct clast_binary *b, ivs_params_p ip, mpz_t bound_one,
601                     mpz_t bound_two)
602 {
603   mpz_t one;
604   tree l = type_for_clast_expr ((struct clast_expr *) b->LHS, ip,
605                                 bound_one, bound_two);
606   tree r = type_for_value (b->RHS);
607   tree type = max_precision_type (l, r);
608
609   switch (b->type)
610     {
611     case clast_bin_fdiv:
612       mpz_mdiv (bound_one, bound_one, b->RHS);
613       mpz_mdiv (bound_two, bound_two, b->RHS);
614       break;
615
616     case clast_bin_cdiv:
617       mpz_mdiv (bound_one, bound_one, b->RHS);
618       mpz_mdiv (bound_two, bound_two, b->RHS);
619       mpz_init (one);
620       mpz_add (bound_one, bound_one, one);
621       mpz_add (bound_two, bound_two, one);
622       mpz_clear (one);
623       break;
624
625     case clast_bin_div:
626       mpz_div (bound_one, bound_one, b->RHS);
627       mpz_div (bound_two, bound_two, b->RHS);
628       break;
629
630     case clast_bin_mod:
631       mpz_mod (bound_one, bound_one, b->RHS);
632       mpz_mod (bound_two, bound_two, b->RHS);
633       break;
634
635     default:
636       gcc_unreachable ();
637     }
638
639   /* Return a type that can represent the result of the reduction.  */
640   return max_precision_type (type, type_for_interval (bound_one, bound_two));
641 }
642
643 /* Returns the type for the CLAST expression E when used in statement
644    STMT.  */
645
646 static tree
647 type_for_clast_expr (struct clast_expr *e, ivs_params_p ip, mpz_t bound_one,
648                      mpz_t bound_two)
649 {
650   switch (e->type)
651     {
652     case clast_expr_term:
653       return type_for_clast_term ((struct clast_term *) e, ip,
654                                   bound_one, bound_two);
655
656     case clast_expr_red:
657       return type_for_clast_red ((struct clast_reduction *) e, ip,
658                                  bound_one, bound_two);
659
660     case clast_expr_bin:
661       return type_for_clast_bin ((struct clast_binary *) e, ip,
662                                  bound_one, bound_two);
663
664     default:
665       gcc_unreachable ();
666     }
667
668   return NULL_TREE;
669 }
670
671 /* Returns the type for the equation CLEQ.  */
672
673 static tree
674 type_for_clast_eq (struct clast_equation *cleq, ivs_params_p ip)
675 {
676   mpz_t bound_one, bound_two;
677   tree l, r;
678
679   mpz_init (bound_one);
680   mpz_init (bound_two);
681
682   l = type_for_clast_expr (cleq->LHS, ip, bound_one, bound_two);
683   r = type_for_clast_expr (cleq->RHS, ip, bound_one, bound_two);
684
685   mpz_clear (bound_one);
686   mpz_clear (bound_two);
687   return max_precision_type (l, r);
688 }
689
690 /* Translates a clast equation CLEQ to a tree.  */
691
692 static tree
693 graphite_translate_clast_equation (struct clast_equation *cleq,
694                                    ivs_params_p ip)
695 {
696   enum tree_code comp;
697   tree type = type_for_clast_eq (cleq, ip);
698   tree lhs = clast_to_gcc_expression (type, cleq->LHS, ip);
699   tree rhs = clast_to_gcc_expression (type, cleq->RHS, ip);
700
701   if (cleq->sign == 0)
702     comp = EQ_EXPR;
703
704   else if (cleq->sign > 0)
705     comp = GE_EXPR;
706
707   else
708     comp = LE_EXPR;
709
710   return fold_build2 (comp, boolean_type_node, lhs, rhs);
711 }
712
713 /* Creates the test for the condition in STMT.  */
714
715 static tree
716 graphite_create_guard_cond_expr (struct clast_guard *stmt,
717                                  ivs_params_p ip)
718 {
719   tree cond = NULL;
720   int i;
721
722   for (i = 0; i < stmt->n; i++)
723     {
724       tree eq = graphite_translate_clast_equation (&stmt->eq[i], ip);
725
726       if (cond)
727         cond = fold_build2 (TRUTH_AND_EXPR, TREE_TYPE (eq), cond, eq);
728       else
729         cond = eq;
730     }
731
732   return cond;
733 }
734
735 /* Creates a new if region corresponding to Cloog's guard.  */
736
737 static edge
738 graphite_create_new_guard (edge entry_edge, struct clast_guard *stmt,
739                            ivs_params_p ip)
740 {
741   tree cond_expr = graphite_create_guard_cond_expr (stmt, ip);
742   edge exit_edge = create_empty_if_region_on_edge (entry_edge, cond_expr);
743   return exit_edge;
744 }
745
746 /* Compute the lower bound LOW and upper bound UP for the parameter
747    PARAM in scop SCOP based on the constraints in the context.  */
748
749 static void
750 compute_bounds_for_param (scop_p scop, int param, mpz_t low, mpz_t up)
751 {
752   ppl_Linear_Expression_t le;
753
754   /* Prepare the linear expression corresponding to the parameter that
755      we want to maximize/minimize.  */
756   ppl_new_Linear_Expression_with_dimension (&le, scop_nb_params (scop));
757   ppl_set_coef (le, param, 1);
758
759   ppl_max_for_le_pointset (SCOP_CONTEXT (scop), le, up);
760   ppl_min_for_le_pointset (SCOP_CONTEXT (scop), le, low);
761   ppl_delete_Linear_Expression (le);
762 }
763
764 /* Compute the lower bound LOW and upper bound UP for the induction
765    variable at LEVEL for the statement PBB, based on the transformed
766    scattering of PBB: T|I|G|Cst, with T the scattering transform, I
767    the iteration domain, and G the context parameters.  */
768
769 static void
770 compute_bounds_for_level (poly_bb_p pbb, int level, mpz_t low, mpz_t up)
771 {
772   ppl_Pointset_Powerset_C_Polyhedron_t ps;
773   ppl_Linear_Expression_t le;
774
775   combine_context_id_scat (&ps, pbb, false);
776
777   /* Prepare the linear expression corresponding to the level that we
778      want to maximize/minimize.  */
779   {
780     ppl_dimension_type dim = pbb_nb_scattering_transform (pbb)
781       + pbb_dim_iter_domain (pbb) + pbb_nb_params (pbb);
782
783     ppl_new_Linear_Expression_with_dimension (&le, dim);
784     ppl_set_coef (le, psct_dynamic_dim (pbb, level), 1);
785   }
786
787   ppl_max_for_le_pointset (ps, le, up);
788   ppl_min_for_le_pointset (ps, le, low);
789   ppl_delete_Linear_Expression (le);
790   ppl_delete_Pointset_Powerset_C_Polyhedron (ps);
791 }
792
793 /* Walks a CLAST and returns the first statement in the body of a
794    loop.
795
796    FIXME: This function should not be used to get a PBB in the STMT
797    loop in order to find out the iteration domain of the loop: the
798    counter example from Tobias is:
799
800    | for (i = 0; i < 100; i++)
801    |   {
802    |     if (i == 0)
803    |       S1;
804    |     S2;
805    |   }
806
807    This function would return S1 whose iteration domain contains only
808    one point "i = 0", whereas the iteration domain of S2 has 100 points.
809
810    This should be implemented using some functionality existing in
811    CLooG-ISL.  */
812
813 static struct clast_user_stmt *
814 clast_get_body_of_loop (struct clast_stmt *stmt)
815 {
816   if (!stmt
817       || CLAST_STMT_IS_A (stmt, stmt_user))
818     return (struct clast_user_stmt *) stmt;
819
820   if (CLAST_STMT_IS_A (stmt, stmt_for))
821     return clast_get_body_of_loop (((struct clast_for *) stmt)->body);
822
823   if (CLAST_STMT_IS_A (stmt, stmt_guard))
824     return clast_get_body_of_loop (((struct clast_guard *) stmt)->then);
825
826   if (CLAST_STMT_IS_A (stmt, stmt_block))
827     return clast_get_body_of_loop (((struct clast_block *) stmt)->body);
828
829   if (CLAST_STMT_IS_A (stmt, stmt_ass))
830     return clast_get_body_of_loop (stmt->next);
831
832   gcc_unreachable ();
833 }
834
835 /* Returns the type for the induction variable for the loop translated
836    from STMT_FOR.  */
837
838 static tree
839 type_for_clast_for (struct clast_for *stmt_for, ivs_params_p ip)
840 {
841   mpz_t bound_one, bound_two;
842   tree lb_type, ub_type;
843
844   mpz_init (bound_one);
845   mpz_init (bound_two);
846
847   lb_type = type_for_clast_expr (stmt_for->LB, ip, bound_one, bound_two);
848   ub_type = type_for_clast_expr (stmt_for->UB, ip, bound_one, bound_two);
849
850   mpz_clear (bound_one);
851   mpz_clear (bound_two);
852
853   return max_precision_type (lb_type, ub_type);
854 }
855
856 /* Creates a new LOOP corresponding to Cloog's STMT.  Inserts an
857    induction variable for the new LOOP.  New LOOP is attached to CFG
858    starting at ENTRY_EDGE.  LOOP is inserted into the loop tree and
859    becomes the child loop of the OUTER_LOOP.  NEWIVS_INDEX binds
860    CLooG's scattering name to the induction variable created for the
861    loop of STMT.  The new induction variable is inserted in the NEWIVS
862    vector and is of type TYPE.  */
863
864 static struct loop *
865 graphite_create_new_loop (edge entry_edge, struct clast_for *stmt,
866                           loop_p outer, tree type, tree lb, tree ub,
867                           int level, ivs_params_p ip)
868 {
869   mpz_t low, up;
870
871   struct clast_user_stmt *body
872     = clast_get_body_of_loop ((struct clast_stmt *) stmt);
873   poly_bb_p pbb = (poly_bb_p) cloog_statement_usr (body->statement);
874
875   tree stride = gmp_cst_to_tree (type, stmt->stride);
876   tree ivvar = create_tmp_var (type, "graphite_IV");
877   tree iv, iv_after_increment;
878   loop_p loop = create_empty_loop_on_edge
879     (entry_edge, lb, stride, ub, ivvar, &iv, &iv_after_increment,
880      outer ? outer : entry_edge->src->loop_father);
881
882   add_referenced_var (ivvar);
883
884   mpz_init (low);
885   mpz_init (up);
886   compute_bounds_for_level (pbb, level, low, up);
887   save_clast_name_index (ip->newivs_index, stmt->iterator,
888                          VEC_length (tree, *(ip->newivs)), level, low, up);
889   mpz_clear (low);
890   mpz_clear (up);
891   VEC_safe_push (tree, heap, *(ip->newivs), iv);
892   return loop;
893 }
894
895 /* Inserts in iv_map a tuple (OLD_LOOP->num, NEW_NAME) for the
896    induction variables of the loops around GBB in SESE.  */
897
898 static void
899 build_iv_mapping (VEC (tree, heap) *iv_map, struct clast_user_stmt *user_stmt,
900                   ivs_params_p ip)
901 {
902   struct clast_stmt *t;
903   int depth = 0;
904   CloogStatement *cs = user_stmt->statement;
905   poly_bb_p pbb = (poly_bb_p) cloog_statement_usr (cs);
906   gimple_bb_p gbb = PBB_BLACK_BOX (pbb);
907   mpz_t bound_one, bound_two;
908
909   mpz_init (bound_one);
910   mpz_init (bound_two);
911
912   for (t = user_stmt->substitutions; t; t = t->next, depth++)
913     {
914       struct clast_expr *expr = (struct clast_expr *)
915        ((struct clast_assignment *)t)->RHS;
916       tree type = type_for_clast_expr (expr, ip, bound_one, bound_two);
917       tree new_name = clast_to_gcc_expression (type, expr, ip);
918       loop_p old_loop = gbb_loop_at_index (gbb, ip->region, depth);
919
920       VEC_replace (tree, iv_map, old_loop->num, new_name);
921     }
922
923   mpz_clear (bound_one);
924   mpz_clear (bound_two);
925 }
926
927 /* Construct bb_pbb_def with BB and PBB.  */
928
929 static bb_pbb_def *
930 new_bb_pbb_def (basic_block bb, poly_bb_p pbb)
931 {
932   bb_pbb_def *bb_pbb_p;
933
934   bb_pbb_p = XNEW (bb_pbb_def);
935   bb_pbb_p->bb = bb;
936   bb_pbb_p->pbb = pbb;
937
938   return bb_pbb_p;
939 }
940
941 /* Mark BB with it's relevant PBB via hashing table BB_PBB_MAPPING.  */
942
943 static void
944 mark_bb_with_pbb (poly_bb_p pbb, basic_block bb, htab_t bb_pbb_mapping)
945 {
946   bb_pbb_def tmp;
947   PTR *x;
948
949   tmp.bb = bb;
950   x = htab_find_slot (bb_pbb_mapping, &tmp, INSERT);
951
952   if (x && !*x)
953     *x = new_bb_pbb_def (bb, pbb);
954 }
955
956 /* Find BB's related poly_bb_p in hash table BB_PBB_MAPPING.  */
957
958 static poly_bb_p
959 find_pbb_via_hash (htab_t bb_pbb_mapping, basic_block bb)
960 {
961   bb_pbb_def tmp;
962   PTR *slot;
963
964   tmp.bb = bb;
965   slot = htab_find_slot (bb_pbb_mapping, &tmp, NO_INSERT);
966
967   if (slot && *slot)
968     return ((bb_pbb_def *) *slot)->pbb;
969
970   return NULL;
971 }
972
973 /* Check data dependency in LOOP at level LEVEL.
974    BB_PBB_MAPPING is a basic_block and it's related poly_bb_p
975    mapping.  */
976
977 static bool
978 dependency_in_loop_p (loop_p loop, htab_t bb_pbb_mapping, int level)
979 {
980   unsigned i,j;
981   basic_block *bbs = get_loop_body_in_dom_order (loop);
982
983   for (i = 0; i < loop->num_nodes; i++)
984     {
985       poly_bb_p pbb1 = find_pbb_via_hash (bb_pbb_mapping, bbs[i]);
986
987       if (pbb1 == NULL)
988        continue;
989
990       for (j = 0; j < loop->num_nodes; j++)
991        {
992          poly_bb_p pbb2 = find_pbb_via_hash (bb_pbb_mapping, bbs[j]);
993
994          if (pbb2 == NULL)
995            continue;
996
997          if (dependency_between_pbbs_p (pbb1, pbb2, level))
998            {
999              free (bbs);
1000              return true;
1001            }
1002        }
1003     }
1004
1005   free (bbs);
1006
1007   return false;
1008 }
1009
1010 /* Translates a clast user statement STMT to gimple.
1011
1012    - NEXT_E is the edge where new generated code should be attached.
1013    - CONTEXT_LOOP is the loop in which the generated code will be placed
1014    - BB_PBB_MAPPING is is a basic_block and it's related poly_bb_p mapping.  */
1015
1016 static edge
1017 translate_clast_user (struct clast_user_stmt *stmt, edge next_e,
1018                       htab_t bb_pbb_mapping, ivs_params_p ip)
1019 {
1020   int i, nb_loops;
1021   basic_block new_bb;
1022   poly_bb_p pbb = (poly_bb_p) cloog_statement_usr (stmt->statement);
1023   gimple_bb_p gbb = PBB_BLACK_BOX (pbb);
1024   VEC (tree, heap) *iv_map;
1025
1026   if (GBB_BB (gbb) == ENTRY_BLOCK_PTR)
1027     return next_e;
1028
1029   nb_loops = number_of_loops ();
1030   iv_map = VEC_alloc (tree, heap, nb_loops);
1031   for (i = 0; i < nb_loops; i++)
1032     VEC_quick_push (tree, iv_map, NULL_TREE);
1033
1034   build_iv_mapping (iv_map, stmt, ip);
1035   next_e = copy_bb_and_scalar_dependences (GBB_BB (gbb), ip->region,
1036                                            next_e, iv_map, &gloog_error);
1037   VEC_free (tree, heap, iv_map);
1038
1039   new_bb = next_e->src;
1040   mark_bb_with_pbb (pbb, new_bb, bb_pbb_mapping);
1041   update_ssa (TODO_update_ssa);
1042
1043   return next_e;
1044 }
1045
1046 /* Creates a new if region protecting the loop to be executed, if the execution
1047    count is zero (lb > ub).  */
1048
1049 static edge
1050 graphite_create_new_loop_guard (edge entry_edge, struct clast_for *stmt,
1051                                 tree *type, tree *lb, tree *ub,
1052                                 ivs_params_p ip)
1053 {
1054   tree cond_expr;
1055   edge exit_edge;
1056
1057   *type = type_for_clast_for (stmt, ip);
1058   *lb = clast_to_gcc_expression (*type, stmt->LB, ip);
1059   *ub = clast_to_gcc_expression (*type, stmt->UB, ip);
1060
1061   /* When ub is simply a constant or a parameter, use lb <= ub.  */
1062   if (TREE_CODE (*ub) == INTEGER_CST || TREE_CODE (*ub) == SSA_NAME)
1063     cond_expr = fold_build2 (LE_EXPR, boolean_type_node, *lb, *ub);
1064   else
1065     {
1066       tree one = (POINTER_TYPE_P (*type)
1067                   ? convert_to_ptrofftype (integer_one_node)
1068                   : fold_convert (*type, integer_one_node));
1069       /* Adding +1 and using LT_EXPR helps with loop latches that have a
1070          loop iteration count of "PARAMETER - 1".  For PARAMETER == 0 this becomes
1071          2^k-1 due to integer overflow, and the condition lb <= ub is true,
1072          even if we do not want this.  However lb < ub + 1 is false, as
1073          expected.  */
1074       tree ub_one = fold_build2 (POINTER_TYPE_P (*type) ? POINTER_PLUS_EXPR
1075                                  : PLUS_EXPR, *type, *ub, one);
1076
1077       cond_expr = fold_build2 (LT_EXPR, boolean_type_node, *lb, ub_one);
1078     }
1079
1080   exit_edge = create_empty_if_region_on_edge (entry_edge, cond_expr);
1081
1082   return exit_edge;
1083 }
1084
1085 static edge
1086 translate_clast (loop_p, struct clast_stmt *, edge, htab_t, int, ivs_params_p);
1087
1088 /* Create the loop for a clast for statement.
1089
1090    - NEXT_E is the edge where new generated code should be attached.
1091    - BB_PBB_MAPPING is is a basic_block and it's related poly_bb_p mapping.  */
1092
1093 static edge
1094 translate_clast_for_loop (loop_p context_loop, struct clast_for *stmt,
1095                           edge next_e, htab_t bb_pbb_mapping, int level,
1096                           tree type, tree lb, tree ub, ivs_params_p ip)
1097 {
1098   struct loop *loop = graphite_create_new_loop (next_e, stmt, context_loop,
1099                                                 type, lb, ub, level, ip);
1100   edge last_e = single_exit (loop);
1101   edge to_body = single_succ_edge (loop->header);
1102   basic_block after = to_body->dest;
1103
1104   /* Create a basic block for loop close phi nodes.  */
1105   last_e = single_succ_edge (split_edge (last_e));
1106
1107   /* Translate the body of the loop.  */
1108   next_e = translate_clast (loop, stmt->body, to_body, bb_pbb_mapping,
1109                             level + 1, ip);
1110   redirect_edge_succ_nodup (next_e, after);
1111   set_immediate_dominator (CDI_DOMINATORS, next_e->dest, next_e->src);
1112
1113   if (flag_loop_parallelize_all
1114       && !dependency_in_loop_p (loop, bb_pbb_mapping, level))
1115     loop->can_be_parallel = true;
1116
1117   return last_e;
1118 }
1119
1120 /* Translates a clast for statement STMT to gimple.  First a guard is created
1121    protecting the loop, if it is executed zero times.  In this guard we create
1122    the real loop structure.
1123
1124    - NEXT_E is the edge where new generated code should be attached.
1125    - BB_PBB_MAPPING is is a basic_block and it's related poly_bb_p mapping.  */
1126
1127 static edge
1128 translate_clast_for (loop_p context_loop, struct clast_for *stmt, edge next_e,
1129                      htab_t bb_pbb_mapping, int level, ivs_params_p ip)
1130 {
1131   tree type, lb, ub;
1132   edge last_e = graphite_create_new_loop_guard (next_e, stmt, &type,
1133                                                 &lb, &ub, ip);
1134   edge true_e = get_true_edge_from_guard_bb (next_e->dest);
1135
1136   translate_clast_for_loop (context_loop, stmt, true_e, bb_pbb_mapping, level,
1137                             type, lb, ub, ip);
1138   return last_e;
1139 }
1140
1141 /* Translates a clast assignment STMT to gimple.
1142
1143    - NEXT_E is the edge where new generated code should be attached.
1144    - BB_PBB_MAPPING is is a basic_block and it's related poly_bb_p mapping.  */
1145
1146 static edge
1147 translate_clast_assignment (struct clast_assignment *stmt, edge next_e,
1148                             int level, ivs_params_p ip)
1149 {
1150   gimple_seq stmts;
1151   mpz_t bound_one, bound_two;
1152   tree type, new_name, var;
1153   edge res = single_succ_edge (split_edge (next_e));
1154   struct clast_expr *expr = (struct clast_expr *) stmt->RHS;
1155
1156   mpz_init (bound_one);
1157   mpz_init (bound_two);
1158   type = type_for_clast_expr (expr, ip, bound_one, bound_two);
1159   var = create_tmp_var (type, "graphite_var");
1160   new_name = force_gimple_operand (clast_to_gcc_expression (type, expr, ip),
1161                                    &stmts, true, var);
1162   add_referenced_var (var);
1163   if (stmts)
1164     {
1165       gsi_insert_seq_on_edge (next_e, stmts);
1166       gsi_commit_edge_inserts ();
1167     }
1168
1169   save_clast_name_index (ip->newivs_index, stmt->LHS,
1170                          VEC_length (tree, *(ip->newivs)), level,
1171                          bound_one, bound_two);
1172   VEC_safe_push (tree, heap, *(ip->newivs), new_name);
1173
1174   mpz_clear (bound_one);
1175   mpz_clear (bound_two);
1176
1177   return res;
1178 }
1179
1180 /* Translates a clast guard statement STMT to gimple.
1181
1182    - NEXT_E is the edge where new generated code should be attached.
1183    - CONTEXT_LOOP is the loop in which the generated code will be placed
1184    - BB_PBB_MAPPING is is a basic_block and it's related poly_bb_p mapping.  */
1185
1186 static edge
1187 translate_clast_guard (loop_p context_loop, struct clast_guard *stmt,
1188                        edge next_e, htab_t bb_pbb_mapping, int level,
1189                        ivs_params_p ip)
1190 {
1191   edge last_e = graphite_create_new_guard (next_e, stmt, ip);
1192   edge true_e = get_true_edge_from_guard_bb (next_e->dest);
1193
1194   translate_clast (context_loop, stmt->then, true_e, bb_pbb_mapping, level, ip);
1195   return last_e;
1196 }
1197
1198 /* Translates a CLAST statement STMT to GCC representation in the
1199    context of a SESE.
1200
1201    - NEXT_E is the edge where new generated code should be attached.
1202    - CONTEXT_LOOP is the loop in which the generated code will be placed
1203    - BB_PBB_MAPPING is is a basic_block and it's related poly_bb_p mapping.  */
1204
1205 static edge
1206 translate_clast (loop_p context_loop, struct clast_stmt *stmt, edge next_e,
1207                  htab_t bb_pbb_mapping, int level, ivs_params_p ip)
1208 {
1209   if (!stmt)
1210     return next_e;
1211
1212   if (CLAST_STMT_IS_A (stmt, stmt_root))
1213     ; /* Do nothing.  */
1214
1215   else if (CLAST_STMT_IS_A (stmt, stmt_user))
1216     next_e = translate_clast_user ((struct clast_user_stmt *) stmt,
1217                                    next_e, bb_pbb_mapping, ip);
1218
1219   else if (CLAST_STMT_IS_A (stmt, stmt_for))
1220     next_e = translate_clast_for (context_loop, (struct clast_for *) stmt,
1221                                   next_e, bb_pbb_mapping, level, ip);
1222
1223   else if (CLAST_STMT_IS_A (stmt, stmt_guard))
1224     next_e = translate_clast_guard (context_loop, (struct clast_guard *) stmt,
1225                                     next_e, bb_pbb_mapping, level, ip);
1226
1227   else if (CLAST_STMT_IS_A (stmt, stmt_block))
1228     next_e = translate_clast (context_loop, ((struct clast_block *) stmt)->body,
1229                               next_e, bb_pbb_mapping, level, ip);
1230
1231   else if (CLAST_STMT_IS_A (stmt, stmt_ass))
1232     next_e = translate_clast_assignment ((struct clast_assignment *) stmt,
1233                                          next_e, level, ip);
1234   else
1235     gcc_unreachable();
1236
1237   recompute_all_dominators ();
1238   graphite_verify ();
1239
1240   return translate_clast (context_loop, stmt->next, next_e, bb_pbb_mapping,
1241                           level, ip);
1242 }
1243
1244 /* Free the SCATTERING domain list.  */
1245
1246 static void
1247 free_scattering (CloogScatteringList *scattering)
1248 {
1249   while (scattering)
1250     {
1251       CloogScattering *dom = cloog_scattering (scattering);
1252       CloogScatteringList *next = cloog_next_scattering (scattering);
1253
1254       cloog_scattering_free (dom);
1255       free (scattering);
1256       scattering = next;
1257     }
1258 }
1259
1260 /* Initialize Cloog's parameter names from the names used in GIMPLE.
1261    Initialize Cloog's iterator names, using 'graphite_iterator_%d'
1262    from 0 to scop_nb_loops (scop).  */
1263
1264 static void
1265 initialize_cloog_names (scop_p scop, CloogProgram *prog)
1266 {
1267   sese region = SCOP_REGION (scop);
1268   int i;
1269   int nb_iterators = scop_max_loop_depth (scop);
1270   int nb_scattering = cloog_program_nb_scattdims (prog);
1271   int nb_parameters = VEC_length (tree, SESE_PARAMS (region));
1272   char **iterators = XNEWVEC (char *, nb_iterators * 2);
1273   char **scattering = XNEWVEC (char *, nb_scattering);
1274   char **parameters= XNEWVEC (char *, nb_parameters);
1275
1276   cloog_program_set_names (prog, cloog_names_malloc ());
1277
1278   for (i = 0; i < nb_parameters; i++)
1279     {
1280       tree param = VEC_index (tree, SESE_PARAMS (region), i);
1281       const char *name = get_name (param);
1282       int len;
1283
1284       if (!name)
1285         name = "T";
1286
1287       len = strlen (name);
1288       len += 17;
1289       parameters[i] = XNEWVEC (char, len + 1);
1290       snprintf (parameters[i], len, "%s_%d", name, SSA_NAME_VERSION (param));
1291     }
1292
1293   cloog_names_set_nb_parameters (cloog_program_names (prog), nb_parameters);
1294   cloog_names_set_parameters (cloog_program_names (prog), parameters);
1295
1296   for (i = 0; i < nb_iterators; i++)
1297     {
1298       int len = 4 + 16;
1299       iterators[i] = XNEWVEC (char, len);
1300       snprintf (iterators[i], len, "git_%d", i);
1301     }
1302
1303   cloog_names_set_nb_iterators (cloog_program_names (prog),
1304                                 nb_iterators);
1305   cloog_names_set_iterators (cloog_program_names (prog),
1306                              iterators);
1307
1308   for (i = 0; i < nb_scattering; i++)
1309     {
1310       int len = 5 + 16;
1311       scattering[i] = XNEWVEC (char, len);
1312       snprintf (scattering[i], len, "scat_%d", i);
1313     }
1314
1315   cloog_names_set_nb_scattering (cloog_program_names (prog),
1316                                  nb_scattering);
1317   cloog_names_set_scattering (cloog_program_names (prog),
1318                               scattering);
1319 }
1320
1321 /* Initialize a CLooG input file.  */
1322
1323 static FILE *
1324 init_cloog_input_file (int scop_number)
1325 {
1326   FILE *graphite_out_file;
1327   int len = strlen (dump_base_name);
1328   char *dumpname = XNEWVEC (char, len + 25);
1329   char *s_scop_number = XNEWVEC (char, 15);
1330
1331   memcpy (dumpname, dump_base_name, len + 1);
1332   strip_off_ending (dumpname, len);
1333   sprintf (s_scop_number, ".%d", scop_number);
1334   strcat (dumpname, s_scop_number);
1335   strcat (dumpname, ".cloog");
1336   graphite_out_file = fopen (dumpname, "w+b");
1337
1338   if (graphite_out_file == 0)
1339     fatal_error ("can%'t open %s for writing: %m", dumpname);
1340
1341   free (dumpname);
1342
1343   return graphite_out_file;
1344 }
1345
1346 /* Build cloog program for SCoP.  */
1347
1348 static void
1349 build_cloog_prog (scop_p scop, CloogProgram *prog,
1350                   CloogOptions *options)
1351 {
1352   int i;
1353   int max_nb_loops = scop_max_loop_depth (scop);
1354   poly_bb_p pbb;
1355   CloogLoop *loop_list = NULL;
1356   CloogBlockList *block_list = NULL;
1357   CloogScatteringList *scattering = NULL;
1358   int nbs = 2 * max_nb_loops + 1;
1359   int *scaldims;
1360
1361   cloog_program_set_context
1362     (prog, new_Cloog_Domain_from_ppl_Pointset_Powerset (SCOP_CONTEXT (scop),
1363       scop_nb_params (scop), cloog_state));
1364   nbs = unify_scattering_dimensions (scop);
1365   scaldims = (int *) xmalloc (nbs * (sizeof (int)));
1366   cloog_program_set_nb_scattdims (prog, nbs);
1367   initialize_cloog_names (scop, prog);
1368
1369   FOR_EACH_VEC_ELT (poly_bb_p, SCOP_BBS (scop), i, pbb)
1370     {
1371       CloogStatement *stmt;
1372       CloogBlock *block;
1373       CloogDomain *dom;
1374
1375       /* Dead code elimination: when the domain of a PBB is empty,
1376          don't generate code for the PBB.  */
1377       if (ppl_Pointset_Powerset_C_Polyhedron_is_empty (PBB_DOMAIN (pbb)))
1378         continue;
1379
1380       /* Build the new statement and its block.  */
1381       stmt = cloog_statement_alloc (cloog_state, pbb_index (pbb));
1382       dom = new_Cloog_Domain_from_ppl_Pointset_Powerset (PBB_DOMAIN (pbb),
1383                                                          scop_nb_params (scop),
1384                                                          cloog_state);
1385       block = cloog_block_alloc (stmt, 0, NULL, pbb_dim_iter_domain (pbb));
1386       cloog_statement_set_usr (stmt, pbb);
1387
1388       /* Build loop list.  */
1389       {
1390         CloogLoop *new_loop_list = cloog_loop_malloc (cloog_state);
1391         cloog_loop_set_next (new_loop_list, loop_list);
1392         cloog_loop_set_domain (new_loop_list, dom);
1393         cloog_loop_set_block (new_loop_list, block);
1394         loop_list = new_loop_list;
1395       }
1396
1397       /* Build block list.  */
1398       {
1399         CloogBlockList *new_block_list = cloog_block_list_malloc ();
1400
1401         cloog_block_list_set_next (new_block_list, block_list);
1402         cloog_block_list_set_block (new_block_list, block);
1403         block_list = new_block_list;
1404       }
1405
1406       /* Build scattering list.  */
1407       {
1408         /* XXX: Replace with cloog_domain_list_alloc(), when available.  */
1409         CloogScatteringList *new_scattering
1410           = (CloogScatteringList *) xmalloc (sizeof (CloogScatteringList));
1411         ppl_Polyhedron_t scat;
1412         CloogScattering *dom;
1413
1414         scat = PBB_TRANSFORMED_SCATTERING (pbb);
1415         dom = new_Cloog_Scattering_from_ppl_Polyhedron
1416           (scat, scop_nb_params (scop), pbb_nb_scattering_transform (pbb),
1417            cloog_state);
1418
1419         cloog_set_next_scattering (new_scattering, scattering);
1420         cloog_set_scattering (new_scattering, dom);
1421         scattering = new_scattering;
1422       }
1423     }
1424
1425   cloog_program_set_loop (prog, loop_list);
1426   cloog_program_set_blocklist (prog, block_list);
1427
1428   for (i = 0; i < nbs; i++)
1429     scaldims[i] = 0 ;
1430
1431   cloog_program_set_scaldims (prog, scaldims);
1432
1433   /* Extract scalar dimensions to simplify the code generation problem.  */
1434   cloog_program_extract_scalars (prog, scattering, options);
1435
1436   /* Dump a .cloog input file, if requested.  This feature is only
1437      enabled in the Graphite branch.  */
1438   if (0)
1439     {
1440       static size_t file_scop_number = 0;
1441       FILE *cloog_file = init_cloog_input_file (file_scop_number);
1442
1443       cloog_program_dump_cloog (cloog_file, prog, scattering);
1444       ++file_scop_number;
1445     }
1446
1447   /* Apply scattering.  */
1448   cloog_program_scatter (prog, scattering, options);
1449   free_scattering (scattering);
1450
1451   /* Iterators corresponding to scalar dimensions have to be extracted.  */
1452   cloog_names_scalarize (cloog_program_names (prog), nbs,
1453                          cloog_program_scaldims (prog));
1454
1455   /* Free blocklist.  */
1456   {
1457     CloogBlockList *next = cloog_program_blocklist (prog);
1458
1459     while (next)
1460       {
1461         CloogBlockList *toDelete = next;
1462         next = cloog_block_list_next (next);
1463         cloog_block_list_set_next (toDelete, NULL);
1464         cloog_block_list_set_block (toDelete, NULL);
1465         cloog_block_list_free (toDelete);
1466       }
1467     cloog_program_set_blocklist (prog, NULL);
1468   }
1469 }
1470
1471 /* Return the options that will be used in GLOOG.  */
1472
1473 static CloogOptions *
1474 set_cloog_options (void)
1475 {
1476   CloogOptions *options = cloog_options_malloc (cloog_state);
1477
1478   /* Change cloog output language to C.  If we do use FORTRAN instead, cloog
1479      will stop e.g. with "ERROR: unbounded loops not allowed in FORTRAN.", if
1480      we pass an incomplete program to cloog.  */
1481   options->language = CLOOG_LANGUAGE_C;
1482
1483   /* Enable complex equality spreading: removes dummy statements
1484      (assignments) in the generated code which repeats the
1485      substitution equations for statements.  This is useless for
1486      GLooG.  */
1487   options->esp = 1;
1488
1489 #ifdef CLOOG_ORG
1490   /* Silence CLooG to avoid failing tests due to debug output to stderr.  */
1491   options->quiet = 1;
1492 #else
1493   /* Enable C pretty-printing mode: normalizes the substitution
1494      equations for statements.  */
1495   options->cpp = 1;
1496 #endif
1497
1498   /* Allow cloog to build strides with a stride width different to one.
1499      This example has stride = 4:
1500
1501      for (i = 0; i < 20; i += 4)
1502        A  */
1503   options->strides = 1;
1504
1505   /* Disable optimizations and make cloog generate source code closer to the
1506      input.  This is useful for debugging,  but later we want the optimized
1507      code.
1508
1509      XXX: We can not disable optimizations, as loop blocking is not working
1510      without them.  */
1511   if (0)
1512     {
1513       options->f = -1;
1514       options->l = INT_MAX;
1515     }
1516
1517   return options;
1518 }
1519
1520 /* Prints STMT to STDERR.  */
1521
1522 void
1523 print_clast_stmt (FILE *file, struct clast_stmt *stmt)
1524 {
1525   CloogOptions *options = set_cloog_options ();
1526
1527   clast_pprint (file, stmt, 0, options);
1528   cloog_options_free (options);
1529 }
1530
1531 /* Prints STMT to STDERR.  */
1532
1533 DEBUG_FUNCTION void
1534 debug_clast_stmt (struct clast_stmt *stmt)
1535 {
1536   print_clast_stmt (stderr, stmt);
1537 }
1538
1539 /* Translate SCOP to a CLooG program and clast.  These two
1540    representations should be freed together: a clast cannot be used
1541    without a program.  */
1542
1543 cloog_prog_clast
1544 scop_to_clast (scop_p scop)
1545 {
1546   CloogOptions *options = set_cloog_options ();
1547   cloog_prog_clast pc;
1548
1549   /* Connect new cloog prog generation to graphite.  */
1550   pc.prog = cloog_program_malloc ();
1551   build_cloog_prog (scop, pc.prog, options);
1552   pc.prog = cloog_program_generate (pc.prog, options);
1553   pc.stmt = cloog_clast_create (pc.prog, options);
1554
1555   cloog_options_free (options);
1556   return pc;
1557 }
1558
1559 /* Prints to FILE the code generated by CLooG for SCOP.  */
1560
1561 void
1562 print_generated_program (FILE *file, scop_p scop)
1563 {
1564   CloogOptions *options = set_cloog_options ();
1565
1566   cloog_prog_clast pc = scop_to_clast (scop);
1567
1568   fprintf (file, "       (prog: \n");
1569   cloog_program_print (file, pc.prog);
1570   fprintf (file, "       )\n");
1571
1572   fprintf (file, "       (clast: \n");
1573   clast_pprint (file, pc.stmt, 0, options);
1574   fprintf (file, "       )\n");
1575
1576   cloog_options_free (options);
1577   cloog_clast_free (pc.stmt);
1578   cloog_program_free (pc.prog);
1579 }
1580
1581 /* Prints to STDERR the code generated by CLooG for SCOP.  */
1582
1583 DEBUG_FUNCTION void
1584 debug_generated_program (scop_p scop)
1585 {
1586   print_generated_program (stderr, scop);
1587 }
1588
1589 /* Add CLooG names to parameter index.  The index is used to translate
1590    back from CLooG names to GCC trees.  */
1591
1592 static void
1593 create_params_index (scop_p scop, htab_t index_table, CloogProgram *prog) {
1594   CloogNames* names = cloog_program_names (prog);
1595   int nb_parameters = cloog_names_nb_parameters (names);
1596   char **parameters = cloog_names_parameters (names);
1597   int i;
1598   mpz_t bound_one, bound_two;
1599
1600   mpz_init (bound_one);
1601   mpz_init (bound_two);
1602
1603   for (i = 0; i < nb_parameters; i++)
1604     {
1605       compute_bounds_for_param (scop, i, bound_one, bound_two);
1606       save_clast_name_index (index_table, parameters[i], i, i,
1607                              bound_one, bound_two);
1608     }
1609
1610   mpz_clear (bound_one);
1611   mpz_clear (bound_two);
1612 }
1613
1614 /* GIMPLE Loop Generator: generates loops from STMT in GIMPLE form for
1615    the given SCOP.  Return true if code generation succeeded.
1616    BB_PBB_MAPPING is a basic_block and it's related poly_bb_p mapping.
1617 */
1618
1619 bool
1620 gloog (scop_p scop, htab_t bb_pbb_mapping)
1621 {
1622   VEC (tree, heap) *newivs = VEC_alloc (tree, heap, 10);
1623   loop_p context_loop;
1624   sese region = SCOP_REGION (scop);
1625   ifsese if_region = NULL;
1626   htab_t newivs_index, params_index;
1627   cloog_prog_clast pc;
1628   struct ivs_params ip;
1629
1630   timevar_push (TV_GRAPHITE_CODE_GEN);
1631   gloog_error = false;
1632
1633   pc = scop_to_clast (scop);
1634
1635   if (dump_file && (dump_flags & TDF_DETAILS))
1636     {
1637       fprintf (dump_file, "\nCLAST generated by CLooG: \n");
1638       print_clast_stmt (dump_file, pc.stmt);
1639       fprintf (dump_file, "\n");
1640     }
1641
1642   recompute_all_dominators ();
1643   graphite_verify ();
1644
1645   if_region = move_sese_in_condition (region);
1646   sese_insert_phis_for_liveouts (region,
1647                                  if_region->region->exit->src,
1648                                  if_region->false_region->exit,
1649                                  if_region->true_region->exit);
1650   recompute_all_dominators ();
1651   graphite_verify ();
1652
1653   context_loop = SESE_ENTRY (region)->src->loop_father;
1654   newivs_index = htab_create (10, clast_name_index_elt_info,
1655                               eq_clast_name_indexes, free_clast_name_index);
1656   params_index = htab_create (10, clast_name_index_elt_info,
1657                               eq_clast_name_indexes, free_clast_name_index);
1658
1659   create_params_index (scop, params_index, pc.prog);
1660
1661   ip.newivs = &newivs;
1662   ip.newivs_index = newivs_index;
1663   ip.params = SESE_PARAMS (region);
1664   ip.params_index = params_index;
1665   ip.region = region;
1666
1667   translate_clast (context_loop, pc.stmt, if_region->true_region->entry,
1668                    bb_pbb_mapping, 0, &ip);
1669   graphite_verify ();
1670   scev_reset ();
1671   recompute_all_dominators ();
1672   graphite_verify ();
1673
1674   if (gloog_error)
1675     set_ifsese_condition (if_region, integer_zero_node);
1676
1677   free (if_region->true_region);
1678   free (if_region->region);
1679   free (if_region);
1680
1681   htab_delete (newivs_index);
1682   htab_delete (params_index);
1683   VEC_free (tree, heap, newivs);
1684   cloog_clast_free (pc.stmt);
1685   cloog_program_free (pc.prog);
1686   timevar_pop (TV_GRAPHITE_CODE_GEN);
1687
1688   if (dump_file && (dump_flags & TDF_DETAILS))
1689     {
1690       loop_p loop;
1691       loop_iterator li;
1692       int num_no_dependency = 0;
1693
1694       FOR_EACH_LOOP (li, loop, 0)
1695         if (loop->can_be_parallel)
1696           num_no_dependency++;
1697
1698       fprintf (dump_file, "\n%d loops carried no dependency.\n",
1699                num_no_dependency);
1700     }
1701
1702   return !gloog_error;
1703 }
1704 #endif