OSDN Git Service

* rs6000.md (abssi2_nopower): Convert to define_insn_and_split.
[pf3gnuchains/gcc-fork.git] / gcc / cfgloop.c
1 /* Natural loop discovery code for GNU compiler.
2    Copyright (C) 2000, 2001 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 2, 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 COPYING.  If not, write to the Free
18 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
19 02111-1307, USA.  */
20
21 #include "config.h"
22 #include "system.h"
23 #include "rtl.h"
24 #include "hard-reg-set.h"
25 #include "basic-block.h"
26
27 static void flow_loops_cfg_dump         PARAMS ((const struct loops *,
28                                                  FILE *));
29 static int flow_loop_nested_p           PARAMS ((struct loop *,
30                                                  struct loop *));
31 static int flow_loop_entry_edges_find   PARAMS ((basic_block, const sbitmap,
32                                                  edge **));
33 static int flow_loop_exit_edges_find    PARAMS ((const sbitmap, edge **));
34 static int flow_loop_nodes_find         PARAMS ((basic_block, basic_block,
35                                                  sbitmap));
36 static void flow_loop_pre_header_scan   PARAMS ((struct loop *));
37 static basic_block flow_loop_pre_header_find PARAMS ((basic_block,
38                                                       const sbitmap *));
39 static void flow_loop_tree_node_add     PARAMS ((struct loop *,
40                                                  struct loop *));
41 static void flow_loops_tree_build       PARAMS ((struct loops *));
42 static int flow_loop_level_compute      PARAMS ((struct loop *, int));
43 static int flow_loops_level_compute     PARAMS ((struct loops *));
44 \f
45 /* Dump loop related CFG information.  */
46
47 static void
48 flow_loops_cfg_dump (loops, file)
49      const struct loops *loops;
50      FILE *file;
51 {
52   int i;
53
54   if (! loops->num || ! file || ! loops->cfg.dom)
55     return;
56
57   for (i = 0; i < n_basic_blocks; i++)
58     {
59       edge succ;
60
61       fprintf (file, ";; %d succs { ", i);
62       for (succ = BASIC_BLOCK (i)->succ; succ; succ = succ->succ_next)
63         fprintf (file, "%d ", succ->dest->index);
64       flow_nodes_print ("} dom", loops->cfg.dom[i], file);
65     }
66
67   /* Dump the DFS node order.  */
68   if (loops->cfg.dfs_order)
69     {
70       fputs (";; DFS order: ", file);
71       for (i = 0; i < n_basic_blocks; i++)
72         fprintf (file, "%d ", loops->cfg.dfs_order[i]);
73
74       fputs ("\n", file);
75     }
76
77   /* Dump the reverse completion node order.  */
78   if (loops->cfg.rc_order)
79     {
80       fputs (";; RC order: ", file);
81       for (i = 0; i < n_basic_blocks; i++)
82         fprintf (file, "%d ", loops->cfg.rc_order[i]);
83
84       fputs ("\n", file);
85     }
86 }
87
88 /* Return non-zero if the nodes of LOOP are a subset of OUTER.  */
89
90 static int
91 flow_loop_nested_p (outer, loop)
92      struct loop *outer;
93      struct loop *loop;
94 {
95   return sbitmap_a_subset_b_p (loop->nodes, outer->nodes);
96 }
97
98 /* Dump the loop information specified by LOOP to the stream FILE
99    using auxiliary dump callback function LOOP_DUMP_AUX if non null.  */
100
101 void
102 flow_loop_dump (loop, file, loop_dump_aux, verbose)
103      const struct loop *loop;
104      FILE *file;
105      void (*loop_dump_aux) PARAMS((const struct loop *, FILE *, int));
106      int verbose;
107 {
108   if (! loop || ! loop->header)
109     return;
110
111   if (loop->first->head && loop->last->end)
112     fprintf (file, ";;\n;; Loop %d (%d to %d):%s%s\n",
113             loop->num, INSN_UID (loop->first->head),
114             INSN_UID (loop->last->end),
115             loop->shared ? " shared" : "", loop->invalid ? " invalid" : "");
116   else
117     fprintf (file, ";;\n;; Loop %d:%s%s\n", loop->num,
118              loop->shared ? " shared" : "", loop->invalid ? " invalid" : "");
119
120   fprintf (file, ";;  header %d, latch %d, pre-header %d, first %d, last %d\n",
121            loop->header->index, loop->latch->index,
122            loop->pre_header ? loop->pre_header->index : -1,
123            loop->first->index, loop->last->index);
124   fprintf (file, ";;  depth %d, level %d, outer %ld\n",
125            loop->depth, loop->level,
126            (long) (loop->outer ? loop->outer->num : -1));
127
128   if (loop->pre_header_edges)
129     flow_edge_list_print (";;  pre-header edges", loop->pre_header_edges,
130                           loop->num_pre_header_edges, file);
131
132   flow_edge_list_print (";;  entry edges", loop->entry_edges,
133                         loop->num_entries, file);
134   fprintf (file, ";;  %d", loop->num_nodes);
135   flow_nodes_print (" nodes", loop->nodes, file);
136   flow_edge_list_print (";;  exit edges", loop->exit_edges,
137                         loop->num_exits, file);
138
139   if (loop->exits_doms)
140     flow_nodes_print (";;  exit doms", loop->exits_doms, file);
141
142   if (loop_dump_aux)
143     loop_dump_aux (loop, file, verbose);
144 }
145
146 /* Dump the loop information specified by LOOPS to the stream FILE,
147    using auxiliary dump callback function LOOP_DUMP_AUX if non null.  */
148
149 void
150 flow_loops_dump (loops, file, loop_dump_aux, verbose)
151      const struct loops *loops;
152      FILE *file;
153      void (*loop_dump_aux) PARAMS((const struct loop *, FILE *, int));
154      int verbose;
155 {
156   int i, j;
157   int num_loops;
158
159   num_loops = loops->num;
160   if (! num_loops || ! file)
161     return;
162
163   fprintf (file, ";; %d loops found, %d levels\n", num_loops, loops->levels);
164   for (i = 0; i < num_loops; i++)
165     {
166       struct loop *loop = &loops->array[i];
167
168       flow_loop_dump (loop, file, loop_dump_aux, verbose);
169       if (loop->shared)
170         for (j = 0; j < i; j++)
171           {
172             struct loop *oloop = &loops->array[j];
173
174             if (loop->header == oloop->header)
175               {
176                 int disjoint;
177                 int smaller;
178
179                 smaller = loop->num_nodes < oloop->num_nodes;
180
181                 /* If the union of LOOP and OLOOP is different than
182                    the larger of LOOP and OLOOP then LOOP and OLOOP
183                    must be disjoint.  */
184                 disjoint = ! flow_loop_nested_p (smaller ? loop : oloop,
185                                                  smaller ? oloop : loop);
186                 fprintf (file,
187                          ";; loop header %d shared by loops %d, %d %s\n",
188                          loop->header->index, i, j,
189                          disjoint ? "disjoint" : "nested");
190               }
191           }
192     }
193
194   if (verbose)
195     flow_loops_cfg_dump (loops, file);
196 }
197
198 /* Free all the memory allocated for LOOPS.  */
199
200 void
201 flow_loops_free (loops)
202      struct loops *loops;
203 {
204   if (loops->array)
205     {
206       int i;
207
208       if (! loops->num)
209         abort ();
210
211       /* Free the loop descriptors.  */
212       for (i = 0; i < loops->num; i++)
213         {
214           struct loop *loop = &loops->array[i];
215
216           if (loop->pre_header_edges)
217             free (loop->pre_header_edges);
218           if (loop->nodes)
219             sbitmap_free (loop->nodes);
220           if (loop->entry_edges)
221             free (loop->entry_edges);
222           if (loop->exit_edges)
223             free (loop->exit_edges);
224           if (loop->exits_doms)
225             sbitmap_free (loop->exits_doms);
226         }
227
228       free (loops->array);
229       loops->array = NULL;
230
231       if (loops->cfg.dom)
232         sbitmap_vector_free (loops->cfg.dom);
233
234       if (loops->cfg.dfs_order)
235         free (loops->cfg.dfs_order);
236
237       if (loops->shared_headers)
238         sbitmap_free (loops->shared_headers);
239     }
240 }
241
242 /* Find the entry edges into the loop with header HEADER and nodes
243    NODES and store in ENTRY_EDGES array.  Return the number of entry
244    edges from the loop.  */
245
246 static int
247 flow_loop_entry_edges_find (header, nodes, entry_edges)
248      basic_block header;
249      const sbitmap nodes;
250      edge **entry_edges;
251 {
252   edge e;
253   int num_entries;
254
255   *entry_edges = NULL;
256
257   num_entries = 0;
258   for (e = header->pred; e; e = e->pred_next)
259     {
260       basic_block src = e->src;
261
262       if (src == ENTRY_BLOCK_PTR || ! TEST_BIT (nodes, src->index))
263         num_entries++;
264     }
265
266   if (! num_entries)
267     abort ();
268
269   *entry_edges = (edge *) xmalloc (num_entries * sizeof (edge));
270
271   num_entries = 0;
272   for (e = header->pred; e; e = e->pred_next)
273     {
274       basic_block src = e->src;
275
276       if (src == ENTRY_BLOCK_PTR || ! TEST_BIT (nodes, src->index))
277         (*entry_edges)[num_entries++] = e;
278     }
279
280   return num_entries;
281 }
282
283 /* Find the exit edges from the loop using the bitmap of loop nodes
284    NODES and store in EXIT_EDGES array.  Return the number of
285    exit edges from the loop.  */
286
287 static int
288 flow_loop_exit_edges_find (nodes, exit_edges)
289      const sbitmap nodes;
290      edge **exit_edges;
291 {
292   edge e;
293   int node;
294   int num_exits;
295
296   *exit_edges = NULL;
297
298   /* Check all nodes within the loop to see if there are any
299      successors not in the loop.  Note that a node may have multiple
300      exiting edges ?????  A node can have one jumping edge and one fallthru
301      edge so only one of these can exit the loop.  */
302   num_exits = 0;
303   EXECUTE_IF_SET_IN_SBITMAP (nodes, 0, node, {
304     for (e = BASIC_BLOCK (node)->succ; e; e = e->succ_next)
305       {
306         basic_block dest = e->dest;
307
308         if (dest == EXIT_BLOCK_PTR || ! TEST_BIT (nodes, dest->index))
309             num_exits++;
310       }
311   });
312
313   if (! num_exits)
314     return 0;
315
316   *exit_edges = (edge *) xmalloc (num_exits * sizeof (edge));
317
318   /* Store all exiting edges into an array.  */
319   num_exits = 0;
320   EXECUTE_IF_SET_IN_SBITMAP (nodes, 0, node, {
321     for (e = BASIC_BLOCK (node)->succ; e; e = e->succ_next)
322       {
323         basic_block dest = e->dest;
324
325         if (dest == EXIT_BLOCK_PTR || ! TEST_BIT (nodes, dest->index))
326           (*exit_edges)[num_exits++] = e;
327       }
328   });
329
330   return num_exits;
331 }
332
333 /* Find the nodes contained within the loop with header HEADER and
334    latch LATCH and store in NODES.  Return the number of nodes within
335    the loop.  */
336
337 static int
338 flow_loop_nodes_find (header, latch, nodes)
339      basic_block header;
340      basic_block latch;
341      sbitmap nodes;
342 {
343   basic_block *stack;
344   int sp;
345   int num_nodes = 0;
346
347   stack = (basic_block *) xmalloc (n_basic_blocks * sizeof (basic_block));
348   sp = 0;
349
350   /* Start with only the loop header in the set of loop nodes.  */
351   sbitmap_zero (nodes);
352   SET_BIT (nodes, header->index);
353   num_nodes++;
354   header->loop_depth++;
355
356   /* Push the loop latch on to the stack.  */
357   if (! TEST_BIT (nodes, latch->index))
358     {
359       SET_BIT (nodes, latch->index);
360       latch->loop_depth++;
361       num_nodes++;
362       stack[sp++] = latch;
363     }
364
365   while (sp)
366     {
367       basic_block node;
368       edge e;
369
370       node = stack[--sp];
371       for (e = node->pred; e; e = e->pred_next)
372         {
373           basic_block ancestor = e->src;
374
375           /* If each ancestor not marked as part of loop, add to set of
376              loop nodes and push on to stack.  */
377           if (ancestor != ENTRY_BLOCK_PTR
378               && ! TEST_BIT (nodes, ancestor->index))
379             {
380               SET_BIT (nodes, ancestor->index);
381               ancestor->loop_depth++;
382               num_nodes++;
383               stack[sp++] = ancestor;
384             }
385         }
386     }
387   free (stack);
388   return num_nodes;
389 }
390
391 /* Find the root node of the loop pre-header extended basic block and
392    the edges along the trace from the root node to the loop header.  */
393
394 static void
395 flow_loop_pre_header_scan (loop)
396      struct loop *loop;
397 {
398   int num;
399   basic_block ebb;
400   edge e;
401
402   loop->num_pre_header_edges = 0;
403   if (loop->num_entries != 1)
404     return;
405
406   ebb = loop->entry_edges[0]->src;
407   if (ebb == ENTRY_BLOCK_PTR)
408     return;
409
410   /* Count number of edges along trace from loop header to
411      root of pre-header extended basic block.  Usually this is
412      only one or two edges.  */
413   for (num = 1; ebb->pred->src != ENTRY_BLOCK_PTR && ! ebb->pred->pred_next;
414        num++)
415     ebb = ebb->pred->src;
416
417   loop->pre_header_edges = (edge *) xmalloc (num * sizeof (edge));
418   loop->num_pre_header_edges = num;
419
420   /* Store edges in order that they are followed.  The source of the first edge
421      is the root node of the pre-header extended basic block and the
422      destination of the last last edge is the loop header.  */
423   for (e = loop->entry_edges[0]; num; e = e->src->pred)
424     loop->pre_header_edges[--num] = e;
425 }
426
427 /* Return the block for the pre-header of the loop with header
428    HEADER where DOM specifies the dominator information.  Return NULL if
429    there is no pre-header.  */
430
431 static basic_block
432 flow_loop_pre_header_find (header, dom)
433      basic_block header;
434      const sbitmap *dom;
435 {
436   basic_block pre_header;
437   edge e;
438
439   /* If block p is a predecessor of the header and is the only block
440      that the header does not dominate, then it is the pre-header.  */
441   pre_header = NULL;
442   for (e = header->pred; e; e = e->pred_next)
443     {
444       basic_block node = e->src;
445
446       if (node != ENTRY_BLOCK_PTR
447           && ! TEST_BIT (dom[node->index], header->index))
448         {
449           if (pre_header == NULL)
450             pre_header = node;
451           else
452             {
453               /* There are multiple edges into the header from outside
454                  the loop so there is no pre-header block.  */
455               pre_header = NULL;
456               break;
457             }
458         }
459     }
460
461   return pre_header;
462 }
463
464 /* Add LOOP to the loop hierarchy tree where PREVLOOP was the loop
465    previously added.  The insertion algorithm assumes that the loops
466    are added in the order found by a depth first search of the CFG.  */
467
468 static void
469 flow_loop_tree_node_add (prevloop, loop)
470      struct loop *prevloop;
471      struct loop *loop;
472 {
473
474   if (flow_loop_nested_p (prevloop, loop))
475     {
476       prevloop->inner = loop;
477       loop->outer = prevloop;
478       return;
479     }
480
481   for (; prevloop->outer; prevloop = prevloop->outer)
482     if (flow_loop_nested_p (prevloop->outer, loop))
483       {
484         prevloop->next = loop;
485         loop->outer = prevloop->outer;
486         return;
487       }
488
489   prevloop->next = loop;
490   loop->outer = NULL;
491 }
492
493 /* Build the loop hierarchy tree for LOOPS.  */
494
495 static void
496 flow_loops_tree_build (loops)
497      struct loops *loops;
498 {
499   int i;
500   int num_loops;
501
502   num_loops = loops->num;
503   if (! num_loops)
504     return;
505
506   /* Root the loop hierarchy tree with the first loop found.
507      Since we used a depth first search this should be the
508      outermost loop.  */
509   loops->tree_root = &loops->array[0];
510   loops->tree_root->outer = loops->tree_root->inner
511     = loops->tree_root->next = NULL;
512
513   /* Add the remaining loops to the tree.  */
514   for (i = 1; i < num_loops; i++)
515     flow_loop_tree_node_add (&loops->array[i - 1], &loops->array[i]);
516 }
517
518 /* Helper function to compute loop nesting depth and enclosed loop level
519    for the natural loop specified by LOOP at the loop depth DEPTH.
520    Returns the loop level.  */
521
522 static int
523 flow_loop_level_compute (loop, depth)
524      struct loop *loop;
525      int depth;
526 {
527   struct loop *inner;
528   int level = 1;
529
530   if (! loop)
531     return 0;
532
533   /* Traverse loop tree assigning depth and computing level as the
534      maximum level of all the inner loops of this loop.  The loop
535      level is equivalent to the height of the loop in the loop tree
536      and corresponds to the number of enclosed loop levels (including
537      itself).  */
538   for (inner = loop->inner; inner; inner = inner->next)
539     {
540       int ilevel = flow_loop_level_compute (inner, depth + 1) + 1;
541
542       level = MAX (ilevel, level);
543     }
544
545   loop->level = level;
546   loop->depth = depth;
547   return level;
548 }
549
550 /* Compute the loop nesting depth and enclosed loop level for the loop
551    hierarchy tree specified by LOOPS.  Return the maximum enclosed loop
552    level.  */
553
554 static int
555 flow_loops_level_compute (loops)
556      struct loops *loops;
557 {
558   int levels = 0;
559   struct loop *loop;
560   int level;
561
562   /* Traverse all the outer level loops.  */
563   for (loop = loops->tree_root; loop; loop = loop->next)
564     {
565       level = flow_loop_level_compute (loop, 1);
566       levels = MAX (levels, level);
567     }
568
569   return levels;
570 }
571
572 /* Scan a single natural loop specified by LOOP collecting information
573    about it specified by FLAGS.  */
574
575 int
576 flow_loop_scan (loops, loop, flags)
577      struct loops *loops;
578      struct loop *loop;
579      int flags;
580 {
581   /* Determine prerequisites.  */
582   if ((flags & LOOP_EXITS_DOMS) && ! loop->exit_edges)
583     flags |= LOOP_EXIT_EDGES;
584
585   if (flags & LOOP_ENTRY_EDGES)
586     /* Find edges which enter the loop header.  Note that the entry edges
587        should only enter the header of a natural loop.  */
588     loop->num_entries = flow_loop_entry_edges_find (loop->header, loop->nodes,
589                                                     &loop->entry_edges);
590
591   if (flags & LOOP_EXIT_EDGES)
592     /* Find edges which exit the loop.  */
593     loop->num_exits
594       = flow_loop_exit_edges_find (loop->nodes, &loop->exit_edges);
595
596   if (flags & LOOP_EXITS_DOMS)
597     {
598       int j;
599
600       /* Determine which loop nodes dominate all the exits
601          of the loop.  */
602       loop->exits_doms = sbitmap_alloc (n_basic_blocks);
603       sbitmap_copy (loop->exits_doms, loop->nodes);
604       for (j = 0; j < loop->num_exits; j++)
605         sbitmap_a_and_b (loop->exits_doms, loop->exits_doms,
606                          loops->cfg.dom[loop->exit_edges[j]->src->index]);
607
608       /* The header of a natural loop must dominate
609          all exits.  */
610       if (! TEST_BIT (loop->exits_doms, loop->header->index))
611         abort ();
612     }
613
614   if (flags & LOOP_PRE_HEADER)
615     {
616       /* Look to see if the loop has a pre-header node.  */
617       loop->pre_header
618         = flow_loop_pre_header_find (loop->header, loops->cfg.dom);
619
620       /* Find the blocks within the extended basic block of
621          the loop pre-header.  */
622       flow_loop_pre_header_scan (loop);
623     }
624
625   return 1;
626 }
627
628 /* Find all the natural loops in the function and save in LOOPS structure and
629    recalculate loop_depth information in basic block structures.  FLAGS
630    controls which loop information is collected.  Return the number of natural
631    loops found.  */
632
633 int
634 flow_loops_find (loops, flags)
635      struct loops *loops;
636      int flags;
637 {
638   int i;
639   int b;
640   int num_loops;
641   edge e;
642   sbitmap headers;
643   sbitmap *dom;
644   int *dfs_order;
645   int *rc_order;
646
647   /* This function cannot be repeatedly called with different
648      flags to build up the loop information.  The loop tree
649      must always be built if this function is called.  */
650   if (! (flags & LOOP_TREE))
651     abort ();
652
653   memset (loops, 0, sizeof *loops);
654
655   /* Taking care of this degenerate case makes the rest of
656      this code simpler.  */
657   if (n_basic_blocks == 0)
658     return 0;
659
660   dfs_order = NULL;
661   rc_order = NULL;
662
663   /* Compute the dominators.  */
664   dom = sbitmap_vector_alloc (n_basic_blocks, n_basic_blocks);
665   calculate_dominance_info (NULL, dom, CDI_DOMINATORS);
666
667   /* Count the number of loop edges (back edges).  This should be the
668      same as the number of natural loops.  */
669   num_loops = 0;
670   for (b = 0; b < n_basic_blocks; b++)
671     {
672       basic_block header;
673
674       header = BASIC_BLOCK (b);
675       header->loop_depth = 0;
676
677       for (e = header->pred; e; e = e->pred_next)
678         {
679           basic_block latch = e->src;
680
681           /* Look for back edges where a predecessor is dominated
682              by this block.  A natural loop has a single entry
683              node (header) that dominates all the nodes in the
684              loop.  It also has single back edge to the header
685              from a latch node.  Note that multiple natural loops
686              may share the same header.  */
687           if (b != header->index)
688             abort ();
689
690           if (latch != ENTRY_BLOCK_PTR && TEST_BIT (dom[latch->index], b))
691             num_loops++;
692         }
693     }
694
695   if (num_loops)
696     {
697       /* Compute depth first search order of the CFG so that outer
698          natural loops will be found before inner natural loops.  */
699       dfs_order = (int *) xmalloc (n_basic_blocks * sizeof (int));
700       rc_order = (int *) xmalloc (n_basic_blocks * sizeof (int));
701       flow_depth_first_order_compute (dfs_order, rc_order);
702
703       /* Save CFG derived information to avoid recomputing it.  */
704       loops->cfg.dom = dom;
705       loops->cfg.dfs_order = dfs_order;
706       loops->cfg.rc_order = rc_order;
707
708       /* Allocate loop structures.  */
709       loops->array
710         = (struct loop *) xcalloc (num_loops, sizeof (struct loop));
711
712       headers = sbitmap_alloc (n_basic_blocks);
713       sbitmap_zero (headers);
714
715       loops->shared_headers = sbitmap_alloc (n_basic_blocks);
716       sbitmap_zero (loops->shared_headers);
717
718       /* Find and record information about all the natural loops
719          in the CFG.  */
720       num_loops = 0;
721       for (b = n_basic_blocks - 1; b >= 0; b--)
722         {
723           basic_block latch;
724
725           /* Search the nodes of the CFG in reverse completion order
726              so that we can find outer loops first.  */
727           latch = BASIC_BLOCK (rc_order[b]);
728
729           /* Look for all the possible headers for this latch block.  */
730           for (e = latch->succ; e; e = e->succ_next)
731             {
732               basic_block header = e->dest;
733
734               /* Look for forward edges where this block is dominated by
735                  a successor of this block.  A natural loop has a single
736                  entry node (header) that dominates all the nodes in the
737                  loop.  It also has single back edge to the header from a
738                  latch node.  Note that multiple natural loops may share
739                  the same header.  */
740               if (header != EXIT_BLOCK_PTR
741                   && TEST_BIT (dom[latch->index], header->index))
742                 {
743                   struct loop *loop;
744
745                   loop = loops->array + num_loops;
746
747                   loop->header = header;
748                   loop->latch = latch;
749                   loop->num = num_loops;
750
751                   num_loops++;
752                 }
753             }
754         }
755
756       for (i = 0; i < num_loops; i++)
757         {
758           struct loop *loop = &loops->array[i];
759
760           /* Keep track of blocks that are loop headers so
761              that we can tell which loops should be merged.  */
762           if (TEST_BIT (headers, loop->header->index))
763             SET_BIT (loops->shared_headers, loop->header->index);
764           SET_BIT (headers, loop->header->index);
765
766           /* Find nodes contained within the loop.  */
767           loop->nodes = sbitmap_alloc (n_basic_blocks);
768           loop->num_nodes
769             = flow_loop_nodes_find (loop->header, loop->latch, loop->nodes);
770
771           /* Compute first and last blocks within the loop.
772              These are often the same as the loop header and
773              loop latch respectively, but this is not always
774              the case.  */
775           loop->first
776             = BASIC_BLOCK (sbitmap_first_set_bit (loop->nodes));
777           loop->last
778             = BASIC_BLOCK (sbitmap_last_set_bit (loop->nodes));
779
780           flow_loop_scan (loops, loop, flags);
781         }
782
783       /* Natural loops with shared headers may either be disjoint or
784          nested.  Disjoint loops with shared headers cannot be inner
785          loops and should be merged.  For now just mark loops that share
786          headers.  */
787       for (i = 0; i < num_loops; i++)
788         if (TEST_BIT (loops->shared_headers, loops->array[i].header->index))
789           loops->array[i].shared = 1;
790
791       sbitmap_free (headers);
792     }
793   else
794     sbitmap_vector_free (dom);
795
796   loops->num = num_loops;
797
798   /* Build the loop hierarchy tree.  */
799   flow_loops_tree_build (loops);
800
801   /* Assign the loop nesting depth and enclosed loop level for each
802      loop.  */
803   loops->levels = flow_loops_level_compute (loops);
804
805   return num_loops;
806 }
807
808 /* Update the information regarding the loops in the CFG
809    specified by LOOPS.  */
810
811 int
812 flow_loops_update (loops, flags)
813      struct loops *loops;
814      int flags;
815 {
816   /* One day we may want to update the current loop data.  For now
817      throw away the old stuff and rebuild what we need.  */
818   if (loops->array)
819     flow_loops_free (loops);
820
821   return flow_loops_find (loops, flags);
822 }
823
824 /* Return non-zero if edge E enters header of LOOP from outside of LOOP.  */
825
826 int
827 flow_loop_outside_edge_p (loop, e)
828      const struct loop *loop;
829      edge e;
830 {
831   if (e->dest != loop->header)
832     abort ();
833
834   return (e->src == ENTRY_BLOCK_PTR)
835     || ! TEST_BIT (loop->nodes, e->src->index);
836 }