OSDN Git Service

* config/microblaze/microblaze.h (CC1_SPEC): Remove %{save-temps: }.
[pf3gnuchains/gcc-fork.git] / gcc / graphite-scop-detection.c
1 /* Detection of Static Control Parts (SCoP) for Graphite.
2    Copyright (C) 2009, 2010 Free Software Foundation, Inc.
3    Contributed by Sebastian Pop <sebastian.pop@amd.com> and
4    Tobias Grosser <grosser@fim.uni-passau.de>.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
11 any later version.
12
13 GCC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tree-flow.h"
26 #include "cfgloop.h"
27 #include "tree-chrec.h"
28 #include "tree-data-ref.h"
29 #include "tree-scalar-evolution.h"
30 #include "tree-pass.h"
31 #include "sese.h"
32
33 #ifdef HAVE_cloog
34 #include "ppl_c.h"
35 #include "graphite-ppl.h"
36 #include "graphite-poly.h"
37 #include "graphite-scop-detection.h"
38
39 /* The type of the analyzed basic block.  */
40
41 typedef enum gbb_type {
42   GBB_UNKNOWN,
43   GBB_LOOP_SING_EXIT_HEADER,
44   GBB_LOOP_MULT_EXIT_HEADER,
45   GBB_LOOP_EXIT,
46   GBB_COND_HEADER,
47   GBB_SIMPLE,
48   GBB_LAST
49 } gbb_type;
50
51 /* Detect the type of BB.  Loop headers are only marked, if they are
52    new.  This means their loop_father is different to LAST_LOOP.
53    Otherwise they are treated like any other bb and their type can be
54    any other type.  */
55
56 static gbb_type
57 get_bb_type (basic_block bb, struct loop *last_loop)
58 {
59   VEC (basic_block, heap) *dom;
60   int nb_dom, nb_suc;
61   struct loop *loop = bb->loop_father;
62
63   /* Check, if we entry into a new loop. */
64   if (loop != last_loop)
65     {
66       if (single_exit (loop) != NULL)
67         return GBB_LOOP_SING_EXIT_HEADER;
68       else if (loop->num != 0)
69         return GBB_LOOP_MULT_EXIT_HEADER;
70       else
71         return GBB_COND_HEADER;
72     }
73
74   dom = get_dominated_by (CDI_DOMINATORS, bb);
75   nb_dom = VEC_length (basic_block, dom);
76   VEC_free (basic_block, heap, dom);
77
78   if (nb_dom == 0)
79     return GBB_LAST;
80
81   nb_suc = VEC_length (edge, bb->succs);
82
83   if (nb_dom == 1 && nb_suc == 1)
84     return GBB_SIMPLE;
85
86   return GBB_COND_HEADER;
87 }
88
89 /* A SCoP detection region, defined using bbs as borders.
90
91    All control flow touching this region, comes in passing basic_block
92    ENTRY and leaves passing basic_block EXIT.  By using bbs instead of
93    edges for the borders we are able to represent also regions that do
94    not have a single entry or exit edge.
95
96    But as they have a single entry basic_block and a single exit
97    basic_block, we are able to generate for every sd_region a single
98    entry and exit edge.
99
100    1   2
101     \ /
102      3  <- entry
103      |
104      4
105     / \                 This region contains: {3, 4, 5, 6, 7, 8}
106    5   6
107    |   |
108    7   8
109     \ /
110      9  <- exit  */
111
112
113 typedef struct sd_region_p
114 {
115   /* The entry bb dominates all bbs in the sd_region.  It is part of
116      the region.  */
117   basic_block entry;
118
119   /* The exit bb postdominates all bbs in the sd_region, but is not
120      part of the region.  */
121   basic_block exit;
122 } sd_region;
123
124 DEF_VEC_O(sd_region);
125 DEF_VEC_ALLOC_O(sd_region, heap);
126
127
128 /* Moves the scops from SOURCE to TARGET and clean up SOURCE.  */
129
130 static void
131 move_sd_regions (VEC (sd_region, heap) **source,
132                  VEC (sd_region, heap) **target)
133 {
134   sd_region *s;
135   int i;
136
137   FOR_EACH_VEC_ELT (sd_region, *source, i, s)
138     VEC_safe_push (sd_region, heap, *target, s);
139
140   VEC_free (sd_region, heap, *source);
141 }
142
143 /* Something like "n * m" is not allowed.  */
144
145 static bool
146 graphite_can_represent_init (tree e)
147 {
148   switch (TREE_CODE (e))
149     {
150     case POLYNOMIAL_CHREC:
151       return graphite_can_represent_init (CHREC_LEFT (e))
152         && graphite_can_represent_init (CHREC_RIGHT (e));
153
154     case MULT_EXPR:
155       if (chrec_contains_symbols (TREE_OPERAND (e, 0)))
156         return graphite_can_represent_init (TREE_OPERAND (e, 0))
157           && host_integerp (TREE_OPERAND (e, 1), 0);
158       else
159         return graphite_can_represent_init (TREE_OPERAND (e, 1))
160           && host_integerp (TREE_OPERAND (e, 0), 0);
161
162     case PLUS_EXPR:
163     case POINTER_PLUS_EXPR:
164     case MINUS_EXPR:
165       return graphite_can_represent_init (TREE_OPERAND (e, 0))
166         && graphite_can_represent_init (TREE_OPERAND (e, 1));
167
168     case NEGATE_EXPR:
169     case BIT_NOT_EXPR:
170     CASE_CONVERT:
171     case NON_LVALUE_EXPR:
172       return graphite_can_represent_init (TREE_OPERAND (e, 0));
173
174    default:
175      break;
176     }
177
178   return true;
179 }
180
181 /* Return true when SCEV can be represented in the polyhedral model.
182
183    An expression can be represented, if it can be expressed as an
184    affine expression.  For loops (i, j) and parameters (m, n) all
185    affine expressions are of the form:
186
187    x1 * i + x2 * j + x3 * m + x4 * n + x5 * 1 where x1..x5 element of Z
188
189    1 i + 20 j + (-2) m + 25
190
191    Something like "i * n" or "n * m" is not allowed.  */
192
193 static bool
194 graphite_can_represent_scev (tree scev)
195 {
196   if (chrec_contains_undetermined (scev))
197     return false;
198
199   switch (TREE_CODE (scev))
200     {
201     case PLUS_EXPR:
202     case MINUS_EXPR:
203       return graphite_can_represent_scev (TREE_OPERAND (scev, 0))
204         && graphite_can_represent_scev (TREE_OPERAND (scev, 1));
205
206     case MULT_EXPR:
207       return !CONVERT_EXPR_CODE_P (TREE_CODE (TREE_OPERAND (scev, 0)))
208         && !CONVERT_EXPR_CODE_P (TREE_CODE (TREE_OPERAND (scev, 1)))
209         && !(chrec_contains_symbols (TREE_OPERAND (scev, 0))
210              && chrec_contains_symbols (TREE_OPERAND (scev, 1)))
211         && graphite_can_represent_init (scev)
212         && graphite_can_represent_scev (TREE_OPERAND (scev, 0))
213         && graphite_can_represent_scev (TREE_OPERAND (scev, 1));
214
215     case POLYNOMIAL_CHREC:
216       /* Check for constant strides.  With a non constant stride of
217          'n' we would have a value of 'iv * n'.  Also check that the
218          initial value can represented: for example 'n * m' cannot be
219          represented.  */
220       if (!evolution_function_right_is_integer_cst (scev)
221           || !graphite_can_represent_init (scev))
222         return false;
223
224     default:
225       break;
226     }
227
228   /* Only affine functions can be represented.  */
229   if (!scev_is_linear_expression (scev))
230     return false;
231
232   return true;
233 }
234
235
236 /* Return true when EXPR can be represented in the polyhedral model.
237
238    This means an expression can be represented, if it is linear with
239    respect to the loops and the strides are non parametric.
240    LOOP is the place where the expr will be evaluated.  SCOP_ENTRY defines the
241    entry of the region we analyse.  */
242
243 static bool
244 graphite_can_represent_expr (basic_block scop_entry, loop_p loop,
245                              tree expr)
246 {
247   tree scev = analyze_scalar_evolution (loop, expr);
248
249   scev = instantiate_scev (scop_entry, loop, scev);
250
251   return graphite_can_represent_scev (scev);
252 }
253
254 /* Return true if the data references of STMT can be represented by
255    Graphite.  */
256
257 static bool
258 stmt_has_simple_data_refs_p (loop_p outermost_loop, gimple stmt)
259 {
260   data_reference_p dr;
261   unsigned i;
262   int j;
263   bool res = true;
264   VEC (data_reference_p, heap) *drs = VEC_alloc (data_reference_p, heap, 5);
265
266   graphite_find_data_references_in_stmt (outermost_loop, stmt, &drs);
267
268   FOR_EACH_VEC_ELT (data_reference_p, drs, j, dr)
269     for (i = 0; i < DR_NUM_DIMENSIONS (dr); i++)
270       if (!graphite_can_represent_scev (DR_ACCESS_FN (dr, i)))
271         {
272           res = false;
273           goto done;
274         }
275
276  done:
277   free_data_refs (drs);
278   return res;
279 }
280
281 /* Return true only when STMT is simple enough for being handled by
282    Graphite.  This depends on SCOP_ENTRY, as the parameters are
283    initialized relatively to this basic block, the linear functions
284    are initialized to OUTERMOST_LOOP and BB is the place where we try
285    to evaluate the STMT.  */
286
287 static bool
288 stmt_simple_for_scop_p (basic_block scop_entry, loop_p outermost_loop,
289                         gimple stmt, basic_block bb)
290 {
291   loop_p loop = bb->loop_father;
292
293   gcc_assert (scop_entry);
294
295   /* GIMPLE_ASM and GIMPLE_CALL may embed arbitrary side effects.
296      Calls have side-effects, except those to const or pure
297      functions.  */
298   if (gimple_has_volatile_ops (stmt)
299       || (gimple_code (stmt) == GIMPLE_CALL
300           && !(gimple_call_flags (stmt) & (ECF_CONST | ECF_PURE)))
301       || (gimple_code (stmt) == GIMPLE_ASM))
302     return false;
303
304   if (is_gimple_debug (stmt))
305     return true;
306
307   if (!stmt_has_simple_data_refs_p (outermost_loop, stmt))
308     return false;
309
310   switch (gimple_code (stmt))
311     {
312     case GIMPLE_RETURN:
313     case GIMPLE_LABEL:
314       return true;
315
316     case GIMPLE_COND:
317       {
318         tree op;
319         ssa_op_iter op_iter;
320         enum tree_code code = gimple_cond_code (stmt);
321
322         /* We can handle all binary comparisons.  Inequalities are
323            also supported as they can be represented with union of
324            polyhedra.  */
325         if (!(code == LT_EXPR
326               || code == GT_EXPR
327               || code == LE_EXPR
328               || code == GE_EXPR
329               || code == EQ_EXPR
330               || code == NE_EXPR))
331           return false;
332
333         FOR_EACH_SSA_TREE_OPERAND (op, stmt, op_iter, SSA_OP_ALL_USES)
334           if (!graphite_can_represent_expr (scop_entry, loop, op)
335               /* We can not handle REAL_TYPE. Failed for pr39260.  */
336               || TREE_CODE (TREE_TYPE (op)) == REAL_TYPE)
337             return false;
338
339         return true;
340       }
341
342     case GIMPLE_ASSIGN:
343     case GIMPLE_CALL:
344       return true;
345
346     default:
347       /* These nodes cut a new scope.  */
348       return false;
349     }
350
351   return false;
352 }
353
354 /* Returns the statement of BB that contains a harmful operation: that
355    can be a function call with side effects, the induction variables
356    are not linear with respect to SCOP_ENTRY, etc.  The current open
357    scop should end before this statement.  The evaluation is limited using
358    OUTERMOST_LOOP as outermost loop that may change.  */
359
360 static gimple
361 harmful_stmt_in_bb (basic_block scop_entry, loop_p outer_loop, basic_block bb)
362 {
363   gimple_stmt_iterator gsi;
364
365   for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
366     if (!stmt_simple_for_scop_p (scop_entry, outer_loop, gsi_stmt (gsi), bb))
367       return gsi_stmt (gsi);
368
369   return NULL;
370 }
371
372 /* Return true if LOOP can be represented in the polyhedral
373    representation.  This is evaluated taking SCOP_ENTRY and
374    OUTERMOST_LOOP in mind.  */
375
376 static bool
377 graphite_can_represent_loop (basic_block scop_entry, loop_p loop)
378 {
379   tree niter = number_of_latch_executions (loop);
380
381   /* Number of iterations unknown.  */
382   if (chrec_contains_undetermined (niter))
383     return false;
384
385   /* Number of iterations not affine.  */
386   if (!graphite_can_represent_expr (scop_entry, loop, niter))
387     return false;
388
389   return true;
390 }
391
392 /* Store information needed by scopdet_* functions.  */
393
394 struct scopdet_info
395 {
396   /* Exit of the open scop would stop if the current BB is harmful.  */
397   basic_block exit;
398
399   /* Where the next scop would start if the current BB is harmful.  */
400   basic_block next;
401
402   /* The bb or one of its children contains open loop exits.  That means
403      loop exit nodes that are not surrounded by a loop dominated by bb.  */
404   bool exits;
405
406   /* The bb or one of its children contains only structures we can handle.  */
407   bool difficult;
408 };
409
410 static struct scopdet_info build_scops_1 (basic_block, loop_p,
411                                           VEC (sd_region, heap) **, loop_p);
412
413 /* Calculates BB infos. If bb is difficult we add valid SCoPs dominated by BB
414    to SCOPS.  TYPE is the gbb_type of BB.  */
415
416 static struct scopdet_info
417 scopdet_basic_block_info (basic_block bb, loop_p outermost_loop,
418                           VEC (sd_region, heap) **scops, gbb_type type)
419 {
420   loop_p loop = bb->loop_father;
421   struct scopdet_info result;
422   gimple stmt;
423
424   /* XXX: ENTRY_BLOCK_PTR could be optimized in later steps.  */
425   basic_block entry_block = ENTRY_BLOCK_PTR;
426   stmt = harmful_stmt_in_bb (entry_block, outermost_loop, bb);
427   result.difficult = (stmt != NULL);
428   result.exit = NULL;
429
430   switch (type)
431     {
432     case GBB_LAST:
433       result.next = NULL;
434       result.exits = false;
435
436       /* Mark bbs terminating a SESE region difficult, if they start
437          a condition.  */
438       if (!single_succ_p (bb))
439         result.difficult = true;
440       else
441         result.exit = single_succ (bb);
442
443       break;
444
445     case GBB_SIMPLE:
446       result.next = single_succ (bb);
447       result.exits = false;
448       result.exit = single_succ (bb);
449       break;
450
451     case GBB_LOOP_SING_EXIT_HEADER:
452       {
453         VEC (sd_region, heap) *regions = VEC_alloc (sd_region, heap, 3);
454         struct scopdet_info sinfo;
455         edge exit_e = single_exit (loop);
456
457         sinfo = build_scops_1 (bb, outermost_loop, &regions, loop);
458
459         if (!graphite_can_represent_loop (entry_block, loop))
460           result.difficult = true;
461
462         result.difficult |= sinfo.difficult;
463
464         /* Try again with another loop level.  */
465         if (result.difficult
466             && loop_depth (outermost_loop) + 1 == loop_depth (loop))
467           {
468             outermost_loop = loop;
469
470             VEC_free (sd_region, heap, regions);
471             regions = VEC_alloc (sd_region, heap, 3);
472
473             sinfo = scopdet_basic_block_info (bb, outermost_loop, scops, type);
474
475             result = sinfo;
476             result.difficult = true;
477
478             if (sinfo.difficult)
479               move_sd_regions (&regions, scops);
480             else
481               {
482                 sd_region open_scop;
483                 open_scop.entry = bb;
484                 open_scop.exit = exit_e->dest;
485                 VEC_safe_push (sd_region, heap, *scops, &open_scop);
486                 VEC_free (sd_region, heap, regions);
487               }
488           }
489         else
490           {
491             result.exit = exit_e->dest;
492             result.next = exit_e->dest;
493
494             /* If we do not dominate result.next, remove it.  It's either
495                the EXIT_BLOCK_PTR, or another bb dominates it and will
496                call the scop detection for this bb.  */
497             if (!dominated_by_p (CDI_DOMINATORS, result.next, bb))
498               result.next = NULL;
499
500             if (exit_e->src->loop_father != loop)
501               result.next = NULL;
502
503             result.exits = false;
504
505             if (result.difficult)
506               move_sd_regions (&regions, scops);
507             else
508               VEC_free (sd_region, heap, regions);
509           }
510
511         break;
512       }
513
514     case GBB_LOOP_MULT_EXIT_HEADER:
515       {
516         /* XXX: For now we just do not join loops with multiple exits.  If the
517            exits lead to the same bb it may be possible to join the loop.  */
518         VEC (sd_region, heap) *regions = VEC_alloc (sd_region, heap, 3);
519         VEC (edge, heap) *exits = get_loop_exit_edges (loop);
520         edge e;
521         int i;
522         build_scops_1 (bb, loop, &regions, loop);
523
524         /* Scan the code dominated by this loop.  This means all bbs, that are
525            are dominated by a bb in this loop, but are not part of this loop.
526
527            The easiest case:
528              - The loop exit destination is dominated by the exit sources.
529
530            TODO: We miss here the more complex cases:
531                   - The exit destinations are dominated by another bb inside
532                     the loop.
533                   - The loop dominates bbs, that are not exit destinations.  */
534         FOR_EACH_VEC_ELT (edge, exits, i, e)
535           if (e->src->loop_father == loop
536               && dominated_by_p (CDI_DOMINATORS, e->dest, e->src))
537             {
538               if (loop_outer (outermost_loop))
539                 outermost_loop = loop_outer (outermost_loop);
540
541               /* Pass loop_outer to recognize e->dest as loop header in
542                  build_scops_1.  */
543               if (e->dest->loop_father->header == e->dest)
544                 build_scops_1 (e->dest, outermost_loop, &regions,
545                                loop_outer (e->dest->loop_father));
546               else
547                 build_scops_1 (e->dest, outermost_loop, &regions,
548                                e->dest->loop_father);
549             }
550
551         result.next = NULL;
552         result.exit = NULL;
553         result.difficult = true;
554         result.exits = false;
555         move_sd_regions (&regions, scops);
556         VEC_free (edge, heap, exits);
557         break;
558       }
559     case GBB_COND_HEADER:
560       {
561         VEC (sd_region, heap) *regions = VEC_alloc (sd_region, heap, 3);
562         struct scopdet_info sinfo;
563         VEC (basic_block, heap) *dominated;
564         int i;
565         basic_block dom_bb;
566         basic_block last_exit = NULL;
567         edge e;
568         result.exits = false;
569
570         /* First check the successors of BB, and check if it is
571            possible to join the different branches.  */
572         FOR_EACH_VEC_ELT (edge, bb->succs, i, e)
573           {
574             /* Ignore loop exits.  They will be handled after the loop
575                body.  */
576             if (loop_exits_to_bb_p (loop, e->dest))
577               {
578                 result.exits = true;
579                 continue;
580               }
581
582             /* Do not follow edges that lead to the end of the
583                conditions block.  For example, in
584
585                |   0
586                |  /|\
587                | 1 2 |
588                | | | |
589                | 3 4 |
590                |  \|/
591                |   6
592
593                the edge from 0 => 6.  Only check if all paths lead to
594                the same node 6.  */
595
596             if (!single_pred_p (e->dest))
597               {
598                 /* Check, if edge leads directly to the end of this
599                    condition.  */
600                 if (!last_exit)
601                   last_exit = e->dest;
602
603                 if (e->dest != last_exit)
604                   result.difficult = true;
605
606                 continue;
607               }
608
609             if (!dominated_by_p (CDI_DOMINATORS, e->dest, bb))
610               {
611                 result.difficult = true;
612                 continue;
613               }
614
615             sinfo = build_scops_1 (e->dest, outermost_loop, &regions, loop);
616
617             result.exits |= sinfo.exits;
618             result.difficult |= sinfo.difficult;
619
620             /* Checks, if all branches end at the same point.
621                If that is true, the condition stays joinable.
622                Have a look at the example above.  */
623             if (sinfo.exit)
624               {
625                 if (!last_exit)
626                   last_exit = sinfo.exit;
627
628                 if (sinfo.exit != last_exit)
629                   result.difficult = true;
630               }
631             else
632               result.difficult = true;
633           }
634
635         if (!last_exit)
636           result.difficult = true;
637
638         /* Join the branches of the condition if possible.  */
639         if (!result.exits && !result.difficult)
640           {
641             /* Only return a next pointer if we dominate this pointer.
642                Otherwise it will be handled by the bb dominating it.  */
643             if (dominated_by_p (CDI_DOMINATORS, last_exit, bb)
644                 && last_exit != bb)
645               result.next = last_exit;
646             else
647               result.next = NULL;
648
649             result.exit = last_exit;
650
651             VEC_free (sd_region, heap, regions);
652             break;
653           }
654
655         /* Scan remaining bbs dominated by BB.  */
656         dominated = get_dominated_by (CDI_DOMINATORS, bb);
657
658         FOR_EACH_VEC_ELT (basic_block, dominated, i, dom_bb)
659           {
660             /* Ignore loop exits: they will be handled after the loop body.  */
661             if (loop_depth (find_common_loop (loop, dom_bb->loop_father))
662                 < loop_depth (loop))
663               {
664                 result.exits = true;
665                 continue;
666               }
667
668             /* Ignore the bbs processed above.  */
669             if (single_pred_p (dom_bb) && single_pred (dom_bb) == bb)
670               continue;
671
672             if (loop_depth (loop) > loop_depth (dom_bb->loop_father))
673               sinfo = build_scops_1 (dom_bb, outermost_loop, &regions,
674                                      loop_outer (loop));
675             else
676               sinfo = build_scops_1 (dom_bb, outermost_loop, &regions, loop);
677
678             result.exits |= sinfo.exits;
679             result.difficult = true;
680             result.exit = NULL;
681           }
682
683         VEC_free (basic_block, heap, dominated);
684
685         result.next = NULL;
686         move_sd_regions (&regions, scops);
687
688         break;
689       }
690
691     default:
692       gcc_unreachable ();
693     }
694
695   return result;
696 }
697
698 /* Starting from CURRENT we walk the dominance tree and add new sd_regions to
699    SCOPS. The analyse if a sd_region can be handled is based on the value
700    of OUTERMOST_LOOP. Only loops inside OUTERMOST loops may change.  LOOP
701    is the loop in which CURRENT is handled.
702
703    TODO: These functions got a little bit big. They definitely should be cleaned
704          up.  */
705
706 static struct scopdet_info
707 build_scops_1 (basic_block current, loop_p outermost_loop,
708                VEC (sd_region, heap) **scops, loop_p loop)
709 {
710   bool in_scop = false;
711   sd_region open_scop;
712   struct scopdet_info sinfo;
713
714   /* Initialize result.  */
715   struct scopdet_info result;
716   result.exits = false;
717   result.difficult = false;
718   result.next = NULL;
719   result.exit = NULL;
720   open_scop.entry = NULL;
721   open_scop.exit = NULL;
722   sinfo.exit = NULL;
723
724   /* Loop over the dominance tree.  If we meet a difficult bb, close
725      the current SCoP.  Loop and condition header start a new layer,
726      and can only be added if all bbs in deeper layers are simple.  */
727   while (current != NULL)
728     {
729       sinfo = scopdet_basic_block_info (current, outermost_loop, scops,
730                                         get_bb_type (current, loop));
731
732       if (!in_scop && !(sinfo.exits || sinfo.difficult))
733         {
734           open_scop.entry = current;
735           open_scop.exit = NULL;
736           in_scop = true;
737         }
738       else if (in_scop && (sinfo.exits || sinfo.difficult))
739         {
740           open_scop.exit = current;
741           VEC_safe_push (sd_region, heap, *scops, &open_scop);
742           in_scop = false;
743         }
744
745       result.difficult |= sinfo.difficult;
746       result.exits |= sinfo.exits;
747
748       current = sinfo.next;
749     }
750
751   /* Try to close open_scop, if we are still in an open SCoP.  */
752   if (in_scop)
753     {
754       open_scop.exit = sinfo.exit;
755       gcc_assert (open_scop.exit);
756       VEC_safe_push (sd_region, heap, *scops, &open_scop);
757     }
758
759   result.exit = sinfo.exit;
760   return result;
761 }
762
763 /* Checks if a bb is contained in REGION.  */
764
765 static bool
766 bb_in_sd_region (basic_block bb, sd_region *region)
767 {
768   return bb_in_region (bb, region->entry, region->exit);
769 }
770
771 /* Returns the single entry edge of REGION, if it does not exits NULL.  */
772
773 static edge
774 find_single_entry_edge (sd_region *region)
775 {
776   edge e;
777   edge_iterator ei;
778   edge entry = NULL;
779
780   FOR_EACH_EDGE (e, ei, region->entry->preds)
781     if (!bb_in_sd_region (e->src, region))
782       {
783         if (entry)
784           {
785             entry = NULL;
786             break;
787           }
788
789         else
790           entry = e;
791       }
792
793   return entry;
794 }
795
796 /* Returns the single exit edge of REGION, if it does not exits NULL.  */
797
798 static edge
799 find_single_exit_edge (sd_region *region)
800 {
801   edge e;
802   edge_iterator ei;
803   edge exit = NULL;
804
805   FOR_EACH_EDGE (e, ei, region->exit->preds)
806     if (bb_in_sd_region (e->src, region))
807       {
808         if (exit)
809           {
810             exit = NULL;
811             break;
812           }
813
814         else
815           exit = e;
816       }
817
818   return exit;
819 }
820
821 /* Create a single entry edge for REGION.  */
822
823 static void
824 create_single_entry_edge (sd_region *region)
825 {
826   if (find_single_entry_edge (region))
827     return;
828
829   /* There are multiple predecessors for bb_3
830
831   |  1  2
832   |  | /
833   |  |/
834   |  3  <- entry
835   |  |\
836   |  | |
837   |  4 ^
838   |  | |
839   |  |/
840   |  5
841
842   There are two edges (1->3, 2->3), that point from outside into the region,
843   and another one (5->3), a loop latch, lead to bb_3.
844
845   We split bb_3.
846
847   |  1  2
848   |  | /
849   |  |/
850   |3.0
851   |  |\     (3.0 -> 3.1) = single entry edge
852   |3.1 |        <- entry
853   |  | |
854   |  | |
855   |  4 ^
856   |  | |
857   |  |/
858   |  5
859
860   If the loop is part of the SCoP, we have to redirect the loop latches.
861
862   |  1  2
863   |  | /
864   |  |/
865   |3.0
866   |  |      (3.0 -> 3.1) = entry edge
867   |3.1          <- entry
868   |  |\
869   |  | |
870   |  4 ^
871   |  | |
872   |  |/
873   |  5  */
874
875   if (region->entry->loop_father->header != region->entry
876       || dominated_by_p (CDI_DOMINATORS,
877                          loop_latch_edge (region->entry->loop_father)->src,
878                          region->exit))
879     {
880       edge forwarder = split_block_after_labels (region->entry);
881       region->entry = forwarder->dest;
882     }
883   else
884     /* This case is never executed, as the loop headers seem always to have a
885        single edge pointing from outside into the loop.  */
886     gcc_unreachable ();
887
888   gcc_checking_assert (find_single_entry_edge (region));
889 }
890
891 /* Check if the sd_region, mentioned in EDGE, has no exit bb.  */
892
893 static bool
894 sd_region_without_exit (edge e)
895 {
896   sd_region *r = (sd_region *) e->aux;
897
898   if (r)
899     return r->exit == NULL;
900   else
901     return false;
902 }
903
904 /* Create a single exit edge for REGION.  */
905
906 static void
907 create_single_exit_edge (sd_region *region)
908 {
909   edge e;
910   edge_iterator ei;
911   edge forwarder = NULL;
912   basic_block exit;
913
914   /* We create a forwarder bb (5) for all edges leaving this region
915      (3->5, 4->5).  All other edges leading to the same bb, are moved
916      to a new bb (6).  If these edges where part of another region (2->5)
917      we update the region->exit pointer, of this region.
918
919      To identify which edge belongs to which region we depend on the e->aux
920      pointer in every edge.  It points to the region of the edge or to NULL,
921      if the edge is not part of any region.
922
923      1 2 3 4    1->5 no region,                 2->5 region->exit = 5,
924       \| |/     3->5 region->exit = NULL,       4->5 region->exit = NULL
925         5       <- exit
926
927      changes to
928
929      1 2 3 4    1->6 no region,                         2->6 region->exit = 6,
930      | | \/     3->5 no region,                         4->5 no region,
931      | |  5
932       \| /      5->6 region->exit = 6
933         6
934
935      Now there is only a single exit edge (5->6).  */
936   exit = region->exit;
937   region->exit = NULL;
938   forwarder = make_forwarder_block (exit, &sd_region_without_exit, NULL);
939
940   /* Unmark the edges, that are no longer exit edges.  */
941   FOR_EACH_EDGE (e, ei, forwarder->src->preds)
942     if (e->aux)
943       e->aux = NULL;
944
945   /* Mark the new exit edge.  */
946   single_succ_edge (forwarder->src)->aux = region;
947
948   /* Update the exit bb of all regions, where exit edges lead to
949      forwarder->dest.  */
950   FOR_EACH_EDGE (e, ei, forwarder->dest->preds)
951     if (e->aux)
952       ((sd_region *) e->aux)->exit = forwarder->dest;
953
954   gcc_checking_assert (find_single_exit_edge (region));
955 }
956
957 /* Unmark the exit edges of all REGIONS.
958    See comment in "create_single_exit_edge". */
959
960 static void
961 unmark_exit_edges (VEC (sd_region, heap) *regions)
962 {
963   int i;
964   sd_region *s;
965   edge e;
966   edge_iterator ei;
967
968   FOR_EACH_VEC_ELT (sd_region, regions, i, s)
969     FOR_EACH_EDGE (e, ei, s->exit->preds)
970       e->aux = NULL;
971 }
972
973
974 /* Mark the exit edges of all REGIONS.
975    See comment in "create_single_exit_edge". */
976
977 static void
978 mark_exit_edges (VEC (sd_region, heap) *regions)
979 {
980   int i;
981   sd_region *s;
982   edge e;
983   edge_iterator ei;
984
985   FOR_EACH_VEC_ELT (sd_region, regions, i, s)
986     FOR_EACH_EDGE (e, ei, s->exit->preds)
987       if (bb_in_sd_region (e->src, s))
988         e->aux = s;
989 }
990
991 /* Create for all scop regions a single entry and a single exit edge.  */
992
993 static void
994 create_sese_edges (VEC (sd_region, heap) *regions)
995 {
996   int i;
997   sd_region *s;
998
999   FOR_EACH_VEC_ELT (sd_region, regions, i, s)
1000     create_single_entry_edge (s);
1001
1002   mark_exit_edges (regions);
1003
1004   FOR_EACH_VEC_ELT (sd_region, regions, i, s)
1005     /* Don't handle multiple edges exiting the function.  */
1006     if (!find_single_exit_edge (s)
1007         && s->exit != EXIT_BLOCK_PTR)
1008       create_single_exit_edge (s);
1009
1010   unmark_exit_edges (regions);
1011
1012   fix_loop_structure (NULL);
1013
1014 #ifdef ENABLE_CHECKING
1015   verify_loop_structure ();
1016   verify_dominators (CDI_DOMINATORS);
1017   verify_ssa (false);
1018 #endif
1019 }
1020
1021 /* Create graphite SCoPs from an array of scop detection REGIONS.  */
1022
1023 static void
1024 build_graphite_scops (VEC (sd_region, heap) *regions,
1025                       VEC (scop_p, heap) **scops)
1026 {
1027   int i;
1028   sd_region *s;
1029
1030   FOR_EACH_VEC_ELT (sd_region, regions, i, s)
1031     {
1032       edge entry = find_single_entry_edge (s);
1033       edge exit = find_single_exit_edge (s);
1034       scop_p scop;
1035
1036       if (!exit)
1037         continue;
1038
1039       scop = new_scop (new_sese (entry, exit));
1040       VEC_safe_push (scop_p, heap, *scops, scop);
1041
1042       /* Are there overlapping SCoPs?  */
1043 #ifdef ENABLE_CHECKING
1044         {
1045           int j;
1046           sd_region *s2;
1047
1048           FOR_EACH_VEC_ELT (sd_region, regions, j, s2)
1049             if (s != s2)
1050               gcc_assert (!bb_in_sd_region (s->entry, s2));
1051         }
1052 #endif
1053     }
1054 }
1055
1056 /* Returns true when BB contains only close phi nodes.  */
1057
1058 static bool
1059 contains_only_close_phi_nodes (basic_block bb)
1060 {
1061   gimple_stmt_iterator gsi;
1062
1063   for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1064     if (gimple_code (gsi_stmt (gsi)) != GIMPLE_LABEL)
1065       return false;
1066
1067   return true;
1068 }
1069
1070 /* Print statistics for SCOP to FILE.  */
1071
1072 static void
1073 print_graphite_scop_statistics (FILE* file, scop_p scop)
1074 {
1075   long n_bbs = 0;
1076   long n_loops = 0;
1077   long n_stmts = 0;
1078   long n_conditions = 0;
1079   long n_p_bbs = 0;
1080   long n_p_loops = 0;
1081   long n_p_stmts = 0;
1082   long n_p_conditions = 0;
1083
1084   basic_block bb;
1085
1086   FOR_ALL_BB (bb)
1087     {
1088       gimple_stmt_iterator psi;
1089       loop_p loop = bb->loop_father;
1090
1091       if (!bb_in_sese_p (bb, SCOP_REGION (scop)))
1092         continue;
1093
1094       n_bbs++;
1095       n_p_bbs += bb->count;
1096
1097       if (VEC_length (edge, bb->succs) > 1)
1098         {
1099           n_conditions++;
1100           n_p_conditions += bb->count;
1101         }
1102
1103       for (psi = gsi_start_bb (bb); !gsi_end_p (psi); gsi_next (&psi))
1104         {
1105           n_stmts++;
1106           n_p_stmts += bb->count;
1107         }
1108
1109       if (loop->header == bb && loop_in_sese_p (loop, SCOP_REGION (scop)))
1110         {
1111           n_loops++;
1112           n_p_loops += bb->count;
1113         }
1114
1115     }
1116
1117   fprintf (file, "\nBefore limit_scops SCoP statistics (");
1118   fprintf (file, "BBS:%ld, ", n_bbs);
1119   fprintf (file, "LOOPS:%ld, ", n_loops);
1120   fprintf (file, "CONDITIONS:%ld, ", n_conditions);
1121   fprintf (file, "STMTS:%ld)\n", n_stmts);
1122   fprintf (file, "\nBefore limit_scops SCoP profiling statistics (");
1123   fprintf (file, "BBS:%ld, ", n_p_bbs);
1124   fprintf (file, "LOOPS:%ld, ", n_p_loops);
1125   fprintf (file, "CONDITIONS:%ld, ", n_p_conditions);
1126   fprintf (file, "STMTS:%ld)\n", n_p_stmts);
1127 }
1128
1129 /* Print statistics for SCOPS to FILE.  */
1130
1131 static void
1132 print_graphite_statistics (FILE* file, VEC (scop_p, heap) *scops)
1133 {
1134   int i;
1135   scop_p scop;
1136
1137   FOR_EACH_VEC_ELT (scop_p, scops, i, scop)
1138     print_graphite_scop_statistics (file, scop);
1139 }
1140
1141 /* We limit all SCoPs to SCoPs, that are completely surrounded by a loop.
1142
1143    Example:
1144
1145    for (i      |
1146      {         |
1147        for (j  |  SCoP 1
1148        for (k  |
1149      }         |
1150
1151    * SCoP frontier, as this line is not surrounded by any loop. *
1152
1153    for (l      |  SCoP 2
1154
1155    This is necessary as scalar evolution and parameter detection need a
1156    outermost loop to initialize parameters correctly.
1157
1158    TODO: FIX scalar evolution and parameter detection to allow more flexible
1159          SCoP frontiers.  */
1160
1161 static void
1162 limit_scops (VEC (scop_p, heap) **scops)
1163 {
1164   VEC (sd_region, heap) *regions = VEC_alloc (sd_region, heap, 3);
1165
1166   int i;
1167   scop_p scop;
1168
1169   FOR_EACH_VEC_ELT (scop_p, *scops, i, scop)
1170     {
1171       int j;
1172       loop_p loop;
1173       sese region = SCOP_REGION (scop);
1174       build_sese_loop_nests (region);
1175
1176       FOR_EACH_VEC_ELT (loop_p, SESE_LOOP_NEST (region), j, loop)
1177         if (!loop_in_sese_p (loop_outer (loop), region)
1178             && single_exit (loop))
1179           {
1180             sd_region open_scop;
1181             open_scop.entry = loop->header;
1182             open_scop.exit = single_exit (loop)->dest;
1183
1184             /* This is a hack on top of the limit_scops hack.  The
1185                limit_scops hack should disappear all together.  */
1186             if (single_succ_p (open_scop.exit)
1187                 && contains_only_close_phi_nodes (open_scop.exit))
1188               open_scop.exit = single_succ_edge (open_scop.exit)->dest;
1189
1190             VEC_safe_push (sd_region, heap, regions, &open_scop);
1191           }
1192     }
1193
1194   free_scops (*scops);
1195   *scops = VEC_alloc (scop_p, heap, 3);
1196
1197   create_sese_edges (regions);
1198   build_graphite_scops (regions, scops);
1199   VEC_free (sd_region, heap, regions);
1200 }
1201
1202 /* Transforms LOOP to the canonical loop closed SSA form.  */
1203
1204 static void
1205 canonicalize_loop_closed_ssa (loop_p loop)
1206 {
1207   edge e = single_exit (loop);
1208   basic_block bb;
1209
1210   if (!e || e->flags & EDGE_ABNORMAL)
1211     return;
1212
1213   bb = e->dest;
1214
1215   if (VEC_length (edge, bb->preds) == 1)
1216     split_block_after_labels (bb);
1217   else
1218     {
1219       gimple_stmt_iterator psi;
1220       basic_block close = split_edge (e);
1221
1222       e = single_succ_edge (close);
1223
1224       for (psi = gsi_start_phis (bb); !gsi_end_p (psi); gsi_next (&psi))
1225         {
1226           gimple phi = gsi_stmt (psi);
1227           unsigned i;
1228
1229           for (i = 0; i < gimple_phi_num_args (phi); i++)
1230             if (gimple_phi_arg_edge (phi, i) == e)
1231               {
1232                 tree res, arg = gimple_phi_arg_def (phi, i);
1233                 use_operand_p use_p;
1234                 gimple close_phi;
1235
1236                 if (TREE_CODE (arg) != SSA_NAME)
1237                   continue;
1238
1239                 close_phi = create_phi_node (arg, close);
1240                 res = create_new_def_for (gimple_phi_result (close_phi),
1241                                           close_phi,
1242                                           gimple_phi_result_ptr (close_phi));
1243                 add_phi_arg (close_phi, arg,
1244                              gimple_phi_arg_edge (close_phi, 0),
1245                              UNKNOWN_LOCATION);
1246                 use_p = gimple_phi_arg_imm_use_ptr (phi, i);
1247                 replace_exp (use_p, res);
1248                 update_stmt (phi);
1249               }
1250         }
1251     }
1252 }
1253
1254 /* Converts the current loop closed SSA form to a canonical form
1255    expected by the Graphite code generation.
1256
1257    The loop closed SSA form has the following invariant: a variable
1258    defined in a loop that is used outside the loop appears only in the
1259    phi nodes in the destination of the loop exit.  These phi nodes are
1260    called close phi nodes.
1261
1262    The canonical loop closed SSA form contains the extra invariants:
1263
1264    - when the loop contains only one exit, the close phi nodes contain
1265    only one argument.  That implies that the basic block that contains
1266    the close phi nodes has only one predecessor, that is a basic block
1267    in the loop.
1268
1269    - the basic block containing the close phi nodes does not contain
1270    other statements.
1271 */
1272
1273 static void
1274 canonicalize_loop_closed_ssa_form (void)
1275 {
1276   loop_iterator li;
1277   loop_p loop;
1278
1279 #ifdef ENABLE_CHECKING
1280   verify_loop_closed_ssa (true);
1281 #endif
1282
1283   FOR_EACH_LOOP (li, loop, 0)
1284     canonicalize_loop_closed_ssa (loop);
1285
1286   rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa);
1287   update_ssa (TODO_update_ssa);
1288
1289 #ifdef ENABLE_CHECKING
1290   verify_loop_closed_ssa (true);
1291 #endif
1292 }
1293
1294 /* Find Static Control Parts (SCoP) in the current function and pushes
1295    them to SCOPS.  */
1296
1297 void
1298 build_scops (VEC (scop_p, heap) **scops)
1299 {
1300   struct loop *loop = current_loops->tree_root;
1301   VEC (sd_region, heap) *regions = VEC_alloc (sd_region, heap, 3);
1302
1303   canonicalize_loop_closed_ssa_form ();
1304   build_scops_1 (single_succ (ENTRY_BLOCK_PTR), ENTRY_BLOCK_PTR->loop_father,
1305                  &regions, loop);
1306   create_sese_edges (regions);
1307   build_graphite_scops (regions, scops);
1308
1309   if (dump_file && (dump_flags & TDF_DETAILS))
1310     print_graphite_statistics (dump_file, *scops);
1311
1312   limit_scops (scops);
1313   VEC_free (sd_region, heap, regions);
1314
1315   if (dump_file && (dump_flags & TDF_DETAILS))
1316     fprintf (dump_file, "\nnumber of SCoPs: %d\n",
1317              VEC_length (scop_p, *scops));
1318 }
1319
1320 /* Pretty print to FILE all the SCoPs in DOT format and mark them with
1321    different colors.  If there are not enough colors, paint the
1322    remaining SCoPs in gray.
1323
1324    Special nodes:
1325    - "*" after the node number denotes the entry of a SCoP,
1326    - "#" after the node number denotes the exit of a SCoP,
1327    - "()" around the node number denotes the entry or the
1328      exit nodes of the SCOP.  These are not part of SCoP.  */
1329
1330 static void
1331 dot_all_scops_1 (FILE *file, VEC (scop_p, heap) *scops)
1332 {
1333   basic_block bb;
1334   edge e;
1335   edge_iterator ei;
1336   scop_p scop;
1337   const char* color;
1338   int i;
1339
1340   /* Disable debugging while printing graph.  */
1341   int tmp_dump_flags = dump_flags;
1342   dump_flags = 0;
1343
1344   fprintf (file, "digraph all {\n");
1345
1346   FOR_ALL_BB (bb)
1347     {
1348       int part_of_scop = false;
1349
1350       /* Use HTML for every bb label.  So we are able to print bbs
1351          which are part of two different SCoPs, with two different
1352          background colors.  */
1353       fprintf (file, "%d [label=<\n  <TABLE BORDER=\"0\" CELLBORDER=\"1\" ",
1354                      bb->index);
1355       fprintf (file, "CELLSPACING=\"0\">\n");
1356
1357       /* Select color for SCoP.  */
1358       FOR_EACH_VEC_ELT (scop_p, scops, i, scop)
1359         {
1360           sese region = SCOP_REGION (scop);
1361           if (bb_in_sese_p (bb, region)
1362               || (SESE_EXIT_BB (region) == bb)
1363               || (SESE_ENTRY_BB (region) == bb))
1364             {
1365               switch (i % 17)
1366                 {
1367                 case 0: /* red */
1368                   color = "#e41a1c";
1369                   break;
1370                 case 1: /* blue */
1371                   color = "#377eb8";
1372                   break;
1373                 case 2: /* green */
1374                   color = "#4daf4a";
1375                   break;
1376                 case 3: /* purple */
1377                   color = "#984ea3";
1378                   break;
1379                 case 4: /* orange */
1380                   color = "#ff7f00";
1381                   break;
1382                 case 5: /* yellow */
1383                   color = "#ffff33";
1384                   break;
1385                 case 6: /* brown */
1386                   color = "#a65628";
1387                   break;
1388                 case 7: /* rose */
1389                   color = "#f781bf";
1390                   break;
1391                 case 8:
1392                   color = "#8dd3c7";
1393                   break;
1394                 case 9:
1395                   color = "#ffffb3";
1396                   break;
1397                 case 10:
1398                   color = "#bebada";
1399                   break;
1400                 case 11:
1401                   color = "#fb8072";
1402                   break;
1403                 case 12:
1404                   color = "#80b1d3";
1405                   break;
1406                 case 13:
1407                   color = "#fdb462";
1408                   break;
1409                 case 14:
1410                   color = "#b3de69";
1411                   break;
1412                 case 15:
1413                   color = "#fccde5";
1414                   break;
1415                 case 16:
1416                   color = "#bc80bd";
1417                   break;
1418                 default: /* gray */
1419                   color = "#999999";
1420                 }
1421
1422               fprintf (file, "    <TR><TD WIDTH=\"50\" BGCOLOR=\"%s\">", color);
1423
1424               if (!bb_in_sese_p (bb, region))
1425                 fprintf (file, " (");
1426
1427               if (bb == SESE_ENTRY_BB (region)
1428                   && bb == SESE_EXIT_BB (region))
1429                 fprintf (file, " %d*# ", bb->index);
1430               else if (bb == SESE_ENTRY_BB (region))
1431                 fprintf (file, " %d* ", bb->index);
1432               else if (bb == SESE_EXIT_BB (region))
1433                 fprintf (file, " %d# ", bb->index);
1434               else
1435                 fprintf (file, " %d ", bb->index);
1436
1437               if (!bb_in_sese_p (bb,region))
1438                 fprintf (file, ")");
1439
1440               fprintf (file, "</TD></TR>\n");
1441               part_of_scop  = true;
1442             }
1443         }
1444
1445       if (!part_of_scop)
1446         {
1447           fprintf (file, "    <TR><TD WIDTH=\"50\" BGCOLOR=\"#ffffff\">");
1448           fprintf (file, " %d </TD></TR>\n", bb->index);
1449         }
1450       fprintf (file, "  </TABLE>>, shape=box, style=\"setlinewidth(0)\"]\n");
1451     }
1452
1453   FOR_ALL_BB (bb)
1454     {
1455       FOR_EACH_EDGE (e, ei, bb->succs)
1456               fprintf (file, "%d -> %d;\n", bb->index, e->dest->index);
1457     }
1458
1459   fputs ("}\n\n", file);
1460
1461   /* Enable debugging again.  */
1462   dump_flags = tmp_dump_flags;
1463 }
1464
1465 /* Display all SCoPs using dotty.  */
1466
1467 DEBUG_FUNCTION void
1468 dot_all_scops (VEC (scop_p, heap) *scops)
1469 {
1470   /* When debugging, enable the following code.  This cannot be used
1471      in production compilers because it calls "system".  */
1472 #if 0
1473   int x;
1474   FILE *stream = fopen ("/tmp/allscops.dot", "w");
1475   gcc_assert (stream);
1476
1477   dot_all_scops_1 (stream, scops);
1478   fclose (stream);
1479
1480   x = system ("dotty /tmp/allscops.dot &");
1481 #else
1482   dot_all_scops_1 (stderr, scops);
1483 #endif
1484 }
1485
1486 /* Display all SCoPs using dotty.  */
1487
1488 DEBUG_FUNCTION void
1489 dot_scop (scop_p scop)
1490 {
1491   VEC (scop_p, heap) *scops = NULL;
1492
1493   if (scop)
1494     VEC_safe_push (scop_p, heap, scops, scop);
1495
1496   /* When debugging, enable the following code.  This cannot be used
1497      in production compilers because it calls "system".  */
1498 #if 0
1499   {
1500     int x;
1501     FILE *stream = fopen ("/tmp/allscops.dot", "w");
1502     gcc_assert (stream);
1503
1504     dot_all_scops_1 (stream, scops);
1505     fclose (stream);
1506     x = system ("dotty /tmp/allscops.dot &");
1507   }
1508 #else
1509   dot_all_scops_1 (stderr, scops);
1510 #endif
1511
1512   VEC_free (scop_p, heap, scops);
1513 }
1514
1515 #endif