OSDN Git Service

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