OSDN Git Service

2013-02-15 Vladimir Makarov <vmakarov@redhat.com>
[pf3gnuchains/gcc-fork.git] / gcc / cfgloop.c
1 /* Natural loop discovery code for GNU compiler.
2    Copyright (C) 2000-2013 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3.  If not see
18 <http://www.gnu.org/licenses/>.  */
19
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "tm.h"
24 #include "rtl.h"
25 #include "function.h"
26 #include "basic-block.h"
27 #include "cfgloop.h"
28 #include "diagnostic-core.h"
29 #include "flags.h"
30 #include "tree.h"
31 #include "tree-flow.h"
32 #include "pointer-set.h"
33 #include "ggc.h"
34 #include "dumpfile.h"
35
36 static void flow_loops_cfg_dump (FILE *);
37 \f
38 /* Dump loop related CFG information.  */
39
40 static void
41 flow_loops_cfg_dump (FILE *file)
42 {
43   basic_block bb;
44
45   if (!file)
46     return;
47
48   FOR_EACH_BB (bb)
49     {
50       edge succ;
51       edge_iterator ei;
52
53       fprintf (file, ";; %d succs { ", bb->index);
54       FOR_EACH_EDGE (succ, ei, bb->succs)
55         fprintf (file, "%d ", succ->dest->index);
56       fprintf (file, "}\n");
57     }
58 }
59
60 /* Return nonzero if the nodes of LOOP are a subset of OUTER.  */
61
62 bool
63 flow_loop_nested_p (const struct loop *outer, const struct loop *loop)
64 {
65   unsigned odepth = loop_depth (outer);
66
67   return (loop_depth (loop) > odepth
68           && (*loop->superloops)[odepth] == outer);
69 }
70
71 /* Returns the loop such that LOOP is nested DEPTH (indexed from zero)
72    loops within LOOP.  */
73
74 struct loop *
75 superloop_at_depth (struct loop *loop, unsigned depth)
76 {
77   unsigned ldepth = loop_depth (loop);
78
79   gcc_assert (depth <= ldepth);
80
81   if (depth == ldepth)
82     return loop;
83
84   return (*loop->superloops)[depth];
85 }
86
87 /* Returns the list of the latch edges of LOOP.  */
88
89 static vec<edge> 
90 get_loop_latch_edges (const struct loop *loop)
91 {
92   edge_iterator ei;
93   edge e;
94   vec<edge> ret = vNULL;
95
96   FOR_EACH_EDGE (e, ei, loop->header->preds)
97     {
98       if (dominated_by_p (CDI_DOMINATORS, e->src, loop->header))
99         ret.safe_push (e);
100     }
101
102   return ret;
103 }
104
105 /* Dump the loop information specified by LOOP to the stream FILE
106    using auxiliary dump callback function LOOP_DUMP_AUX if non null.  */
107
108 void
109 flow_loop_dump (const struct loop *loop, FILE *file,
110                 void (*loop_dump_aux) (const struct loop *, FILE *, int),
111                 int verbose)
112 {
113   basic_block *bbs;
114   unsigned i;
115   vec<edge> latches;
116   edge e;
117
118   if (! loop || ! loop->header)
119     return;
120
121   fprintf (file, ";;\n;; Loop %d\n", loop->num);
122
123   fprintf (file, ";;  header %d, ", loop->header->index);
124   if (loop->latch)
125     fprintf (file, "latch %d\n", loop->latch->index);
126   else
127     {
128       fprintf (file, "multiple latches:");
129       latches = get_loop_latch_edges (loop);
130       FOR_EACH_VEC_ELT (latches, i, e)
131         fprintf (file, " %d", e->src->index);
132       latches.release ();
133       fprintf (file, "\n");
134     }
135
136   fprintf (file, ";;  depth %d, outer %ld\n",
137            loop_depth (loop), (long) (loop_outer (loop)
138                                       ? loop_outer (loop)->num : -1));
139
140   fprintf (file, ";;  nodes:");
141   bbs = get_loop_body (loop);
142   for (i = 0; i < loop->num_nodes; i++)
143     fprintf (file, " %d", bbs[i]->index);
144   free (bbs);
145   fprintf (file, "\n");
146
147   if (loop_dump_aux)
148     loop_dump_aux (loop, file, verbose);
149 }
150
151 /* Dump the loop information about loops to the stream FILE,
152    using auxiliary dump callback function LOOP_DUMP_AUX if non null.  */
153
154 void
155 flow_loops_dump (FILE *file, void (*loop_dump_aux) (const struct loop *, FILE *, int), int verbose)
156 {
157   loop_iterator li;
158   struct loop *loop;
159
160   if (!current_loops || ! file)
161     return;
162
163   fprintf (file, ";; %d loops found\n", number_of_loops ());
164
165   FOR_EACH_LOOP (li, loop, LI_INCLUDE_ROOT)
166     {
167       flow_loop_dump (loop, file, loop_dump_aux, verbose);
168     }
169
170   if (verbose)
171     flow_loops_cfg_dump (file);
172 }
173
174 /* Free data allocated for LOOP.  */
175
176 void
177 flow_loop_free (struct loop *loop)
178 {
179   struct loop_exit *exit, *next;
180
181   vec_free (loop->superloops);
182
183   /* Break the list of the loop exit records.  They will be freed when the
184      corresponding edge is rescanned or removed, and this avoids
185      accessing the (already released) head of the list stored in the
186      loop structure.  */
187   for (exit = loop->exits->next; exit != loop->exits; exit = next)
188     {
189       next = exit->next;
190       exit->next = exit;
191       exit->prev = exit;
192     }
193
194   ggc_free (loop->exits);
195   ggc_free (loop);
196 }
197
198 /* Free all the memory allocated for LOOPS.  */
199
200 void
201 flow_loops_free (struct loops *loops)
202 {
203   if (loops->larray)
204     {
205       unsigned i;
206       loop_p loop;
207
208       /* Free the loop descriptors.  */
209       FOR_EACH_VEC_SAFE_ELT (loops->larray, i, loop)
210         {
211           if (!loop)
212             continue;
213
214           flow_loop_free (loop);
215         }
216
217       vec_free (loops->larray);
218     }
219 }
220
221 /* Find the nodes contained within the LOOP with header HEADER.
222    Return the number of nodes within the loop.  */
223
224 int
225 flow_loop_nodes_find (basic_block header, struct loop *loop)
226 {
227   vec<basic_block> stack = vNULL;
228   int num_nodes = 1;
229   edge latch;
230   edge_iterator latch_ei;
231
232   header->loop_father = loop;
233
234   FOR_EACH_EDGE (latch, latch_ei, loop->header->preds)
235     {
236       if (latch->src->loop_father == loop
237           || !dominated_by_p (CDI_DOMINATORS, latch->src, loop->header))
238         continue;
239
240       num_nodes++;
241       stack.safe_push (latch->src);
242       latch->src->loop_father = loop;
243
244       while (!stack.is_empty ())
245         {
246           basic_block node;
247           edge e;
248           edge_iterator ei;
249
250           node = stack.pop ();
251
252           FOR_EACH_EDGE (e, ei, node->preds)
253             {
254               basic_block ancestor = e->src;
255
256               if (ancestor->loop_father != loop)
257                 {
258                   ancestor->loop_father = loop;
259                   num_nodes++;
260                   stack.safe_push (ancestor);
261                 }
262             }
263         }
264     }
265   stack.release ();
266
267   return num_nodes;
268 }
269
270 /* Records the vector of superloops of the loop LOOP, whose immediate
271    superloop is FATHER.  */
272
273 static void
274 establish_preds (struct loop *loop, struct loop *father)
275 {
276   loop_p ploop;
277   unsigned depth = loop_depth (father) + 1;
278   unsigned i;
279
280   loop->superloops = 0;
281   vec_alloc (loop->superloops, depth);
282   FOR_EACH_VEC_SAFE_ELT (father->superloops, i, ploop)
283     loop->superloops->quick_push (ploop);
284   loop->superloops->quick_push (father);
285
286   for (ploop = loop->inner; ploop; ploop = ploop->next)
287     establish_preds (ploop, loop);
288 }
289
290 /* Add LOOP to the loop hierarchy tree where FATHER is father of the
291    added loop.  If LOOP has some children, take care of that their
292    pred field will be initialized correctly.  */
293
294 void
295 flow_loop_tree_node_add (struct loop *father, struct loop *loop)
296 {
297   loop->next = father->inner;
298   father->inner = loop;
299
300   establish_preds (loop, father);
301 }
302
303 /* Remove LOOP from the loop hierarchy tree.  */
304
305 void
306 flow_loop_tree_node_remove (struct loop *loop)
307 {
308   struct loop *prev, *father;
309
310   father = loop_outer (loop);
311
312   /* Remove loop from the list of sons.  */
313   if (father->inner == loop)
314     father->inner = loop->next;
315   else
316     {
317       for (prev = father->inner; prev->next != loop; prev = prev->next)
318         continue;
319       prev->next = loop->next;
320     }
321
322   loop->superloops = NULL;
323 }
324
325 /* Allocates and returns new loop structure.  */
326
327 struct loop *
328 alloc_loop (void)
329 {
330   struct loop *loop = ggc_alloc_cleared_loop ();
331
332   loop->exits = ggc_alloc_cleared_loop_exit ();
333   loop->exits->next = loop->exits->prev = loop->exits;
334   loop->can_be_parallel = false;
335
336   return loop;
337 }
338
339 /* Initializes loops structure LOOPS, reserving place for NUM_LOOPS loops
340    (including the root of the loop tree).  */
341
342 static void
343 init_loops_structure (struct loops *loops, unsigned num_loops)
344 {
345   struct loop *root;
346
347   memset (loops, 0, sizeof *loops);
348   vec_alloc (loops->larray, num_loops);
349
350   /* Dummy loop containing whole function.  */
351   root = alloc_loop ();
352   root->num_nodes = n_basic_blocks;
353   root->latch = EXIT_BLOCK_PTR;
354   root->header = ENTRY_BLOCK_PTR;
355   ENTRY_BLOCK_PTR->loop_father = root;
356   EXIT_BLOCK_PTR->loop_father = root;
357
358   loops->larray->quick_push (root);
359   loops->tree_root = root;
360 }
361
362 /* Returns whether HEADER is a loop header.  */
363
364 bool
365 bb_loop_header_p (basic_block header)
366 {
367   edge_iterator ei;
368   edge e;
369
370   /* If we have an abnormal predecessor, do not consider the
371      loop (not worth the problems).  */
372   if (bb_has_abnormal_pred (header))
373     return false;
374
375   /* Look for back edges where a predecessor is dominated
376      by this block.  A natural loop has a single entry
377      node (header) that dominates all the nodes in the
378      loop.  It also has single back edge to the header
379      from a latch node.  */
380   FOR_EACH_EDGE (e, ei, header->preds)
381     {
382       basic_block latch = e->src;
383       if (latch != ENTRY_BLOCK_PTR
384           && dominated_by_p (CDI_DOMINATORS, latch, header))
385         return true;
386     }
387
388   return false;
389 }
390
391 /* Find all the natural loops in the function and save in LOOPS structure and
392    recalculate loop_father information in basic block structures.
393    If LOOPS is non-NULL then the loop structures for already recorded loops
394    will be re-used and their number will not change.  We assume that no
395    stale loops exist in LOOPS.
396    When LOOPS is NULL it is allocated and re-built from scratch.
397    Return the built LOOPS structure.  */
398
399 struct loops *
400 flow_loops_find (struct loops *loops)
401 {
402   bool from_scratch = (loops == NULL);
403   int *rc_order;
404   int b;
405   unsigned i;
406   vec<loop_p> larray;
407
408   /* Ensure that the dominators are computed.  */
409   calculate_dominance_info (CDI_DOMINATORS);
410
411   if (!loops)
412     {
413       loops = ggc_alloc_cleared_loops ();
414       init_loops_structure (loops, 1);
415     }
416
417   /* Ensure that loop exits were released.  */
418   gcc_assert (loops->exits == NULL);
419
420   /* Taking care of this degenerate case makes the rest of
421      this code simpler.  */
422   if (n_basic_blocks == NUM_FIXED_BLOCKS)
423     return loops;
424
425   /* The root loop node contains all basic-blocks.  */
426   loops->tree_root->num_nodes = n_basic_blocks;
427
428   /* Compute depth first search order of the CFG so that outer
429      natural loops will be found before inner natural loops.  */
430   rc_order = XNEWVEC (int, n_basic_blocks);
431   pre_and_rev_post_order_compute (NULL, rc_order, false);
432
433   /* Gather all loop headers in reverse completion order and allocate
434      loop structures for loops that are not already present.  */
435   larray.create (loops->larray->length());
436   for (b = 0; b < n_basic_blocks - NUM_FIXED_BLOCKS; b++)
437     {
438       basic_block header = BASIC_BLOCK (rc_order[b]);
439       if (bb_loop_header_p (header))
440         {
441           struct loop *loop;
442
443           /* The current active loop tree has valid loop-fathers for
444              header blocks.  */
445           if (!from_scratch
446               && header->loop_father->header == header)
447             {
448               loop = header->loop_father;
449               /* If we found an existing loop remove it from the
450                  loop tree.  It is going to be inserted again
451                  below.  */
452               flow_loop_tree_node_remove (loop);
453             }
454           else
455             {
456               /* Otherwise allocate a new loop structure for the loop.  */
457               loop = alloc_loop ();
458               /* ???  We could re-use unused loop slots here.  */
459               loop->num = loops->larray->length ();
460               vec_safe_push (loops->larray, loop);
461               loop->header = header;
462
463               if (!from_scratch
464                   && dump_file && (dump_flags & TDF_DETAILS))
465                 fprintf (dump_file, "flow_loops_find: discovered new "
466                          "loop %d with header %d\n",
467                          loop->num, header->index);
468             }
469           larray.safe_push (loop);
470         }
471
472       /* Make blocks part of the loop root node at start.  */
473       header->loop_father = loops->tree_root;
474     }
475
476   free (rc_order);
477
478   /* Now iterate over the loops found, insert them into the loop tree
479      and assign basic-block ownership.  */
480   for (i = 0; i < larray.length (); ++i)
481     {
482       struct loop *loop = larray[i];
483       basic_block header = loop->header;
484       edge_iterator ei;
485       edge e;
486
487       flow_loop_tree_node_add (header->loop_father, loop);
488       loop->num_nodes = flow_loop_nodes_find (loop->header, loop);
489
490       /* Look for the latch for this header block, if it has just a
491          single one.  */
492       FOR_EACH_EDGE (e, ei, header->preds)
493         {
494           basic_block latch = e->src;
495
496           if (flow_bb_inside_loop_p (loop, latch))
497             {
498               if (loop->latch != NULL)
499                 {
500                   /* More than one latch edge.  */
501                   loop->latch = NULL;
502                   break;
503                 }
504               loop->latch = latch;
505             }
506         }
507     }
508
509   larray.release();
510
511   return loops;
512 }
513
514 /* Ratio of frequencies of edges so that one of more latch edges is
515    considered to belong to inner loop with same header.  */
516 #define HEAVY_EDGE_RATIO 8
517
518 /* Minimum number of samples for that we apply
519    find_subloop_latch_edge_by_profile heuristics.  */
520 #define HEAVY_EDGE_MIN_SAMPLES 10
521
522 /* If the profile info is available, finds an edge in LATCHES that much more
523    frequent than the remaining edges.  Returns such an edge, or NULL if we do
524    not find one.
525
526    We do not use guessed profile here, only the measured one.  The guessed
527    profile is usually too flat and unreliable for this (and it is mostly based
528    on the loop structure of the program, so it does not make much sense to
529    derive the loop structure from it).  */
530
531 static edge
532 find_subloop_latch_edge_by_profile (vec<edge> latches)
533 {
534   unsigned i;
535   edge e, me = NULL;
536   gcov_type mcount = 0, tcount = 0;
537
538   FOR_EACH_VEC_ELT (latches, i, e)
539     {
540       if (e->count > mcount)
541         {
542           me = e;
543           mcount = e->count;
544         }
545       tcount += e->count;
546     }
547
548   if (tcount < HEAVY_EDGE_MIN_SAMPLES
549       || (tcount - mcount) * HEAVY_EDGE_RATIO > tcount)
550     return NULL;
551
552   if (dump_file)
553     fprintf (dump_file,
554              "Found latch edge %d -> %d using profile information.\n",
555              me->src->index, me->dest->index);
556   return me;
557 }
558
559 /* Among LATCHES, guesses a latch edge of LOOP corresponding to subloop, based
560    on the structure of induction variables.  Returns this edge, or NULL if we
561    do not find any.
562
563    We are quite conservative, and look just for an obvious simple innermost
564    loop (which is the case where we would lose the most performance by not
565    disambiguating the loop).  More precisely, we look for the following
566    situation: The source of the chosen latch edge dominates sources of all
567    the other latch edges.  Additionally, the header does not contain a phi node
568    such that the argument from the chosen edge is equal to the argument from
569    another edge.  */
570
571 static edge
572 find_subloop_latch_edge_by_ivs (struct loop *loop ATTRIBUTE_UNUSED, vec<edge> latches)
573 {
574   edge e, latch = latches[0];
575   unsigned i;
576   gimple phi;
577   gimple_stmt_iterator psi;
578   tree lop;
579   basic_block bb;
580
581   /* Find the candidate for the latch edge.  */
582   for (i = 1; latches.iterate (i, &e); i++)
583     if (dominated_by_p (CDI_DOMINATORS, latch->src, e->src))
584       latch = e;
585
586   /* Verify that it dominates all the latch edges.  */
587   FOR_EACH_VEC_ELT (latches, i, e)
588     if (!dominated_by_p (CDI_DOMINATORS, e->src, latch->src))
589       return NULL;
590
591   /* Check for a phi node that would deny that this is a latch edge of
592      a subloop.  */
593   for (psi = gsi_start_phis (loop->header); !gsi_end_p (psi); gsi_next (&psi))
594     {
595       phi = gsi_stmt (psi);
596       lop = PHI_ARG_DEF_FROM_EDGE (phi, latch);
597
598       /* Ignore the values that are not changed inside the subloop.  */
599       if (TREE_CODE (lop) != SSA_NAME
600           || SSA_NAME_DEF_STMT (lop) == phi)
601         continue;
602       bb = gimple_bb (SSA_NAME_DEF_STMT (lop));
603       if (!bb || !flow_bb_inside_loop_p (loop, bb))
604         continue;
605
606       FOR_EACH_VEC_ELT (latches, i, e)
607         if (e != latch
608             && PHI_ARG_DEF_FROM_EDGE (phi, e) == lop)
609           return NULL;
610     }
611
612   if (dump_file)
613     fprintf (dump_file,
614              "Found latch edge %d -> %d using iv structure.\n",
615              latch->src->index, latch->dest->index);
616   return latch;
617 }
618
619 /* If we can determine that one of the several latch edges of LOOP behaves
620    as a latch edge of a separate subloop, returns this edge.  Otherwise
621    returns NULL.  */
622
623 static edge
624 find_subloop_latch_edge (struct loop *loop)
625 {
626   vec<edge> latches = get_loop_latch_edges (loop);
627   edge latch = NULL;
628
629   if (latches.length () > 1)
630     {
631       latch = find_subloop_latch_edge_by_profile (latches);
632
633       if (!latch
634           /* We consider ivs to guess the latch edge only in SSA.  Perhaps we
635              should use cfghook for this, but it is hard to imagine it would
636              be useful elsewhere.  */
637           && current_ir_type () == IR_GIMPLE)
638         latch = find_subloop_latch_edge_by_ivs (loop, latches);
639     }
640
641   latches.release ();
642   return latch;
643 }
644
645 /* Callback for make_forwarder_block.  Returns true if the edge E is marked
646    in the set MFB_REIS_SET.  */
647
648 static struct pointer_set_t *mfb_reis_set;
649 static bool
650 mfb_redirect_edges_in_set (edge e)
651 {
652   return pointer_set_contains (mfb_reis_set, e);
653 }
654
655 /* Creates a subloop of LOOP with latch edge LATCH.  */
656
657 static void
658 form_subloop (struct loop *loop, edge latch)
659 {
660   edge_iterator ei;
661   edge e, new_entry;
662   struct loop *new_loop;
663
664   mfb_reis_set = pointer_set_create ();
665   FOR_EACH_EDGE (e, ei, loop->header->preds)
666     {
667       if (e != latch)
668         pointer_set_insert (mfb_reis_set, e);
669     }
670   new_entry = make_forwarder_block (loop->header, mfb_redirect_edges_in_set,
671                                     NULL);
672   pointer_set_destroy (mfb_reis_set);
673
674   loop->header = new_entry->src;
675
676   /* Find the blocks and subloops that belong to the new loop, and add it to
677      the appropriate place in the loop tree.  */
678   new_loop = alloc_loop ();
679   new_loop->header = new_entry->dest;
680   new_loop->latch = latch->src;
681   add_loop (new_loop, loop);
682 }
683
684 /* Make all the latch edges of LOOP to go to a single forwarder block --
685    a new latch of LOOP.  */
686
687 static void
688 merge_latch_edges (struct loop *loop)
689 {
690   vec<edge> latches = get_loop_latch_edges (loop);
691   edge latch, e;
692   unsigned i;
693
694   gcc_assert (latches.length () > 0);
695
696   if (latches.length () == 1)
697     loop->latch = latches[0]->src;
698   else
699     {
700       if (dump_file)
701         fprintf (dump_file, "Merged latch edges of loop %d\n", loop->num);
702
703       mfb_reis_set = pointer_set_create ();
704       FOR_EACH_VEC_ELT (latches, i, e)
705         pointer_set_insert (mfb_reis_set, e);
706       latch = make_forwarder_block (loop->header, mfb_redirect_edges_in_set,
707                                     NULL);
708       pointer_set_destroy (mfb_reis_set);
709
710       loop->header = latch->dest;
711       loop->latch = latch->src;
712     }
713
714   latches.release ();
715 }
716
717 /* LOOP may have several latch edges.  Transform it into (possibly several)
718    loops with single latch edge.  */
719
720 static void
721 disambiguate_multiple_latches (struct loop *loop)
722 {
723   edge e;
724
725   /* We eliminate the multiple latches by splitting the header to the forwarder
726      block F and the rest R, and redirecting the edges.  There are two cases:
727
728      1) If there is a latch edge E that corresponds to a subloop (we guess
729         that based on profile -- if it is taken much more often than the
730         remaining edges; and on trees, using the information about induction
731         variables of the loops), we redirect E to R, all the remaining edges to
732         F, then rescan the loops and try again for the outer loop.
733      2) If there is no such edge, we redirect all latch edges to F, and the
734         entry edges to R, thus making F the single latch of the loop.  */
735
736   if (dump_file)
737     fprintf (dump_file, "Disambiguating loop %d with multiple latches\n",
738              loop->num);
739
740   /* During latch merging, we may need to redirect the entry edges to a new
741      block.  This would cause problems if the entry edge was the one from the
742      entry block.  To avoid having to handle this case specially, split
743      such entry edge.  */
744   e = find_edge (ENTRY_BLOCK_PTR, loop->header);
745   if (e)
746     split_edge (e);
747
748   while (1)
749     {
750       e = find_subloop_latch_edge (loop);
751       if (!e)
752         break;
753
754       form_subloop (loop, e);
755     }
756
757   merge_latch_edges (loop);
758 }
759
760 /* Split loops with multiple latch edges.  */
761
762 void
763 disambiguate_loops_with_multiple_latches (void)
764 {
765   loop_iterator li;
766   struct loop *loop;
767
768   FOR_EACH_LOOP (li, loop, 0)
769     {
770       if (!loop->latch)
771         disambiguate_multiple_latches (loop);
772     }
773 }
774
775 /* Return nonzero if basic block BB belongs to LOOP.  */
776 bool
777 flow_bb_inside_loop_p (const struct loop *loop, const_basic_block bb)
778 {
779   struct loop *source_loop;
780
781   if (bb == ENTRY_BLOCK_PTR || bb == EXIT_BLOCK_PTR)
782     return 0;
783
784   source_loop = bb->loop_father;
785   return loop == source_loop || flow_loop_nested_p (loop, source_loop);
786 }
787
788 /* Enumeration predicate for get_loop_body_with_size.  */
789 static bool
790 glb_enum_p (const_basic_block bb, const void *glb_loop)
791 {
792   const struct loop *const loop = (const struct loop *) glb_loop;
793   return (bb != loop->header
794           && dominated_by_p (CDI_DOMINATORS, bb, loop->header));
795 }
796
797 /* Gets basic blocks of a LOOP.  Header is the 0-th block, rest is in dfs
798    order against direction of edges from latch.  Specially, if
799    header != latch, latch is the 1-st block.  LOOP cannot be the fake
800    loop tree root, and its size must be at most MAX_SIZE.  The blocks
801    in the LOOP body are stored to BODY, and the size of the LOOP is
802    returned.  */
803
804 unsigned
805 get_loop_body_with_size (const struct loop *loop, basic_block *body,
806                          unsigned max_size)
807 {
808   return dfs_enumerate_from (loop->header, 1, glb_enum_p,
809                              body, max_size, loop);
810 }
811
812 /* Gets basic blocks of a LOOP.  Header is the 0-th block, rest is in dfs
813    order against direction of edges from latch.  Specially, if
814    header != latch, latch is the 1-st block.  */
815
816 basic_block *
817 get_loop_body (const struct loop *loop)
818 {
819   basic_block *body, bb;
820   unsigned tv = 0;
821
822   gcc_assert (loop->num_nodes);
823
824   body = XNEWVEC (basic_block, loop->num_nodes);
825
826   if (loop->latch == EXIT_BLOCK_PTR)
827     {
828       /* There may be blocks unreachable from EXIT_BLOCK, hence we need to
829          special-case the fake loop that contains the whole function.  */
830       gcc_assert (loop->num_nodes == (unsigned) n_basic_blocks);
831       body[tv++] = loop->header;
832       body[tv++] = EXIT_BLOCK_PTR;
833       FOR_EACH_BB (bb)
834         body[tv++] = bb;
835     }
836   else
837     tv = get_loop_body_with_size (loop, body, loop->num_nodes);
838
839   gcc_assert (tv == loop->num_nodes);
840   return body;
841 }
842
843 /* Fills dominance descendants inside LOOP of the basic block BB into
844    array TOVISIT from index *TV.  */
845
846 static void
847 fill_sons_in_loop (const struct loop *loop, basic_block bb,
848                    basic_block *tovisit, int *tv)
849 {
850   basic_block son, postpone = NULL;
851
852   tovisit[(*tv)++] = bb;
853   for (son = first_dom_son (CDI_DOMINATORS, bb);
854        son;
855        son = next_dom_son (CDI_DOMINATORS, son))
856     {
857       if (!flow_bb_inside_loop_p (loop, son))
858         continue;
859
860       if (dominated_by_p (CDI_DOMINATORS, loop->latch, son))
861         {
862           postpone = son;
863           continue;
864         }
865       fill_sons_in_loop (loop, son, tovisit, tv);
866     }
867
868   if (postpone)
869     fill_sons_in_loop (loop, postpone, tovisit, tv);
870 }
871
872 /* Gets body of a LOOP (that must be different from the outermost loop)
873    sorted by dominance relation.  Additionally, if a basic block s dominates
874    the latch, then only blocks dominated by s are be after it.  */
875
876 basic_block *
877 get_loop_body_in_dom_order (const struct loop *loop)
878 {
879   basic_block *tovisit;
880   int tv;
881
882   gcc_assert (loop->num_nodes);
883
884   tovisit = XNEWVEC (basic_block, loop->num_nodes);
885
886   gcc_assert (loop->latch != EXIT_BLOCK_PTR);
887
888   tv = 0;
889   fill_sons_in_loop (loop, loop->header, tovisit, &tv);
890
891   gcc_assert (tv == (int) loop->num_nodes);
892
893   return tovisit;
894 }
895
896 /* Gets body of a LOOP sorted via provided BB_COMPARATOR.  */
897
898 basic_block *
899 get_loop_body_in_custom_order (const struct loop *loop,
900                                int (*bb_comparator) (const void *, const void *))
901 {
902   basic_block *bbs = get_loop_body (loop);
903
904   qsort (bbs, loop->num_nodes, sizeof (basic_block), bb_comparator);
905
906   return bbs;
907 }
908
909 /* Get body of a LOOP in breadth first sort order.  */
910
911 basic_block *
912 get_loop_body_in_bfs_order (const struct loop *loop)
913 {
914   basic_block *blocks;
915   basic_block bb;
916   bitmap visited;
917   unsigned int i = 0;
918   unsigned int vc = 1;
919
920   gcc_assert (loop->num_nodes);
921   gcc_assert (loop->latch != EXIT_BLOCK_PTR);
922
923   blocks = XNEWVEC (basic_block, loop->num_nodes);
924   visited = BITMAP_ALLOC (NULL);
925
926   bb = loop->header;
927   while (i < loop->num_nodes)
928     {
929       edge e;
930       edge_iterator ei;
931
932       if (bitmap_set_bit (visited, bb->index))
933         /* This basic block is now visited */
934         blocks[i++] = bb;
935
936       FOR_EACH_EDGE (e, ei, bb->succs)
937         {
938           if (flow_bb_inside_loop_p (loop, e->dest))
939             {
940               if (bitmap_set_bit (visited, e->dest->index))
941                 blocks[i++] = e->dest;
942             }
943         }
944
945       gcc_assert (i >= vc);
946
947       bb = blocks[vc++];
948     }
949
950   BITMAP_FREE (visited);
951   return blocks;
952 }
953
954 /* Hash function for struct loop_exit.  */
955
956 static hashval_t
957 loop_exit_hash (const void *ex)
958 {
959   const struct loop_exit *const exit = (const struct loop_exit *) ex;
960
961   return htab_hash_pointer (exit->e);
962 }
963
964 /* Equality function for struct loop_exit.  Compares with edge.  */
965
966 static int
967 loop_exit_eq (const void *ex, const void *e)
968 {
969   const struct loop_exit *const exit = (const struct loop_exit *) ex;
970
971   return exit->e == e;
972 }
973
974 /* Frees the list of loop exit descriptions EX.  */
975
976 static void
977 loop_exit_free (void *ex)
978 {
979   struct loop_exit *exit = (struct loop_exit *) ex, *next;
980
981   for (; exit; exit = next)
982     {
983       next = exit->next_e;
984
985       exit->next->prev = exit->prev;
986       exit->prev->next = exit->next;
987
988       ggc_free (exit);
989     }
990 }
991
992 /* Returns the list of records for E as an exit of a loop.  */
993
994 static struct loop_exit *
995 get_exit_descriptions (edge e)
996 {
997   return (struct loop_exit *) htab_find_with_hash (current_loops->exits, e,
998                                                    htab_hash_pointer (e));
999 }
1000
1001 /* Updates the lists of loop exits in that E appears.
1002    If REMOVED is true, E is being removed, and we
1003    just remove it from the lists of exits.
1004    If NEW_EDGE is true and E is not a loop exit, we
1005    do not try to remove it from loop exit lists.  */
1006
1007 void
1008 rescan_loop_exit (edge e, bool new_edge, bool removed)
1009 {
1010   void **slot;
1011   struct loop_exit *exits = NULL, *exit;
1012   struct loop *aloop, *cloop;
1013
1014   if (!loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
1015     return;
1016
1017   if (!removed
1018       && e->src->loop_father != NULL
1019       && e->dest->loop_father != NULL
1020       && !flow_bb_inside_loop_p (e->src->loop_father, e->dest))
1021     {
1022       cloop = find_common_loop (e->src->loop_father, e->dest->loop_father);
1023       for (aloop = e->src->loop_father;
1024            aloop != cloop;
1025            aloop = loop_outer (aloop))
1026         {
1027           exit = ggc_alloc_loop_exit ();
1028           exit->e = e;
1029
1030           exit->next = aloop->exits->next;
1031           exit->prev = aloop->exits;
1032           exit->next->prev = exit;
1033           exit->prev->next = exit;
1034
1035           exit->next_e = exits;
1036           exits = exit;
1037         }
1038     }
1039
1040   if (!exits && new_edge)
1041     return;
1042
1043   slot = htab_find_slot_with_hash (current_loops->exits, e,
1044                                    htab_hash_pointer (e),
1045                                    exits ? INSERT : NO_INSERT);
1046   if (!slot)
1047     return;
1048
1049   if (exits)
1050     {
1051       if (*slot)
1052         loop_exit_free (*slot);
1053       *slot = exits;
1054     }
1055   else
1056     htab_clear_slot (current_loops->exits, slot);
1057 }
1058
1059 /* For each loop, record list of exit edges, and start maintaining these
1060    lists.  */
1061
1062 void
1063 record_loop_exits (void)
1064 {
1065   basic_block bb;
1066   edge_iterator ei;
1067   edge e;
1068
1069   if (!current_loops)
1070     return;
1071
1072   if (loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
1073     return;
1074   loops_state_set (LOOPS_HAVE_RECORDED_EXITS);
1075
1076   gcc_assert (current_loops->exits == NULL);
1077   current_loops->exits = htab_create_ggc (2 * number_of_loops (),
1078                                           loop_exit_hash, loop_exit_eq,
1079                                           loop_exit_free);
1080
1081   FOR_EACH_BB (bb)
1082     {
1083       FOR_EACH_EDGE (e, ei, bb->succs)
1084         {
1085           rescan_loop_exit (e, true, false);
1086         }
1087     }
1088 }
1089
1090 /* Dumps information about the exit in *SLOT to FILE.
1091    Callback for htab_traverse.  */
1092
1093 static int
1094 dump_recorded_exit (void **slot, void *file)
1095 {
1096   struct loop_exit *exit = (struct loop_exit *) *slot;
1097   unsigned n = 0;
1098   edge e = exit->e;
1099
1100   for (; exit != NULL; exit = exit->next_e)
1101     n++;
1102
1103   fprintf ((FILE*) file, "Edge %d->%d exits %u loops\n",
1104            e->src->index, e->dest->index, n);
1105
1106   return 1;
1107 }
1108
1109 /* Dumps the recorded exits of loops to FILE.  */
1110
1111 extern void dump_recorded_exits (FILE *);
1112 void
1113 dump_recorded_exits (FILE *file)
1114 {
1115   if (!current_loops->exits)
1116     return;
1117   htab_traverse (current_loops->exits, dump_recorded_exit, file);
1118 }
1119
1120 /* Releases lists of loop exits.  */
1121
1122 void
1123 release_recorded_exits (void)
1124 {
1125   gcc_assert (loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS));
1126   htab_delete (current_loops->exits);
1127   current_loops->exits = NULL;
1128   loops_state_clear (LOOPS_HAVE_RECORDED_EXITS);
1129 }
1130
1131 /* Returns the list of the exit edges of a LOOP.  */
1132
1133 vec<edge> 
1134 get_loop_exit_edges (const struct loop *loop)
1135 {
1136   vec<edge> edges = vNULL;
1137   edge e;
1138   unsigned i;
1139   basic_block *body;
1140   edge_iterator ei;
1141   struct loop_exit *exit;
1142
1143   gcc_assert (loop->latch != EXIT_BLOCK_PTR);
1144
1145   /* If we maintain the lists of exits, use them.  Otherwise we must
1146      scan the body of the loop.  */
1147   if (loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
1148     {
1149       for (exit = loop->exits->next; exit->e; exit = exit->next)
1150         edges.safe_push (exit->e);
1151     }
1152   else
1153     {
1154       body = get_loop_body (loop);
1155       for (i = 0; i < loop->num_nodes; i++)
1156         FOR_EACH_EDGE (e, ei, body[i]->succs)
1157           {
1158             if (!flow_bb_inside_loop_p (loop, e->dest))
1159               edges.safe_push (e);
1160           }
1161       free (body);
1162     }
1163
1164   return edges;
1165 }
1166
1167 /* Counts the number of conditional branches inside LOOP.  */
1168
1169 unsigned
1170 num_loop_branches (const struct loop *loop)
1171 {
1172   unsigned i, n;
1173   basic_block * body;
1174
1175   gcc_assert (loop->latch != EXIT_BLOCK_PTR);
1176
1177   body = get_loop_body (loop);
1178   n = 0;
1179   for (i = 0; i < loop->num_nodes; i++)
1180     if (EDGE_COUNT (body[i]->succs) >= 2)
1181       n++;
1182   free (body);
1183
1184   return n;
1185 }
1186
1187 /* Adds basic block BB to LOOP.  */
1188 void
1189 add_bb_to_loop (basic_block bb, struct loop *loop)
1190 {
1191   unsigned i;
1192   loop_p ploop;
1193   edge_iterator ei;
1194   edge e;
1195
1196   gcc_assert (bb->loop_father == NULL);
1197   bb->loop_father = loop;
1198   loop->num_nodes++;
1199   FOR_EACH_VEC_SAFE_ELT (loop->superloops, i, ploop)
1200     ploop->num_nodes++;
1201
1202   FOR_EACH_EDGE (e, ei, bb->succs)
1203     {
1204       rescan_loop_exit (e, true, false);
1205     }
1206   FOR_EACH_EDGE (e, ei, bb->preds)
1207     {
1208       rescan_loop_exit (e, true, false);
1209     }
1210 }
1211
1212 /* Remove basic block BB from loops.  */
1213 void
1214 remove_bb_from_loops (basic_block bb)
1215 {
1216   unsigned i;
1217   struct loop *loop = bb->loop_father;
1218   loop_p ploop;
1219   edge_iterator ei;
1220   edge e;
1221
1222   gcc_assert (loop != NULL);
1223   loop->num_nodes--;
1224   FOR_EACH_VEC_SAFE_ELT (loop->superloops, i, ploop)
1225     ploop->num_nodes--;
1226   bb->loop_father = NULL;
1227
1228   FOR_EACH_EDGE (e, ei, bb->succs)
1229     {
1230       rescan_loop_exit (e, false, true);
1231     }
1232   FOR_EACH_EDGE (e, ei, bb->preds)
1233     {
1234       rescan_loop_exit (e, false, true);
1235     }
1236 }
1237
1238 /* Finds nearest common ancestor in loop tree for given loops.  */
1239 struct loop *
1240 find_common_loop (struct loop *loop_s, struct loop *loop_d)
1241 {
1242   unsigned sdepth, ddepth;
1243
1244   if (!loop_s) return loop_d;
1245   if (!loop_d) return loop_s;
1246
1247   sdepth = loop_depth (loop_s);
1248   ddepth = loop_depth (loop_d);
1249
1250   if (sdepth < ddepth)
1251     loop_d = (*loop_d->superloops)[sdepth];
1252   else if (sdepth > ddepth)
1253     loop_s = (*loop_s->superloops)[ddepth];
1254
1255   while (loop_s != loop_d)
1256     {
1257       loop_s = loop_outer (loop_s);
1258       loop_d = loop_outer (loop_d);
1259     }
1260   return loop_s;
1261 }
1262
1263 /* Removes LOOP from structures and frees its data.  */
1264
1265 void
1266 delete_loop (struct loop *loop)
1267 {
1268   /* Remove the loop from structure.  */
1269   flow_loop_tree_node_remove (loop);
1270
1271   /* Remove loop from loops array.  */
1272   (*current_loops->larray)[loop->num] = NULL;
1273
1274   /* Free loop data.  */
1275   flow_loop_free (loop);
1276 }
1277
1278 /* Cancels the LOOP; it must be innermost one.  */
1279
1280 static void
1281 cancel_loop (struct loop *loop)
1282 {
1283   basic_block *bbs;
1284   unsigned i;
1285   struct loop *outer = loop_outer (loop);
1286
1287   gcc_assert (!loop->inner);
1288
1289   /* Move blocks up one level (they should be removed as soon as possible).  */
1290   bbs = get_loop_body (loop);
1291   for (i = 0; i < loop->num_nodes; i++)
1292     bbs[i]->loop_father = outer;
1293
1294   free (bbs);
1295   delete_loop (loop);
1296 }
1297
1298 /* Cancels LOOP and all its subloops.  */
1299 void
1300 cancel_loop_tree (struct loop *loop)
1301 {
1302   while (loop->inner)
1303     cancel_loop_tree (loop->inner);
1304   cancel_loop (loop);
1305 }
1306
1307 /* Checks that information about loops is correct
1308      -- sizes of loops are all right
1309      -- results of get_loop_body really belong to the loop
1310      -- loop header have just single entry edge and single latch edge
1311      -- loop latches have only single successor that is header of their loop
1312      -- irreducible loops are correctly marked
1313      -- the cached loop depth and loop father of each bb is correct
1314   */
1315 DEBUG_FUNCTION void
1316 verify_loop_structure (void)
1317 {
1318   unsigned *sizes, i, j;
1319   sbitmap irreds;
1320   basic_block bb;
1321   struct loop *loop;
1322   int err = 0;
1323   edge e;
1324   unsigned num = number_of_loops ();
1325   loop_iterator li;
1326   struct loop_exit *exit, *mexit;
1327   bool dom_available = dom_info_available_p (CDI_DOMINATORS);
1328   sbitmap visited;
1329
1330   /* We need up-to-date dominators, compute or verify them.  */
1331   if (!dom_available)
1332     calculate_dominance_info (CDI_DOMINATORS);
1333   else
1334     verify_dominators (CDI_DOMINATORS);
1335
1336   /* Check sizes.  */
1337   sizes = XCNEWVEC (unsigned, num);
1338   sizes[0] = 2;
1339
1340   FOR_EACH_BB (bb)
1341     for (loop = bb->loop_father; loop; loop = loop_outer (loop))
1342       sizes[loop->num]++;
1343
1344   FOR_EACH_LOOP (li, loop, LI_INCLUDE_ROOT)
1345     {
1346       i = loop->num;
1347
1348       if (loop->num_nodes != sizes[i])
1349         {
1350           error ("size of loop %d should be %d, not %d",
1351                    i, sizes[i], loop->num_nodes);
1352           err = 1;
1353         }
1354     }
1355
1356   /* Check the headers.  */
1357   FOR_EACH_BB (bb)
1358     if (bb_loop_header_p (bb)
1359         && bb->loop_father->header != bb)
1360       {
1361         error ("loop with header %d not in loop tree", bb->index);
1362         err = 1;
1363       }
1364
1365   /* Check get_loop_body.  */
1366   visited = sbitmap_alloc (last_basic_block);
1367   bitmap_clear (visited);
1368   FOR_EACH_LOOP (li, loop, LI_FROM_INNERMOST)
1369     {
1370       basic_block *bbs = get_loop_body (loop);
1371
1372       for (j = 0; j < loop->num_nodes; j++)
1373         {
1374           bb = bbs[j];
1375
1376           if (!flow_bb_inside_loop_p (loop, bb))
1377             {
1378               error ("bb %d does not belong to loop %d",
1379                      bb->index, loop->num);
1380               err = 1;
1381             }
1382
1383           /* Ignore this block if it is in an inner loop.  */
1384           if (bitmap_bit_p (visited, bb->index))
1385             continue;
1386           bitmap_set_bit (visited, bb->index);
1387
1388           if (bb->loop_father != loop)
1389             {
1390               error ("bb %d has father loop %d, should be loop %d",
1391                      bb->index, bb->loop_father->num, loop->num);
1392               err = 1;
1393             }
1394         }
1395
1396       free (bbs);
1397     }
1398   sbitmap_free (visited);
1399
1400   /* Check headers and latches.  */
1401   FOR_EACH_LOOP (li, loop, 0)
1402     {
1403       i = loop->num;
1404
1405       if (!bb_loop_header_p (loop->header))
1406         {
1407           error ("loop %d%'s header is not a loop header", i);
1408           err = 1;
1409         }
1410       if (loops_state_satisfies_p (LOOPS_HAVE_PREHEADERS)
1411           && EDGE_COUNT (loop->header->preds) != 2)
1412         {
1413           error ("loop %d%'s header does not have exactly 2 entries", i);
1414           err = 1;
1415         }
1416       if (loops_state_satisfies_p (LOOPS_HAVE_SIMPLE_LATCHES))
1417         {
1418           if (!single_succ_p (loop->latch))
1419             {
1420               error ("loop %d%'s latch does not have exactly 1 successor", i);
1421               err = 1;
1422             }
1423           if (single_succ (loop->latch) != loop->header)
1424             {
1425               error ("loop %d%'s latch does not have header as successor", i);
1426               err = 1;
1427             }
1428           if (loop->latch->loop_father != loop)
1429             {
1430               error ("loop %d%'s latch does not belong directly to it", i);
1431               err = 1;
1432             }
1433         }
1434       if (loop->header->loop_father != loop)
1435         {
1436           error ("loop %d%'s header does not belong directly to it", i);
1437           err = 1;
1438         }
1439       if (loops_state_satisfies_p (LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS)
1440           && (loop_latch_edge (loop)->flags & EDGE_IRREDUCIBLE_LOOP))
1441         {
1442           error ("loop %d%'s latch is marked as part of irreducible region", i);
1443           err = 1;
1444         }
1445     }
1446
1447   /* Check irreducible loops.  */
1448   if (loops_state_satisfies_p (LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS))
1449     {
1450       /* Record old info.  */
1451       irreds = sbitmap_alloc (last_basic_block);
1452       FOR_EACH_BB (bb)
1453         {
1454           edge_iterator ei;
1455           if (bb->flags & BB_IRREDUCIBLE_LOOP)
1456             bitmap_set_bit (irreds, bb->index);
1457           else
1458             bitmap_clear_bit (irreds, bb->index);
1459           FOR_EACH_EDGE (e, ei, bb->succs)
1460             if (e->flags & EDGE_IRREDUCIBLE_LOOP)
1461               e->flags |= EDGE_ALL_FLAGS + 1;
1462         }
1463
1464       /* Recount it.  */
1465       mark_irreducible_loops ();
1466
1467       /* Compare.  */
1468       FOR_EACH_BB (bb)
1469         {
1470           edge_iterator ei;
1471
1472           if ((bb->flags & BB_IRREDUCIBLE_LOOP)
1473               && !bitmap_bit_p (irreds, bb->index))
1474             {
1475               error ("basic block %d should be marked irreducible", bb->index);
1476               err = 1;
1477             }
1478           else if (!(bb->flags & BB_IRREDUCIBLE_LOOP)
1479               && bitmap_bit_p (irreds, bb->index))
1480             {
1481               error ("basic block %d should not be marked irreducible", bb->index);
1482               err = 1;
1483             }
1484           FOR_EACH_EDGE (e, ei, bb->succs)
1485             {
1486               if ((e->flags & EDGE_IRREDUCIBLE_LOOP)
1487                   && !(e->flags & (EDGE_ALL_FLAGS + 1)))
1488                 {
1489                   error ("edge from %d to %d should be marked irreducible",
1490                          e->src->index, e->dest->index);
1491                   err = 1;
1492                 }
1493               else if (!(e->flags & EDGE_IRREDUCIBLE_LOOP)
1494                        && (e->flags & (EDGE_ALL_FLAGS + 1)))
1495                 {
1496                   error ("edge from %d to %d should not be marked irreducible",
1497                          e->src->index, e->dest->index);
1498                   err = 1;
1499                 }
1500               e->flags &= ~(EDGE_ALL_FLAGS + 1);
1501             }
1502         }
1503       free (irreds);
1504     }
1505
1506   /* Check the recorded loop exits.  */
1507   FOR_EACH_LOOP (li, loop, 0)
1508     {
1509       if (!loop->exits || loop->exits->e != NULL)
1510         {
1511           error ("corrupted head of the exits list of loop %d",
1512                  loop->num);
1513           err = 1;
1514         }
1515       else
1516         {
1517           /* Check that the list forms a cycle, and all elements except
1518              for the head are nonnull.  */
1519           for (mexit = loop->exits, exit = mexit->next, i = 0;
1520                exit->e && exit != mexit;
1521                exit = exit->next)
1522             {
1523               if (i++ & 1)
1524                 mexit = mexit->next;
1525             }
1526
1527           if (exit != loop->exits)
1528             {
1529               error ("corrupted exits list of loop %d", loop->num);
1530               err = 1;
1531             }
1532         }
1533
1534       if (!loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
1535         {
1536           if (loop->exits->next != loop->exits)
1537             {
1538               error ("nonempty exits list of loop %d, but exits are not recorded",
1539                      loop->num);
1540               err = 1;
1541             }
1542         }
1543     }
1544
1545   if (loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
1546     {
1547       unsigned n_exits = 0, eloops;
1548
1549       memset (sizes, 0, sizeof (unsigned) * num);
1550       FOR_EACH_BB (bb)
1551         {
1552           edge_iterator ei;
1553           if (bb->loop_father == current_loops->tree_root)
1554             continue;
1555           FOR_EACH_EDGE (e, ei, bb->succs)
1556             {
1557               if (flow_bb_inside_loop_p (bb->loop_father, e->dest))
1558                 continue;
1559
1560               n_exits++;
1561               exit = get_exit_descriptions (e);
1562               if (!exit)
1563                 {
1564                   error ("exit %d->%d not recorded",
1565                          e->src->index, e->dest->index);
1566                   err = 1;
1567                 }
1568               eloops = 0;
1569               for (; exit; exit = exit->next_e)
1570                 eloops++;
1571
1572               for (loop = bb->loop_father;
1573                    loop != e->dest->loop_father
1574                    /* When a loop exit is also an entry edge which
1575                       can happen when avoiding CFG manipulations
1576                       then the last loop exited is the outer loop
1577                       of the loop entered.  */
1578                    && loop != loop_outer (e->dest->loop_father);
1579                    loop = loop_outer (loop))
1580                 {
1581                   eloops--;
1582                   sizes[loop->num]++;
1583                 }
1584
1585               if (eloops != 0)
1586                 {
1587                   error ("wrong list of exited loops for edge  %d->%d",
1588                          e->src->index, e->dest->index);
1589                   err = 1;
1590                 }
1591             }
1592         }
1593
1594       if (n_exits != htab_elements (current_loops->exits))
1595         {
1596           error ("too many loop exits recorded");
1597           err = 1;
1598         }
1599
1600       FOR_EACH_LOOP (li, loop, 0)
1601         {
1602           eloops = 0;
1603           for (exit = loop->exits->next; exit->e; exit = exit->next)
1604             eloops++;
1605           if (eloops != sizes[loop->num])
1606             {
1607               error ("%d exits recorded for loop %d (having %d exits)",
1608                      eloops, loop->num, sizes[loop->num]);
1609               err = 1;
1610             }
1611         }
1612     }
1613
1614   gcc_assert (!err);
1615
1616   free (sizes);
1617   if (!dom_available)
1618     free_dominance_info (CDI_DOMINATORS);
1619 }
1620
1621 /* Returns latch edge of LOOP.  */
1622 edge
1623 loop_latch_edge (const struct loop *loop)
1624 {
1625   return find_edge (loop->latch, loop->header);
1626 }
1627
1628 /* Returns preheader edge of LOOP.  */
1629 edge
1630 loop_preheader_edge (const struct loop *loop)
1631 {
1632   edge e;
1633   edge_iterator ei;
1634
1635   gcc_assert (loops_state_satisfies_p (LOOPS_HAVE_PREHEADERS));
1636
1637   FOR_EACH_EDGE (e, ei, loop->header->preds)
1638     if (e->src != loop->latch)
1639       break;
1640
1641   return e;
1642 }
1643
1644 /* Returns true if E is an exit of LOOP.  */
1645
1646 bool
1647 loop_exit_edge_p (const struct loop *loop, const_edge e)
1648 {
1649   return (flow_bb_inside_loop_p (loop, e->src)
1650           && !flow_bb_inside_loop_p (loop, e->dest));
1651 }
1652
1653 /* Returns the single exit edge of LOOP, or NULL if LOOP has either no exit
1654    or more than one exit.  If loops do not have the exits recorded, NULL
1655    is returned always.  */
1656
1657 edge
1658 single_exit (const struct loop *loop)
1659 {
1660   struct loop_exit *exit = loop->exits->next;
1661
1662   if (!loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
1663     return NULL;
1664
1665   if (exit->e && exit->next == loop->exits)
1666     return exit->e;
1667   else
1668     return NULL;
1669 }
1670
1671 /* Returns true when BB has an incoming edge exiting LOOP.  */
1672
1673 bool
1674 loop_exits_to_bb_p (struct loop *loop, basic_block bb)
1675 {
1676   edge e;
1677   edge_iterator ei;
1678
1679   FOR_EACH_EDGE (e, ei, bb->preds)
1680     if (loop_exit_edge_p (loop, e))
1681       return true;
1682
1683   return false;
1684 }
1685
1686 /* Returns true when BB has an outgoing edge exiting LOOP.  */
1687
1688 bool
1689 loop_exits_from_bb_p (struct loop *loop, basic_block bb)
1690 {
1691   edge e;
1692   edge_iterator ei;
1693
1694   FOR_EACH_EDGE (e, ei, bb->succs)
1695     if (loop_exit_edge_p (loop, e))
1696       return true;
1697
1698   return false;
1699 }
1700
1701 /* Return location corresponding to the loop control condition if possible.  */
1702
1703 location_t
1704 get_loop_location (struct loop *loop)
1705 {
1706   rtx insn = NULL;
1707   struct niter_desc *desc = NULL;
1708   edge exit;
1709
1710   /* For a for or while loop, we would like to return the location
1711      of the for or while statement, if possible.  To do this, look
1712      for the branch guarding the loop back-edge.  */
1713
1714   /* If this is a simple loop with an in_edge, then the loop control
1715      branch is typically at the end of its source.  */
1716   desc = get_simple_loop_desc (loop);
1717   if (desc->in_edge)
1718     {
1719       FOR_BB_INSNS_REVERSE (desc->in_edge->src, insn)
1720         {
1721           if (INSN_P (insn) && INSN_HAS_LOCATION (insn))
1722             return INSN_LOCATION (insn);
1723         }
1724     }
1725   /* If loop has a single exit, then the loop control branch
1726      must be at the end of its source.  */
1727   if ((exit = single_exit (loop)))
1728     {
1729       FOR_BB_INSNS_REVERSE (exit->src, insn)
1730         {
1731           if (INSN_P (insn) && INSN_HAS_LOCATION (insn))
1732             return INSN_LOCATION (insn);
1733         }
1734     }
1735   /* Next check the latch, to see if it is non-empty.  */
1736   FOR_BB_INSNS_REVERSE (loop->latch, insn)
1737     {
1738       if (INSN_P (insn) && INSN_HAS_LOCATION (insn))
1739         return INSN_LOCATION (insn);
1740     }
1741   /* Finally, if none of the above identifies the loop control branch,
1742      return the first location in the loop header.  */
1743   FOR_BB_INSNS (loop->header, insn)
1744     {
1745       if (INSN_P (insn) && INSN_HAS_LOCATION (insn))
1746         return INSN_LOCATION (insn);
1747     }
1748   /* If all else fails, simply return the current function location.  */
1749   return DECL_SOURCE_LOCATION (current_function_decl);
1750 }
1751