OSDN Git Service

* combine.c (if_then_else_cond): Tighten mode check.
[pf3gnuchains/gcc-fork.git] / gcc / cfgloop.c
1 /* Natural loop discovery code for GNU compiler.
2    Copyright (C) 2000, 2001, 2003 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 "coretypes.h"
24 #include "tm.h"
25 #include "rtl.h"
26 #include "hard-reg-set.h"
27 #include "basic-block.h"
28 #include "toplev.h"
29 #include "cfgloop.h"
30 #include "flags.h"
31
32 /* Ratio of frequencies of edges so that one of more latch edges is
33    considered to belong to inner loop with same header.  */
34 #define HEAVY_EDGE_RATIO 8
35
36 static void flow_loops_cfg_dump (const struct loops *, FILE *);
37 static void flow_loop_entry_edges_find (struct loop *);
38 static void flow_loop_exit_edges_find (struct loop *);
39 static int flow_loop_nodes_find (basic_block, struct loop *);
40 static void flow_loop_pre_header_scan (struct loop *);
41 static basic_block flow_loop_pre_header_find (basic_block, dominance_info);
42 static int flow_loop_level_compute (struct loop *);
43 static int flow_loops_level_compute (struct loops *);
44 static void establish_preds (struct loop *);
45 static basic_block make_forwarder_block (basic_block, int, int, edge, int);
46 static void canonicalize_loop_headers (void);
47 static bool glb_enum_p (basic_block, void *);
48 static void redirect_edge_with_latch_update (edge, basic_block);
49 \f
50 /* Dump loop related CFG information.  */
51
52 static void
53 flow_loops_cfg_dump (const struct loops *loops, FILE *file)
54 {
55   int i;
56   basic_block bb;
57
58   if (! loops->num || ! file || ! loops->cfg.dom)
59     return;
60
61   FOR_EACH_BB (bb)
62     {
63       edge succ;
64
65       fprintf (file, ";; %d succs { ", bb->index);
66       for (succ = bb->succ; succ; succ = succ->succ_next)
67         fprintf (file, "%d ", succ->dest->index);
68       fprintf (file, "}\n");
69     }
70
71   /* Dump the DFS node order.  */
72   if (loops->cfg.dfs_order)
73     {
74       fputs (";; DFS order: ", file);
75       for (i = 0; i < n_basic_blocks; i++)
76         fprintf (file, "%d ", loops->cfg.dfs_order[i]);
77
78       fputs ("\n", file);
79     }
80
81   /* Dump the reverse completion node order.  */
82   if (loops->cfg.rc_order)
83     {
84       fputs (";; RC order: ", file);
85       for (i = 0; i < n_basic_blocks; i++)
86         fprintf (file, "%d ", loops->cfg.rc_order[i]);
87
88       fputs ("\n", file);
89     }
90 }
91
92 /* Return nonzero if the nodes of LOOP are a subset of OUTER.  */
93
94 bool
95 flow_loop_nested_p (const struct loop *outer, const struct loop *loop)
96 {
97   return loop->depth > outer->depth
98          && loop->pred[outer->depth] == outer;
99 }
100
101 /* Dump the loop information specified by LOOP to the stream FILE
102    using auxiliary dump callback function LOOP_DUMP_AUX if non null.  */
103
104 void
105 flow_loop_dump (const struct loop *loop, FILE *file,
106                 void (*loop_dump_aux) (const struct loop *, FILE *, int),
107                 int verbose)
108 {
109   basic_block *bbs;
110   unsigned i;
111
112   if (! loop || ! loop->header)
113     return;
114
115   fprintf (file, ";;\n;; Loop %d:%s\n", loop->num,
116              loop->invalid ? " invalid" : "");
117
118   fprintf (file, ";;  header %d, latch %d, pre-header %d\n",
119            loop->header->index, loop->latch->index,
120            loop->pre_header ? loop->pre_header->index : -1);
121   fprintf (file, ";;  depth %d, level %d, outer %ld\n",
122            loop->depth, loop->level,
123            (long) (loop->outer ? loop->outer->num : -1));
124
125   if (loop->pre_header_edges)
126     flow_edge_list_print (";;  pre-header edges", loop->pre_header_edges,
127                           loop->num_pre_header_edges, file);
128
129   flow_edge_list_print (";;  entry edges", loop->entry_edges,
130                         loop->num_entries, file);
131   fprintf (file, ";;  nodes:");
132   bbs = get_loop_body (loop);
133   for (i = 0; i < loop->num_nodes; i++)
134     fprintf (file, " %d", bbs[i]->index);
135   free (bbs);
136   fprintf (file, "\n");
137   flow_edge_list_print (";;  exit edges", loop->exit_edges,
138                         loop->num_exits, file);
139
140   if (loop_dump_aux)
141     loop_dump_aux (loop, file, verbose);
142 }
143
144 /* Dump the loop information specified by LOOPS to the stream FILE,
145    using auxiliary dump callback function LOOP_DUMP_AUX if non null.  */
146
147 void
148 flow_loops_dump (const struct loops *loops, FILE *file, void (*loop_dump_aux) (const struct loop *, FILE *, int), int verbose)
149 {
150   int i;
151   int num_loops;
152
153   num_loops = loops->num;
154   if (! num_loops || ! file)
155     return;
156
157   fprintf (file, ";; %d loops found, %d levels\n",
158            num_loops, loops->levels);
159
160   for (i = 0; i < num_loops; i++)
161     {
162       struct loop *loop = loops->parray[i];
163
164       if (!loop)
165         continue;
166
167       flow_loop_dump (loop, file, loop_dump_aux, verbose);
168     }
169
170   if (verbose)
171     flow_loops_cfg_dump (loops, file);
172 }
173
174 /* Free data allocated for LOOP.  */
175 void
176 flow_loop_free (struct loop *loop)
177 {
178   if (loop->pre_header_edges)
179     free (loop->pre_header_edges);
180   if (loop->entry_edges)
181     free (loop->entry_edges);
182   if (loop->exit_edges)
183     free (loop->exit_edges);
184   if (loop->pred)
185     free (loop->pred);
186   free (loop);
187 }
188
189 /* Free all the memory allocated for LOOPS.  */
190
191 void
192 flow_loops_free (struct loops *loops)
193 {
194   if (loops->parray)
195     {
196       unsigned i;
197
198       if (! loops->num)
199         abort ();
200
201       /* Free the loop descriptors.  */
202       for (i = 0; i < loops->num; i++)
203         {
204           struct loop *loop = loops->parray[i];
205
206           if (!loop)
207             continue;
208
209           flow_loop_free (loop);
210         }
211
212       free (loops->parray);
213       loops->parray = NULL;
214
215       if (loops->cfg.dom)
216         free_dominance_info (loops->cfg.dom);
217
218       if (loops->cfg.dfs_order)
219         free (loops->cfg.dfs_order);
220       if (loops->cfg.rc_order)
221         free (loops->cfg.rc_order);
222
223     }
224 }
225
226 /* Find the entry edges into the LOOP.  */
227
228 static void
229 flow_loop_entry_edges_find (struct loop *loop)
230 {
231   edge e;
232   int num_entries;
233
234   num_entries = 0;
235   for (e = loop->header->pred; e; e = e->pred_next)
236     {
237       if (flow_loop_outside_edge_p (loop, e))
238         num_entries++;
239     }
240
241   if (! num_entries)
242     abort ();
243
244   loop->entry_edges = xmalloc (num_entries * sizeof (edge *));
245
246   num_entries = 0;
247   for (e = loop->header->pred; e; e = e->pred_next)
248     {
249       if (flow_loop_outside_edge_p (loop, e))
250         loop->entry_edges[num_entries++] = e;
251     }
252
253   loop->num_entries = num_entries;
254 }
255
256 /* Find the exit edges from the LOOP.  */
257
258 static void
259 flow_loop_exit_edges_find (struct loop *loop)
260 {
261   edge e;
262   basic_block node, *bbs;
263   unsigned num_exits, i;
264
265   loop->exit_edges = NULL;
266   loop->num_exits = 0;
267
268   /* Check all nodes within the loop to see if there are any
269      successors not in the loop.  Note that a node may have multiple
270      exiting edges.  */
271   num_exits = 0;
272   bbs = get_loop_body (loop);
273   for (i = 0; i < loop->num_nodes; i++)
274     {
275       node = bbs[i];
276       for (e = node->succ; e; e = e->succ_next)
277         {
278           basic_block dest = e->dest;
279
280           if (!flow_bb_inside_loop_p (loop, dest))
281             num_exits++;
282         }
283     }
284
285   if (! num_exits)
286     {
287       free (bbs);
288       return;
289     }
290
291   loop->exit_edges = xmalloc (num_exits * sizeof (edge *));
292
293   /* Store all exiting edges into an array.  */
294   num_exits = 0;
295   for (i = 0; i < loop->num_nodes; i++)
296     {
297       node = bbs[i];
298       for (e = node->succ; e; e = e->succ_next)
299         {
300           basic_block dest = e->dest;
301
302           if (!flow_bb_inside_loop_p (loop, dest))
303             loop->exit_edges[num_exits++] = e;
304       }
305     }
306   free (bbs);
307   loop->num_exits = num_exits;
308 }
309
310 /* Find the nodes contained within the LOOP with header HEADER.
311    Return the number of nodes within the loop.  */
312
313 static int
314 flow_loop_nodes_find (basic_block header, struct loop *loop)
315 {
316   basic_block *stack;
317   int sp;
318   int num_nodes = 1;
319
320   header->loop_father = loop;
321   header->loop_depth = loop->depth;
322
323   if (loop->latch->loop_father != loop)
324     {
325       stack = xmalloc (n_basic_blocks * sizeof (basic_block));
326       sp = 0;
327       num_nodes++;
328       stack[sp++] = loop->latch;
329       loop->latch->loop_father = loop;
330       loop->latch->loop_depth = loop->depth;
331
332       while (sp)
333         {
334           basic_block node;
335           edge e;
336
337           node = stack[--sp];
338
339           for (e = node->pred; e; e = e->pred_next)
340             {
341               basic_block ancestor = e->src;
342
343               if (ancestor != ENTRY_BLOCK_PTR
344                   && ancestor->loop_father != loop)
345                 {
346                   ancestor->loop_father = loop;
347                   ancestor->loop_depth = loop->depth;
348                   num_nodes++;
349                   stack[sp++] = ancestor;
350                 }
351             }
352         }
353       free (stack);
354     }
355   return num_nodes;
356 }
357
358 /* Find the root node of the loop pre-header extended basic block and
359    the edges along the trace from the root node to the loop header.  */
360
361 static void
362 flow_loop_pre_header_scan (struct loop *loop)
363 {
364   int num;
365   basic_block ebb;
366   edge e;
367
368   loop->num_pre_header_edges = 0;
369   if (loop->num_entries != 1)
370     return;
371
372   ebb = loop->entry_edges[0]->src;
373   if (ebb == ENTRY_BLOCK_PTR)
374     return;
375
376   /* Count number of edges along trace from loop header to
377      root of pre-header extended basic block.  Usually this is
378      only one or two edges.  */
379   for (num = 1; ebb->pred->src != ENTRY_BLOCK_PTR && ! ebb->pred->pred_next;
380        num++)
381     ebb = ebb->pred->src;
382
383   loop->pre_header_edges = xmalloc (num * sizeof (edge));
384   loop->num_pre_header_edges = num;
385
386   /* Store edges in order that they are followed.  The source of the first edge
387      is the root node of the pre-header extended basic block and the
388      destination of the last last edge is the loop header.  */
389   for (e = loop->entry_edges[0]; num; e = e->src->pred)
390     loop->pre_header_edges[--num] = e;
391 }
392
393 /* Return the block for the pre-header of the loop with header
394    HEADER where DOM specifies the dominator information.  Return NULL if
395    there is no pre-header.  */
396
397 static basic_block
398 flow_loop_pre_header_find (basic_block header, dominance_info dom)
399 {
400   basic_block pre_header;
401   edge e;
402
403   /* If block p is a predecessor of the header and is the only block
404      that the header does not dominate, then it is the pre-header.  */
405   pre_header = NULL;
406   for (e = header->pred; e; e = e->pred_next)
407     {
408       basic_block node = e->src;
409
410       if (node != ENTRY_BLOCK_PTR
411           && ! dominated_by_p (dom, node, header))
412         {
413           if (pre_header == NULL)
414             pre_header = node;
415           else
416             {
417               /* There are multiple edges into the header from outside
418                  the loop so there is no pre-header block.  */
419               pre_header = NULL;
420               break;
421             }
422         }
423     }
424
425   return pre_header;
426 }
427
428 static void
429 establish_preds (struct loop *loop)
430 {
431   struct loop *ploop, *father = loop->outer;
432
433   loop->depth = father->depth + 1;
434   if (loop->pred)
435     free (loop->pred);
436   loop->pred = xmalloc (sizeof (struct loop *) * loop->depth);
437   memcpy (loop->pred, father->pred, sizeof (struct loop *) * father->depth);
438   loop->pred[father->depth] = father;
439
440   for (ploop = loop->inner; ploop; ploop = ploop->next)
441     establish_preds (ploop);
442 }
443
444 /* Add LOOP to the loop hierarchy tree where FATHER is father of the
445    added loop.  If LOOP has some children, take care of that their
446    pred field will be initialized correctly.  */
447
448 void
449 flow_loop_tree_node_add (struct loop *father, struct loop *loop)
450 {
451   loop->next = father->inner;
452   father->inner = loop;
453   loop->outer = father;
454
455   establish_preds (loop);
456 }
457
458 /* Remove LOOP from the loop hierarchy tree.  */
459
460 void
461 flow_loop_tree_node_remove (struct loop *loop)
462 {
463   struct loop *prev, *father;
464
465   father = loop->outer;
466   loop->outer = NULL;
467
468   /* Remove loop from the list of sons.  */
469   if (father->inner == loop)
470     father->inner = loop->next;
471   else
472     {
473       for (prev = father->inner; prev->next != loop; prev = prev->next);
474       prev->next = loop->next;
475     }
476
477   loop->depth = -1;
478   free (loop->pred);
479   loop->pred = NULL;
480 }
481
482 /* Helper function to compute loop nesting depth and enclosed loop level
483    for the natural loop specified by LOOP.  Returns the loop level.  */
484
485 static int
486 flow_loop_level_compute (struct loop *loop)
487 {
488   struct loop *inner;
489   int level = 1;
490
491   if (! loop)
492     return 0;
493
494   /* Traverse loop tree assigning depth and computing level as the
495      maximum level of all the inner loops of this loop.  The loop
496      level is equivalent to the height of the loop in the loop tree
497      and corresponds to the number of enclosed loop levels (including
498      itself).  */
499   for (inner = loop->inner; inner; inner = inner->next)
500     {
501       int ilevel = flow_loop_level_compute (inner) + 1;
502
503       if (ilevel > level)
504         level = ilevel;
505     }
506
507   loop->level = level;
508   return level;
509 }
510
511 /* Compute the loop nesting depth and enclosed loop level for the loop
512    hierarchy tree specified by LOOPS.  Return the maximum enclosed loop
513    level.  */
514
515 static int
516 flow_loops_level_compute (struct loops *loops)
517 {
518   return flow_loop_level_compute (loops->tree_root);
519 }
520
521 /* Scan a single natural loop specified by LOOP collecting information
522    about it specified by FLAGS.  */
523
524 int
525 flow_loop_scan (struct loops *loops, struct loop *loop, int flags)
526 {
527   if (flags & LOOP_ENTRY_EDGES)
528     {
529       /* Find edges which enter the loop header.
530          Note that the entry edges should only
531          enter the header of a natural loop.  */
532       flow_loop_entry_edges_find (loop);
533     }
534
535   if (flags & LOOP_EXIT_EDGES)
536     {
537       /* Find edges which exit the loop.  */
538       flow_loop_exit_edges_find (loop);
539     }
540
541   if (flags & LOOP_PRE_HEADER)
542     {
543       /* Look to see if the loop has a pre-header node.  */
544       loop->pre_header
545         = flow_loop_pre_header_find (loop->header, loops->cfg.dom);
546
547       /* Find the blocks within the extended basic block of
548          the loop pre-header.  */
549       flow_loop_pre_header_scan (loop);
550     }
551
552   return 1;
553 }
554
555 #define HEADER_BLOCK(B) (* (int *) (B)->aux)
556 #define LATCH_EDGE(E) (*(int *) (E)->aux)
557
558 /* Redirect edge and update latch and header info.  */
559 static void
560 redirect_edge_with_latch_update (edge e, basic_block to)
561 {
562   basic_block jump;
563
564   jump = redirect_edge_and_branch_force (e, to);
565   if (jump)
566     {
567       alloc_aux_for_block (jump, sizeof (int));
568       HEADER_BLOCK (jump) = 0;
569       alloc_aux_for_edge (jump->pred, sizeof (int));
570       LATCH_EDGE (jump->succ) = LATCH_EDGE (e);
571       LATCH_EDGE (jump->pred) = 0;
572     }
573 }
574
575 /* Split BB into entry part and rest; if REDIRECT_LATCH, redirect edges
576    marked as latch into entry part, analogically for REDIRECT_NONLATCH.
577    In both of these cases, ignore edge EXCEPT.  If CONN_LATCH, set edge
578    between created entry part and BB as latch one.  Return created entry
579    part.  */
580
581 static basic_block
582 make_forwarder_block (basic_block bb, int redirect_latch, int redirect_nonlatch, edge except, int conn_latch)
583 {
584   edge e, next_e, fallthru;
585   basic_block dummy;
586   rtx insn;
587
588   insn = PREV_INSN (first_insn_after_basic_block_note (bb));
589
590   /* For empty block split_block will return NULL.  */
591   if (bb->end == insn)
592     emit_note_after (NOTE_INSN_DELETED, insn);
593
594   fallthru = split_block (bb, insn);
595   dummy = fallthru->src;
596   bb = fallthru->dest;
597
598   bb->aux = xmalloc (sizeof (int));
599   HEADER_BLOCK (dummy) = 0;
600   HEADER_BLOCK (bb) = 1;
601
602   /* Redirect back edges we want to keep.  */
603   for (e = dummy->pred; e; e = next_e)
604     {
605       next_e = e->pred_next;
606       if (e == except
607           || !((redirect_latch && LATCH_EDGE (e))
608                || (redirect_nonlatch && !LATCH_EDGE (e))))
609         {
610           dummy->frequency -= EDGE_FREQUENCY (e);
611           dummy->count -= e->count;
612           if (dummy->frequency < 0)
613             dummy->frequency = 0;
614           if (dummy->count < 0)
615             dummy->count = 0;
616           redirect_edge_with_latch_update (e, bb);
617         }
618     }
619
620   alloc_aux_for_edge (fallthru, sizeof (int));
621   LATCH_EDGE (fallthru) = conn_latch;
622
623   return dummy;
624 }
625
626 /* Takes care of merging natural loops with shared headers.  */
627 static void
628 canonicalize_loop_headers (void)
629 {
630   dominance_info dom;
631   basic_block header;
632   edge e;
633
634   /* Compute the dominators.  */
635   dom = calculate_dominance_info (CDI_DOMINATORS);
636
637   alloc_aux_for_blocks (sizeof (int));
638   alloc_aux_for_edges (sizeof (int));
639
640   /* Split blocks so that each loop has only single latch.  */
641   FOR_EACH_BB (header)
642     {
643       int num_latches = 0;
644       int have_abnormal_edge = 0;
645
646       for (e = header->pred; e; e = e->pred_next)
647         {
648           basic_block latch = e->src;
649
650           if (e->flags & EDGE_ABNORMAL)
651             have_abnormal_edge = 1;
652
653           if (latch != ENTRY_BLOCK_PTR
654               && dominated_by_p (dom, latch, header))
655             {
656               num_latches++;
657               LATCH_EDGE (e) = 1;
658             }
659         }
660       if (have_abnormal_edge)
661         HEADER_BLOCK (header) = 0;
662       else
663         HEADER_BLOCK (header) = num_latches;
664     }
665
666   if (HEADER_BLOCK (ENTRY_BLOCK_PTR->succ->dest))
667     {
668       basic_block bb;
669
670       /* We could not redirect edges freely here. On the other hand,
671          we can simply split the edge from entry block.  */
672       bb = split_edge (ENTRY_BLOCK_PTR->succ);
673
674       alloc_aux_for_edge (bb->succ, sizeof (int));
675       LATCH_EDGE (bb->succ) = 0;
676       alloc_aux_for_block (bb, sizeof (int));
677       HEADER_BLOCK (bb) = 0;
678     }
679
680   FOR_EACH_BB (header)
681     {
682       int num_latch;
683       int want_join_latch;
684       int max_freq, is_heavy;
685       edge heavy;
686
687       if (!HEADER_BLOCK (header))
688         continue;
689
690       num_latch = HEADER_BLOCK (header);
691
692       want_join_latch = (num_latch > 1);
693
694       if (!want_join_latch)
695         continue;
696
697       /* Find a heavy edge.  */
698       is_heavy = 1;
699       heavy = NULL;
700       max_freq = 0;
701       for (e = header->pred; e; e = e->pred_next)
702         if (LATCH_EDGE (e) &&
703             EDGE_FREQUENCY (e) > max_freq)
704           max_freq = EDGE_FREQUENCY (e);
705       for (e = header->pred; e; e = e->pred_next)
706         if (LATCH_EDGE (e) &&
707             EDGE_FREQUENCY (e) >= max_freq / HEAVY_EDGE_RATIO)
708           {
709             if (heavy)
710               {
711                 is_heavy = 0;
712                 break;
713               }
714             else
715               heavy = e;
716           }
717
718       if (is_heavy)
719         {
720           basic_block new_header =
721             make_forwarder_block (header, true, true, heavy, 0);
722           if (num_latch > 2)
723             make_forwarder_block (new_header, true, false, NULL, 1);
724         }
725       else
726         make_forwarder_block (header, true, false, NULL, 1);
727     }
728
729   free_aux_for_blocks ();
730   free_aux_for_edges ();
731   free_dominance_info (dom);
732 }
733
734 /* Find all the natural loops in the function and save in LOOPS structure and
735    recalculate loop_depth information in basic block structures.  FLAGS
736    controls which loop information is collected.  Return the number of natural
737    loops found.  */
738
739 int
740 flow_loops_find (struct loops *loops, int flags)
741 {
742   int i;
743   int b;
744   int num_loops;
745   edge e;
746   sbitmap headers;
747   dominance_info dom;
748   int *dfs_order;
749   int *rc_order;
750   basic_block header;
751   basic_block bb;
752
753   /* This function cannot be repeatedly called with different
754      flags to build up the loop information.  The loop tree
755      must always be built if this function is called.  */
756   if (! (flags & LOOP_TREE))
757     abort ();
758
759   memset (loops, 0, sizeof *loops);
760
761   /* Taking care of this degenerate case makes the rest of
762      this code simpler.  */
763   if (n_basic_blocks == 0)
764     return 0;
765
766   dfs_order = NULL;
767   rc_order = NULL;
768
769   /* Join loops with shared headers.  */
770   canonicalize_loop_headers ();
771
772   /* Compute the dominators.  */
773   dom = loops->cfg.dom = calculate_dominance_info (CDI_DOMINATORS);
774
775   /* Count the number of loop headers.  This should be the
776      same as the number of natural loops.  */
777   headers = sbitmap_alloc (last_basic_block);
778   sbitmap_zero (headers);
779
780   num_loops = 0;
781   FOR_EACH_BB (header)
782     {
783       int more_latches = 0;
784
785       header->loop_depth = 0;
786
787       /* If we have an abnormal predecessor, do not consider the
788          loop (not worth the problems).  */
789       for (e = header->pred; e; e = e->pred_next)
790         if (e->flags & EDGE_ABNORMAL)
791           break;
792       if (e)
793         continue;
794
795       for (e = header->pred; e; e = e->pred_next)
796         {
797           basic_block latch = e->src;
798
799           if (e->flags & EDGE_ABNORMAL)
800             abort ();
801
802           /* Look for back edges where a predecessor is dominated
803              by this block.  A natural loop has a single entry
804              node (header) that dominates all the nodes in the
805              loop.  It also has single back edge to the header
806              from a latch node.  */
807           if (latch != ENTRY_BLOCK_PTR && dominated_by_p (dom, latch, header))
808             {
809               /* Shared headers should be eliminated by now.  */
810               if (more_latches)
811                 abort ();
812               more_latches = 1;
813               SET_BIT (headers, header->index);
814               num_loops++;
815             }
816         }
817     }
818
819   /* Allocate loop structures.  */
820   loops->parray = xcalloc (num_loops + 1, sizeof (struct loop *));
821
822   /* Dummy loop containing whole function.  */
823   loops->parray[0] = xcalloc (1, sizeof (struct loop));
824   loops->parray[0]->next = NULL;
825   loops->parray[0]->inner = NULL;
826   loops->parray[0]->outer = NULL;
827   loops->parray[0]->depth = 0;
828   loops->parray[0]->pred = NULL;
829   loops->parray[0]->num_nodes = n_basic_blocks + 2;
830   loops->parray[0]->latch = EXIT_BLOCK_PTR;
831   loops->parray[0]->header = ENTRY_BLOCK_PTR;
832   ENTRY_BLOCK_PTR->loop_father = loops->parray[0];
833   EXIT_BLOCK_PTR->loop_father = loops->parray[0];
834
835   loops->tree_root = loops->parray[0];
836
837   /* Find and record information about all the natural loops
838      in the CFG.  */
839   loops->num = 1;
840   FOR_EACH_BB (bb)
841     bb->loop_father = loops->tree_root;
842
843   if (num_loops)
844     {
845       /* Compute depth first search order of the CFG so that outer
846          natural loops will be found before inner natural loops.  */
847       dfs_order = xmalloc (n_basic_blocks * sizeof (int));
848       rc_order = xmalloc (n_basic_blocks * sizeof (int));
849       flow_depth_first_order_compute (dfs_order, rc_order);
850
851       /* Save CFG derived information to avoid recomputing it.  */
852       loops->cfg.dom = dom;
853       loops->cfg.dfs_order = dfs_order;
854       loops->cfg.rc_order = rc_order;
855
856       num_loops = 1;
857
858       for (b = 0; b < n_basic_blocks; b++)
859         {
860           struct loop *loop;
861
862           /* Search the nodes of the CFG in reverse completion order
863              so that we can find outer loops first.  */
864           if (!TEST_BIT (headers, rc_order[b]))
865             continue;
866
867           header = BASIC_BLOCK (rc_order[b]);
868
869           loop = loops->parray[num_loops] = xcalloc (1, sizeof (struct loop));
870
871           loop->header = header;
872           loop->num = num_loops;
873           num_loops++;
874
875           /* Look for the latch for this header block.  */
876           for (e = header->pred; e; e = e->pred_next)
877             {
878               basic_block latch = e->src;
879
880               if (latch != ENTRY_BLOCK_PTR
881                   && dominated_by_p (dom, latch, header))
882                 {
883                   loop->latch = latch;
884                   break;
885                 }
886             }
887
888           flow_loop_tree_node_add (header->loop_father, loop);
889           loop->num_nodes = flow_loop_nodes_find (loop->header, loop);
890         }
891
892       sbitmap_free (headers);
893
894       /* Assign the loop nesting depth and enclosed loop level for each
895          loop.  */
896       loops->levels = flow_loops_level_compute (loops);
897
898       /* Scan the loops.  */
899       for (i = 1; i < num_loops; i++)
900         flow_loop_scan (loops, loops->parray[i], flags);
901
902       loops->num = num_loops;
903     }
904   else
905     {
906       loops->cfg.dom = NULL;
907       free_dominance_info (dom);
908     }
909
910   loops->state = 0;
911 #ifdef ENABLE_CHECKING
912   verify_flow_info ();
913   verify_loop_structure (loops);
914 #endif
915
916   return loops->num;
917 }
918
919 /* Update the information regarding the loops in the CFG
920    specified by LOOPS.  */
921
922 int
923 flow_loops_update (struct loops *loops, int flags)
924 {
925   /* One day we may want to update the current loop data.  For now
926      throw away the old stuff and rebuild what we need.  */
927   if (loops->parray)
928     flow_loops_free (loops);
929
930   return flow_loops_find (loops, flags);
931 }
932
933 /* Return nonzero if basic block BB belongs to LOOP.  */
934 bool
935 flow_bb_inside_loop_p (const struct loop *loop, const basic_block bb)
936 {
937   struct loop *source_loop;
938
939   if (bb == ENTRY_BLOCK_PTR || bb == EXIT_BLOCK_PTR)
940     return 0;
941
942   source_loop = bb->loop_father;
943   return loop == source_loop || flow_loop_nested_p (loop, source_loop);
944 }
945
946 /* Return nonzero if edge E enters header of LOOP from outside of LOOP.  */
947
948 bool
949 flow_loop_outside_edge_p (const struct loop *loop, edge e)
950 {
951   if (e->dest != loop->header)
952     abort ();
953   return !flow_bb_inside_loop_p (loop, e->src);
954 }
955
956 /* Enumeration predicate for get_loop_body.  */
957 static bool
958 glb_enum_p (basic_block bb, void *glb_header)
959 {
960   return bb != (basic_block) glb_header;
961 }
962
963 /* Gets basic blocks of a LOOP.  Header is the 0-th block, rest is in dfs
964    order against direction of edges from latch.  Specially, if
965    header != latch, latch is the 1-st block.  */
966 basic_block *
967 get_loop_body (const struct loop *loop)
968 {
969   basic_block *tovisit, bb;
970   unsigned tv = 0;
971
972   if (!loop->num_nodes)
973     abort ();
974
975   tovisit = xcalloc (loop->num_nodes, sizeof (basic_block));
976   tovisit[tv++] = loop->header;
977
978   if (loop->latch == EXIT_BLOCK_PTR)
979     {
980       /* There may be blocks unreachable from EXIT_BLOCK.  */
981       if (loop->num_nodes != (unsigned) n_basic_blocks + 2)
982         abort ();
983       FOR_EACH_BB (bb)
984         tovisit[tv++] = bb;
985       tovisit[tv++] = EXIT_BLOCK_PTR;
986     }
987   else if (loop->latch != loop->header)
988     {
989       tv = dfs_enumerate_from (loop->latch, 1, glb_enum_p,
990                                tovisit + 1, loop->num_nodes - 1,
991                                loop->header) + 1;
992     }
993
994   if (tv != loop->num_nodes)
995     abort ();
996   return tovisit;
997 }
998
999 /* Gets exit edges of a LOOP, returning their number in N_EDGES.  */
1000 edge *
1001 get_loop_exit_edges (const struct loop *loop, unsigned int *n_edges)
1002 {
1003   edge *edges, e;
1004   unsigned i, n;
1005   basic_block * body;
1006
1007   if (loop->latch == EXIT_BLOCK_PTR)
1008     abort ();
1009
1010   body = get_loop_body (loop);
1011   n = 0;
1012   for (i = 0; i < loop->num_nodes; i++)
1013     for (e = body[i]->succ; e; e = e->succ_next)
1014       if (!flow_bb_inside_loop_p (loop, e->dest))
1015         n++;
1016   edges = xmalloc (n * sizeof (edge));
1017   *n_edges = n;
1018   n = 0;
1019   for (i = 0; i < loop->num_nodes; i++)
1020     for (e = body[i]->succ; e; e = e->succ_next)
1021       if (!flow_bb_inside_loop_p (loop, e->dest))
1022         edges[n++] = e;
1023   free (body);
1024
1025   return edges;
1026 }
1027
1028 /* Adds basic block BB to LOOP.  */
1029 void
1030 add_bb_to_loop (basic_block bb, struct loop *loop)
1031 {
1032    int i;
1033
1034    bb->loop_father = loop;
1035    bb->loop_depth = loop->depth;
1036    loop->num_nodes++;
1037    for (i = 0; i < loop->depth; i++)
1038      loop->pred[i]->num_nodes++;
1039  }
1040
1041 /* Remove basic block BB from loops.  */
1042 void
1043 remove_bb_from_loops (basic_block bb)
1044 {
1045    int i;
1046    struct loop *loop = bb->loop_father;
1047
1048    loop->num_nodes--;
1049    for (i = 0; i < loop->depth; i++)
1050      loop->pred[i]->num_nodes--;
1051    bb->loop_father = NULL;
1052    bb->loop_depth = 0;
1053  }
1054
1055 /* Finds nearest common ancestor in loop tree for given loops.  */
1056 struct loop *
1057 find_common_loop (struct loop *loop_s, struct loop *loop_d)
1058 {
1059   if (!loop_s) return loop_d;
1060   if (!loop_d) return loop_s;
1061
1062   if (loop_s->depth < loop_d->depth)
1063     loop_d = loop_d->pred[loop_s->depth];
1064   else if (loop_s->depth > loop_d->depth)
1065     loop_s = loop_s->pred[loop_d->depth];
1066
1067   while (loop_s != loop_d)
1068     {
1069       loop_s = loop_s->outer;
1070       loop_d = loop_d->outer;
1071     }
1072   return loop_s;
1073 }
1074
1075 /* Cancels the LOOP; it must be innermost one.  */
1076 void
1077 cancel_loop (struct loops *loops, struct loop *loop)
1078 {
1079   basic_block *bbs;
1080   unsigned i;
1081
1082   if (loop->inner)
1083     abort ();
1084
1085   /* Move blocks up one level (they should be removed as soon as possible).  */
1086   bbs = get_loop_body (loop);
1087   for (i = 0; i < loop->num_nodes; i++)
1088     bbs[i]->loop_father = loop->outer;
1089
1090   /* Remove the loop from structure.  */
1091   flow_loop_tree_node_remove (loop);
1092
1093   /* Remove loop from loops array.  */
1094   loops->parray[loop->num] = NULL;
1095
1096   /* Free loop data.  */
1097   flow_loop_free (loop);
1098 }
1099
1100 /* Cancels LOOP and all its subloops.  */
1101 void
1102 cancel_loop_tree (struct loops *loops, struct loop *loop)
1103 {
1104   while (loop->inner)
1105     cancel_loop_tree (loops, loop->inner);
1106   cancel_loop (loops, loop);
1107 }
1108
1109 /* Checks that LOOPS are all right:
1110      -- sizes of loops are all right
1111      -- results of get_loop_body really belong to the loop
1112      -- loop header have just single entry edge and single latch edge
1113      -- loop latches have only single successor that is header of their loop
1114      -- irreducible loops are correctly marked
1115   */
1116 void
1117 verify_loop_structure (struct loops *loops)
1118 {
1119   unsigned *sizes, i, j;
1120   sbitmap irreds;
1121   basic_block *bbs, bb;
1122   struct loop *loop;
1123   int err = 0;
1124   edge e;
1125
1126   /* Check sizes.  */
1127   sizes = xcalloc (loops->num, sizeof (int));
1128   sizes[0] = 2;
1129
1130   FOR_EACH_BB (bb)
1131     for (loop = bb->loop_father; loop; loop = loop->outer)
1132       sizes[loop->num]++;
1133
1134   for (i = 0; i < loops->num; i++)
1135     {
1136       if (!loops->parray[i])
1137         continue;
1138
1139       if (loops->parray[i]->num_nodes != sizes[i])
1140         {
1141           error ("Size of loop %d should be %d, not %d.",
1142                    i, sizes[i], loops->parray[i]->num_nodes);
1143           err = 1;
1144         }
1145     }
1146
1147   free (sizes);
1148
1149   /* Check get_loop_body.  */
1150   for (i = 1; i < loops->num; i++)
1151     {
1152       loop = loops->parray[i];
1153       if (!loop)
1154         continue;
1155       bbs = get_loop_body (loop);
1156
1157       for (j = 0; j < loop->num_nodes; j++)
1158         if (!flow_bb_inside_loop_p (loop, bbs[j]))
1159           {
1160             error ("Bb %d do not belong to loop %d.",
1161                     bbs[j]->index, i);
1162             err = 1;
1163           }
1164       free (bbs);
1165     }
1166
1167   /* Check headers and latches.  */
1168   for (i = 1; i < loops->num; i++)
1169     {
1170       loop = loops->parray[i];
1171       if (!loop)
1172         continue;
1173
1174       if ((loops->state & LOOPS_HAVE_PREHEADERS)
1175           && (!loop->header->pred->pred_next
1176               || loop->header->pred->pred_next->pred_next))
1177         {
1178           error ("Loop %d's header does not have exactly 2 entries.", i);
1179           err = 1;
1180         }
1181       if (loops->state & LOOPS_HAVE_SIMPLE_LATCHES)
1182         {
1183           if (!loop->latch->succ
1184               || loop->latch->succ->succ_next)
1185             {
1186               error ("Loop %d's latch does not have exactly 1 successor.", i);
1187               err = 1;
1188             }
1189           if (loop->latch->succ->dest != loop->header)
1190             {
1191               error ("Loop %d's latch does not have header as successor.", i);
1192               err = 1;
1193             }
1194           if (loop->latch->loop_father != loop)
1195             {
1196               error ("Loop %d's latch does not belong directly to it.", i);
1197               err = 1;
1198             }
1199         }
1200       if (loop->header->loop_father != loop)
1201         {
1202           error ("Loop %d's header does not belong directly to it.", i);
1203           err = 1;
1204         }
1205       if ((loops->state & LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS)
1206           && (loop_latch_edge (loop)->flags & EDGE_IRREDUCIBLE_LOOP))
1207         {
1208           error ("Loop %d's latch is marked as part of irreducible region.", i);
1209           err = 1;
1210         }
1211     }
1212
1213   /* Check irreducible loops.  */
1214   if (loops->state & LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS)
1215     {
1216       /* Record old info.  */
1217       irreds = sbitmap_alloc (last_basic_block);
1218       FOR_EACH_BB (bb)
1219         {
1220           if (bb->flags & BB_IRREDUCIBLE_LOOP)
1221             SET_BIT (irreds, bb->index);
1222           else
1223             RESET_BIT (irreds, bb->index);
1224           for (e = bb->succ; e; e = e->succ_next)
1225             if (e->flags & EDGE_IRREDUCIBLE_LOOP)
1226               e->flags |= EDGE_ALL_FLAGS + 1;
1227         }
1228
1229       /* Recount it.  */
1230       mark_irreducible_loops (loops);
1231
1232       /* Compare.  */
1233       FOR_EACH_BB (bb)
1234         {
1235           if ((bb->flags & BB_IRREDUCIBLE_LOOP)
1236               && !TEST_BIT (irreds, bb->index))
1237             {
1238               error ("Basic block %d should be marked irreducible.", bb->index);
1239               err = 1;
1240             }
1241           else if (!(bb->flags & BB_IRREDUCIBLE_LOOP)
1242               && TEST_BIT (irreds, bb->index))
1243             {
1244               error ("Basic block %d should not be marked irreducible.", bb->index);
1245               err = 1;
1246             }
1247           for (e = bb->succ; e; e = e->succ_next)
1248             {
1249               if ((e->flags & EDGE_IRREDUCIBLE_LOOP)
1250                   && !(e->flags & (EDGE_ALL_FLAGS + 1)))
1251                 {
1252                   error ("Edge from %d to %d should be marked irreducible.",
1253                          e->src->index, e->dest->index);
1254                   err = 1;
1255                 }
1256               else if (!(e->flags & EDGE_IRREDUCIBLE_LOOP)
1257                        && (e->flags & (EDGE_ALL_FLAGS + 1)))
1258                 {
1259                   error ("Edge from %d to %d should not be marked irreducible.",
1260                          e->src->index, e->dest->index);
1261                   err = 1;
1262                 }
1263               e->flags &= ~(EDGE_ALL_FLAGS + 1);
1264             }
1265         }
1266       free (irreds);
1267     }
1268
1269   if (err)
1270     abort ();
1271 }
1272
1273 /* Returns latch edge of LOOP.  */
1274 edge
1275 loop_latch_edge (const struct loop *loop)
1276 {
1277   edge e;
1278
1279   for (e = loop->header->pred; e->src != loop->latch; e = e->pred_next)
1280     continue;
1281
1282   return e;
1283 }
1284
1285 /* Returns preheader edge of LOOP.  */
1286 edge
1287 loop_preheader_edge (const struct loop *loop)
1288 {
1289   edge e;
1290
1291   for (e = loop->header->pred; e->src == loop->latch; e = e->pred_next)
1292     continue;
1293
1294   return e;
1295 }