PR c++/3478
[official-gcc.git] / gcc / cfgloop.c
blob69097c009a9cfd70bdfaba29f9954cbc6a9c1341
1 /* Natural loop discovery code for GNU compiler.
2 Copyright (C) 2000, 2001, 2003, 2004 Free Software Foundation, Inc.
4 This file is part of GCC.
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.
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.
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. */
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"
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
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);
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);
50 /* Dump loop related CFG information. */
52 static void
53 flow_loops_cfg_dump (const struct loops *loops, FILE *file)
55 int i;
56 basic_block bb;
58 if (! loops->num || ! file)
59 return;
61 FOR_EACH_BB (bb)
63 edge succ;
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");
71 /* Dump the DFS node order. */
72 if (loops->cfg.dfs_order)
74 fputs (";; DFS order: ", file);
75 for (i = 0; i < n_basic_blocks; i++)
76 fprintf (file, "%d ", loops->cfg.dfs_order[i]);
78 fputs ("\n", file);
81 /* Dump the reverse completion node order. */
82 if (loops->cfg.rc_order)
84 fputs (";; RC order: ", file);
85 for (i = 0; i < n_basic_blocks; i++)
86 fprintf (file, "%d ", loops->cfg.rc_order[i]);
88 fputs ("\n", file);
92 /* Return nonzero if the nodes of LOOP are a subset of OUTER. */
94 bool
95 flow_loop_nested_p (const struct loop *outer, const struct loop *loop)
97 return loop->depth > outer->depth
98 && loop->pred[outer->depth] == outer;
101 /* Dump the loop information specified by LOOP to the stream FILE
102 using auxiliary dump callback function LOOP_DUMP_AUX if non null. */
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)
109 basic_block *bbs;
110 unsigned i;
112 if (! loop || ! loop->header)
113 return;
115 fprintf (file, ";;\n;; Loop %d:%s\n", loop->num,
116 loop->invalid ? " invalid" : "");
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));
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);
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);
140 if (loop_dump_aux)
141 loop_dump_aux (loop, file, verbose);
144 /* Dump the loop information specified by LOOPS to the stream FILE,
145 using auxiliary dump callback function LOOP_DUMP_AUX if non null. */
147 void
148 flow_loops_dump (const struct loops *loops, FILE *file, void (*loop_dump_aux) (const struct loop *, FILE *, int), int verbose)
150 int i;
151 int num_loops;
153 num_loops = loops->num;
154 if (! num_loops || ! file)
155 return;
157 fprintf (file, ";; %d loops found, %d levels\n",
158 num_loops, loops->levels);
160 for (i = 0; i < num_loops; i++)
162 struct loop *loop = loops->parray[i];
164 if (!loop)
165 continue;
167 flow_loop_dump (loop, file, loop_dump_aux, verbose);
170 if (verbose)
171 flow_loops_cfg_dump (loops, file);
174 /* Free data allocated for LOOP. */
175 void
176 flow_loop_free (struct loop *loop)
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);
189 /* Free all the memory allocated for LOOPS. */
191 void
192 flow_loops_free (struct loops *loops)
194 if (loops->parray)
196 unsigned i;
198 if (! loops->num)
199 abort ();
201 /* Free the loop descriptors. */
202 for (i = 0; i < loops->num; i++)
204 struct loop *loop = loops->parray[i];
206 if (!loop)
207 continue;
209 flow_loop_free (loop);
212 free (loops->parray);
213 loops->parray = NULL;
215 if (loops->cfg.dfs_order)
216 free (loops->cfg.dfs_order);
217 if (loops->cfg.rc_order)
218 free (loops->cfg.rc_order);
223 /* Find the entry edges into the LOOP. */
225 static void
226 flow_loop_entry_edges_find (struct loop *loop)
228 edge e;
229 int num_entries;
231 num_entries = 0;
232 for (e = loop->header->pred; e; e = e->pred_next)
234 if (flow_loop_outside_edge_p (loop, e))
235 num_entries++;
238 if (! num_entries)
239 abort ();
241 loop->entry_edges = xmalloc (num_entries * sizeof (edge *));
243 num_entries = 0;
244 for (e = loop->header->pred; e; e = e->pred_next)
246 if (flow_loop_outside_edge_p (loop, e))
247 loop->entry_edges[num_entries++] = e;
250 loop->num_entries = num_entries;
253 /* Find the exit edges from the LOOP. */
255 static void
256 flow_loop_exit_edges_find (struct loop *loop)
258 edge e;
259 basic_block node, *bbs;
260 unsigned num_exits, i;
262 loop->exit_edges = NULL;
263 loop->num_exits = 0;
265 /* Check all nodes within the loop to see if there are any
266 successors not in the loop. Note that a node may have multiple
267 exiting edges. */
268 num_exits = 0;
269 bbs = get_loop_body (loop);
270 for (i = 0; i < loop->num_nodes; i++)
272 node = bbs[i];
273 for (e = node->succ; e; e = e->succ_next)
275 basic_block dest = e->dest;
277 if (!flow_bb_inside_loop_p (loop, dest))
278 num_exits++;
282 if (! num_exits)
284 free (bbs);
285 return;
288 loop->exit_edges = xmalloc (num_exits * sizeof (edge *));
290 /* Store all exiting edges into an array. */
291 num_exits = 0;
292 for (i = 0; i < loop->num_nodes; i++)
294 node = bbs[i];
295 for (e = node->succ; e; e = e->succ_next)
297 basic_block dest = e->dest;
299 if (!flow_bb_inside_loop_p (loop, dest))
300 loop->exit_edges[num_exits++] = e;
303 free (bbs);
304 loop->num_exits = num_exits;
307 /* Find the nodes contained within the LOOP with header HEADER.
308 Return the number of nodes within the loop. */
310 static int
311 flow_loop_nodes_find (basic_block header, struct loop *loop)
313 basic_block *stack;
314 int sp;
315 int num_nodes = 1;
317 header->loop_father = loop;
318 header->loop_depth = loop->depth;
320 if (loop->latch->loop_father != loop)
322 stack = xmalloc (n_basic_blocks * sizeof (basic_block));
323 sp = 0;
324 num_nodes++;
325 stack[sp++] = loop->latch;
326 loop->latch->loop_father = loop;
327 loop->latch->loop_depth = loop->depth;
329 while (sp)
331 basic_block node;
332 edge e;
334 node = stack[--sp];
336 for (e = node->pred; e; e = e->pred_next)
338 basic_block ancestor = e->src;
340 if (ancestor != ENTRY_BLOCK_PTR
341 && ancestor->loop_father != loop)
343 ancestor->loop_father = loop;
344 ancestor->loop_depth = loop->depth;
345 num_nodes++;
346 stack[sp++] = ancestor;
350 free (stack);
352 return num_nodes;
355 /* Find the root node of the loop pre-header extended basic block and
356 the edges along the trace from the root node to the loop header. */
358 static void
359 flow_loop_pre_header_scan (struct loop *loop)
361 int num;
362 basic_block ebb;
363 edge e;
365 loop->num_pre_header_edges = 0;
366 if (loop->num_entries != 1)
367 return;
369 ebb = loop->entry_edges[0]->src;
370 if (ebb == ENTRY_BLOCK_PTR)
371 return;
373 /* Count number of edges along trace from loop header to
374 root of pre-header extended basic block. Usually this is
375 only one or two edges. */
376 for (num = 1; ebb->pred->src != ENTRY_BLOCK_PTR && ! ebb->pred->pred_next;
377 num++)
378 ebb = ebb->pred->src;
380 loop->pre_header_edges = xmalloc (num * sizeof (edge));
381 loop->num_pre_header_edges = num;
383 /* Store edges in order that they are followed. The source of the first edge
384 is the root node of the pre-header extended basic block and the
385 destination of the last last edge is the loop header. */
386 for (e = loop->entry_edges[0]; num; e = e->src->pred)
387 loop->pre_header_edges[--num] = e;
390 /* Return the block for the pre-header of the loop with header
391 HEADER. Return NULL if there is no pre-header. */
393 static basic_block
394 flow_loop_pre_header_find (basic_block header)
396 basic_block pre_header;
397 edge e;
399 /* If block p is a predecessor of the header and is the only block
400 that the header does not dominate, then it is the pre-header. */
401 pre_header = NULL;
402 for (e = header->pred; e; e = e->pred_next)
404 basic_block node = e->src;
406 if (node != ENTRY_BLOCK_PTR
407 && ! dominated_by_p (CDI_DOMINATORS, node, header))
409 if (pre_header == NULL)
410 pre_header = node;
411 else
413 /* There are multiple edges into the header from outside
414 the loop so there is no pre-header block. */
415 pre_header = NULL;
416 break;
421 return pre_header;
424 static void
425 establish_preds (struct loop *loop)
427 struct loop *ploop, *father = loop->outer;
429 loop->depth = father->depth + 1;
430 if (loop->pred)
431 free (loop->pred);
432 loop->pred = xmalloc (sizeof (struct loop *) * loop->depth);
433 memcpy (loop->pred, father->pred, sizeof (struct loop *) * father->depth);
434 loop->pred[father->depth] = father;
436 for (ploop = loop->inner; ploop; ploop = ploop->next)
437 establish_preds (ploop);
440 /* Add LOOP to the loop hierarchy tree where FATHER is father of the
441 added loop. If LOOP has some children, take care of that their
442 pred field will be initialized correctly. */
444 void
445 flow_loop_tree_node_add (struct loop *father, struct loop *loop)
447 loop->next = father->inner;
448 father->inner = loop;
449 loop->outer = father;
451 establish_preds (loop);
454 /* Remove LOOP from the loop hierarchy tree. */
456 void
457 flow_loop_tree_node_remove (struct loop *loop)
459 struct loop *prev, *father;
461 father = loop->outer;
462 loop->outer = NULL;
464 /* Remove loop from the list of sons. */
465 if (father->inner == loop)
466 father->inner = loop->next;
467 else
469 for (prev = father->inner; prev->next != loop; prev = prev->next);
470 prev->next = loop->next;
473 loop->depth = -1;
474 free (loop->pred);
475 loop->pred = NULL;
478 /* Helper function to compute loop nesting depth and enclosed loop level
479 for the natural loop specified by LOOP. Returns the loop level. */
481 static int
482 flow_loop_level_compute (struct loop *loop)
484 struct loop *inner;
485 int level = 1;
487 if (! loop)
488 return 0;
490 /* Traverse loop tree assigning depth and computing level as the
491 maximum level of all the inner loops of this loop. The loop
492 level is equivalent to the height of the loop in the loop tree
493 and corresponds to the number of enclosed loop levels (including
494 itself). */
495 for (inner = loop->inner; inner; inner = inner->next)
497 int ilevel = flow_loop_level_compute (inner) + 1;
499 if (ilevel > level)
500 level = ilevel;
503 loop->level = level;
504 return level;
507 /* Compute the loop nesting depth and enclosed loop level for the loop
508 hierarchy tree specified by LOOPS. Return the maximum enclosed loop
509 level. */
511 static int
512 flow_loops_level_compute (struct loops *loops)
514 return flow_loop_level_compute (loops->tree_root);
517 /* Scan a single natural loop specified by LOOP collecting information
518 about it specified by FLAGS. */
521 flow_loop_scan (struct loop *loop, int flags)
523 if (flags & LOOP_ENTRY_EDGES)
525 /* Find edges which enter the loop header.
526 Note that the entry edges should only
527 enter the header of a natural loop. */
528 flow_loop_entry_edges_find (loop);
531 if (flags & LOOP_EXIT_EDGES)
533 /* Find edges which exit the loop. */
534 flow_loop_exit_edges_find (loop);
537 if (flags & LOOP_PRE_HEADER)
539 /* Look to see if the loop has a pre-header node. */
540 loop->pre_header = flow_loop_pre_header_find (loop->header);
542 /* Find the blocks within the extended basic block of
543 the loop pre-header. */
544 flow_loop_pre_header_scan (loop);
547 return 1;
550 #define HEADER_BLOCK(B) (* (int *) (B)->aux)
551 #define LATCH_EDGE(E) (*(int *) (E)->aux)
553 /* Redirect edge and update latch and header info. */
554 static void
555 redirect_edge_with_latch_update (edge e, basic_block to)
557 basic_block jump;
559 jump = redirect_edge_and_branch_force (e, to);
560 if (jump)
562 alloc_aux_for_block (jump, sizeof (int));
563 HEADER_BLOCK (jump) = 0;
564 alloc_aux_for_edge (jump->pred, sizeof (int));
565 LATCH_EDGE (jump->succ) = LATCH_EDGE (e);
566 LATCH_EDGE (jump->pred) = 0;
570 /* Split BB into entry part and rest; if REDIRECT_LATCH, redirect edges
571 marked as latch into entry part, analogically for REDIRECT_NONLATCH.
572 In both of these cases, ignore edge EXCEPT. If CONN_LATCH, set edge
573 between created entry part and BB as latch one. Return created entry
574 part. */
576 static basic_block
577 make_forwarder_block (basic_block bb, int redirect_latch, int redirect_nonlatch, edge except, int conn_latch)
579 edge e, next_e, fallthru;
580 basic_block dummy;
581 rtx insn;
583 insn = PREV_INSN (first_insn_after_basic_block_note (bb));
585 /* For empty block split_block will return NULL. */
586 if (BB_END (bb) == insn)
587 emit_note_after (NOTE_INSN_DELETED, insn);
589 fallthru = split_block (bb, insn);
590 dummy = fallthru->src;
591 bb = fallthru->dest;
593 bb->aux = xmalloc (sizeof (int));
594 HEADER_BLOCK (dummy) = 0;
595 HEADER_BLOCK (bb) = 1;
597 /* Redirect back edges we want to keep. */
598 for (e = dummy->pred; e; e = next_e)
600 next_e = e->pred_next;
601 if (e == except
602 || !((redirect_latch && LATCH_EDGE (e))
603 || (redirect_nonlatch && !LATCH_EDGE (e))))
605 dummy->frequency -= EDGE_FREQUENCY (e);
606 dummy->count -= e->count;
607 if (dummy->frequency < 0)
608 dummy->frequency = 0;
609 if (dummy->count < 0)
610 dummy->count = 0;
611 redirect_edge_with_latch_update (e, bb);
615 alloc_aux_for_edge (fallthru, sizeof (int));
616 LATCH_EDGE (fallthru) = conn_latch;
618 return dummy;
621 /* Takes care of merging natural loops with shared headers. */
622 static void
623 canonicalize_loop_headers (void)
625 basic_block header;
626 edge e;
628 /* Compute the dominators. */
629 calculate_dominance_info (CDI_DOMINATORS);
631 alloc_aux_for_blocks (sizeof (int));
632 alloc_aux_for_edges (sizeof (int));
634 /* Split blocks so that each loop has only single latch. */
635 FOR_EACH_BB (header)
637 int num_latches = 0;
638 int have_abnormal_edge = 0;
640 for (e = header->pred; e; e = e->pred_next)
642 basic_block latch = e->src;
644 if (e->flags & EDGE_ABNORMAL)
645 have_abnormal_edge = 1;
647 if (latch != ENTRY_BLOCK_PTR
648 && dominated_by_p (CDI_DOMINATORS, latch, header))
650 num_latches++;
651 LATCH_EDGE (e) = 1;
654 if (have_abnormal_edge)
655 HEADER_BLOCK (header) = 0;
656 else
657 HEADER_BLOCK (header) = num_latches;
660 free_dominance_info (CDI_DOMINATORS);
662 if (HEADER_BLOCK (ENTRY_BLOCK_PTR->succ->dest))
664 basic_block bb;
666 /* We could not redirect edges freely here. On the other hand,
667 we can simply split the edge from entry block. */
668 bb = split_edge (ENTRY_BLOCK_PTR->succ);
670 alloc_aux_for_edge (bb->succ, sizeof (int));
671 LATCH_EDGE (bb->succ) = 0;
672 alloc_aux_for_block (bb, sizeof (int));
673 HEADER_BLOCK (bb) = 0;
676 FOR_EACH_BB (header)
678 int num_latch;
679 int want_join_latch;
680 int max_freq, is_heavy;
681 edge heavy;
683 if (!HEADER_BLOCK (header))
684 continue;
686 num_latch = HEADER_BLOCK (header);
688 want_join_latch = (num_latch > 1);
690 if (!want_join_latch)
691 continue;
693 /* Find a heavy edge. */
694 is_heavy = 1;
695 heavy = NULL;
696 max_freq = 0;
697 for (e = header->pred; e; e = e->pred_next)
698 if (LATCH_EDGE (e) &&
699 EDGE_FREQUENCY (e) > max_freq)
700 max_freq = EDGE_FREQUENCY (e);
701 for (e = header->pred; e; e = e->pred_next)
702 if (LATCH_EDGE (e) &&
703 EDGE_FREQUENCY (e) >= max_freq / HEAVY_EDGE_RATIO)
705 if (heavy)
707 is_heavy = 0;
708 break;
710 else
711 heavy = e;
714 if (is_heavy)
716 basic_block new_header =
717 make_forwarder_block (header, true, true, heavy, 0);
718 if (num_latch > 2)
719 make_forwarder_block (new_header, true, false, NULL, 1);
721 else
722 make_forwarder_block (header, true, false, NULL, 1);
725 free_aux_for_blocks ();
726 free_aux_for_edges ();
729 /* Find all the natural loops in the function and save in LOOPS structure and
730 recalculate loop_depth information in basic block structures. FLAGS
731 controls which loop information is collected. Return the number of natural
732 loops found. */
735 flow_loops_find (struct loops *loops, int flags)
737 int i;
738 int b;
739 int num_loops;
740 edge e;
741 sbitmap headers;
742 int *dfs_order;
743 int *rc_order;
744 basic_block header;
745 basic_block bb;
747 /* This function cannot be repeatedly called with different
748 flags to build up the loop information. The loop tree
749 must always be built if this function is called. */
750 if (! (flags & LOOP_TREE))
751 abort ();
753 memset (loops, 0, sizeof *loops);
755 /* Taking care of this degenerate case makes the rest of
756 this code simpler. */
757 if (n_basic_blocks == 0)
758 return 0;
760 dfs_order = NULL;
761 rc_order = NULL;
763 /* Join loops with shared headers. */
764 canonicalize_loop_headers ();
766 /* Compute the dominators. */
767 calculate_dominance_info (CDI_DOMINATORS);
769 /* Count the number of loop headers. This should be the
770 same as the number of natural loops. */
771 headers = sbitmap_alloc (last_basic_block);
772 sbitmap_zero (headers);
774 num_loops = 0;
775 FOR_EACH_BB (header)
777 int more_latches = 0;
779 header->loop_depth = 0;
781 /* If we have an abnormal predecessor, do not consider the
782 loop (not worth the problems). */
783 for (e = header->pred; e; e = e->pred_next)
784 if (e->flags & EDGE_ABNORMAL)
785 break;
786 if (e)
787 continue;
789 for (e = header->pred; e; e = e->pred_next)
791 basic_block latch = e->src;
793 if (e->flags & EDGE_ABNORMAL)
794 abort ();
796 /* Look for back edges where a predecessor is dominated
797 by this block. A natural loop has a single entry
798 node (header) that dominates all the nodes in the
799 loop. It also has single back edge to the header
800 from a latch node. */
801 if (latch != ENTRY_BLOCK_PTR
802 && dominated_by_p (CDI_DOMINATORS, latch, header))
804 /* Shared headers should be eliminated by now. */
805 if (more_latches)
806 abort ();
807 more_latches = 1;
808 SET_BIT (headers, header->index);
809 num_loops++;
814 /* Allocate loop structures. */
815 loops->parray = xcalloc (num_loops + 1, sizeof (struct loop *));
817 /* Dummy loop containing whole function. */
818 loops->parray[0] = xcalloc (1, sizeof (struct loop));
819 loops->parray[0]->next = NULL;
820 loops->parray[0]->inner = NULL;
821 loops->parray[0]->outer = NULL;
822 loops->parray[0]->depth = 0;
823 loops->parray[0]->pred = NULL;
824 loops->parray[0]->num_nodes = n_basic_blocks + 2;
825 loops->parray[0]->latch = EXIT_BLOCK_PTR;
826 loops->parray[0]->header = ENTRY_BLOCK_PTR;
827 ENTRY_BLOCK_PTR->loop_father = loops->parray[0];
828 EXIT_BLOCK_PTR->loop_father = loops->parray[0];
830 loops->tree_root = loops->parray[0];
832 /* Find and record information about all the natural loops
833 in the CFG. */
834 loops->num = 1;
835 FOR_EACH_BB (bb)
836 bb->loop_father = loops->tree_root;
838 if (num_loops)
840 /* Compute depth first search order of the CFG so that outer
841 natural loops will be found before inner natural loops. */
842 dfs_order = xmalloc (n_basic_blocks * sizeof (int));
843 rc_order = xmalloc (n_basic_blocks * sizeof (int));
844 flow_depth_first_order_compute (dfs_order, rc_order);
846 /* Save CFG derived information to avoid recomputing it. */
847 loops->cfg.dfs_order = dfs_order;
848 loops->cfg.rc_order = rc_order;
850 num_loops = 1;
852 for (b = 0; b < n_basic_blocks; b++)
854 struct loop *loop;
856 /* Search the nodes of the CFG in reverse completion order
857 so that we can find outer loops first. */
858 if (!TEST_BIT (headers, rc_order[b]))
859 continue;
861 header = BASIC_BLOCK (rc_order[b]);
863 loop = loops->parray[num_loops] = xcalloc (1, sizeof (struct loop));
865 loop->header = header;
866 loop->num = num_loops;
867 num_loops++;
869 /* Look for the latch for this header block. */
870 for (e = header->pred; e; e = e->pred_next)
872 basic_block latch = e->src;
874 if (latch != ENTRY_BLOCK_PTR
875 && dominated_by_p (CDI_DOMINATORS, latch, header))
877 loop->latch = latch;
878 break;
882 flow_loop_tree_node_add (header->loop_father, loop);
883 loop->num_nodes = flow_loop_nodes_find (loop->header, loop);
886 /* Assign the loop nesting depth and enclosed loop level for each
887 loop. */
888 loops->levels = flow_loops_level_compute (loops);
890 /* Scan the loops. */
891 for (i = 1; i < num_loops; i++)
892 flow_loop_scan (loops->parray[i], flags);
894 loops->num = num_loops;
896 else
898 free_dominance_info (CDI_DOMINATORS);
901 sbitmap_free (headers);
903 loops->state = 0;
904 #ifdef ENABLE_CHECKING
905 verify_flow_info ();
906 verify_loop_structure (loops);
907 #endif
909 return loops->num;
912 /* Update the information regarding the loops in the CFG
913 specified by LOOPS. */
916 flow_loops_update (struct loops *loops, int flags)
918 /* One day we may want to update the current loop data. For now
919 throw away the old stuff and rebuild what we need. */
920 if (loops->parray)
921 flow_loops_free (loops);
923 return flow_loops_find (loops, flags);
926 /* Return nonzero if basic block BB belongs to LOOP. */
927 bool
928 flow_bb_inside_loop_p (const struct loop *loop, const basic_block bb)
930 struct loop *source_loop;
932 if (bb == ENTRY_BLOCK_PTR || bb == EXIT_BLOCK_PTR)
933 return 0;
935 source_loop = bb->loop_father;
936 return loop == source_loop || flow_loop_nested_p (loop, source_loop);
939 /* Return nonzero if edge E enters header of LOOP from outside of LOOP. */
941 bool
942 flow_loop_outside_edge_p (const struct loop *loop, edge e)
944 if (e->dest != loop->header)
945 abort ();
946 return !flow_bb_inside_loop_p (loop, e->src);
949 /* Enumeration predicate for get_loop_body. */
950 static bool
951 glb_enum_p (basic_block bb, void *glb_header)
953 return bb != (basic_block) glb_header;
956 /* Gets basic blocks of a LOOP. Header is the 0-th block, rest is in dfs
957 order against direction of edges from latch. Specially, if
958 header != latch, latch is the 1-st block. */
959 basic_block *
960 get_loop_body (const struct loop *loop)
962 basic_block *tovisit, bb;
963 unsigned tv = 0;
965 if (!loop->num_nodes)
966 abort ();
968 tovisit = xcalloc (loop->num_nodes, sizeof (basic_block));
969 tovisit[tv++] = loop->header;
971 if (loop->latch == EXIT_BLOCK_PTR)
973 /* There may be blocks unreachable from EXIT_BLOCK. */
974 if (loop->num_nodes != (unsigned) n_basic_blocks + 2)
975 abort ();
976 FOR_EACH_BB (bb)
977 tovisit[tv++] = bb;
978 tovisit[tv++] = EXIT_BLOCK_PTR;
980 else if (loop->latch != loop->header)
982 tv = dfs_enumerate_from (loop->latch, 1, glb_enum_p,
983 tovisit + 1, loop->num_nodes - 1,
984 loop->header) + 1;
987 if (tv != loop->num_nodes)
988 abort ();
989 return tovisit;
992 /* Gets exit edges of a LOOP, returning their number in N_EDGES. */
993 edge *
994 get_loop_exit_edges (const struct loop *loop, unsigned int *n_edges)
996 edge *edges, e;
997 unsigned i, n;
998 basic_block * body;
1000 if (loop->latch == EXIT_BLOCK_PTR)
1001 abort ();
1003 body = get_loop_body (loop);
1004 n = 0;
1005 for (i = 0; i < loop->num_nodes; i++)
1006 for (e = body[i]->succ; e; e = e->succ_next)
1007 if (!flow_bb_inside_loop_p (loop, e->dest))
1008 n++;
1009 edges = xmalloc (n * sizeof (edge));
1010 *n_edges = n;
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 edges[n++] = e;
1016 free (body);
1018 return edges;
1021 /* Adds basic block BB to LOOP. */
1022 void
1023 add_bb_to_loop (basic_block bb, struct loop *loop)
1025 int i;
1027 bb->loop_father = loop;
1028 bb->loop_depth = loop->depth;
1029 loop->num_nodes++;
1030 for (i = 0; i < loop->depth; i++)
1031 loop->pred[i]->num_nodes++;
1034 /* Remove basic block BB from loops. */
1035 void
1036 remove_bb_from_loops (basic_block bb)
1038 int i;
1039 struct loop *loop = bb->loop_father;
1041 loop->num_nodes--;
1042 for (i = 0; i < loop->depth; i++)
1043 loop->pred[i]->num_nodes--;
1044 bb->loop_father = NULL;
1045 bb->loop_depth = 0;
1048 /* Finds nearest common ancestor in loop tree for given loops. */
1049 struct loop *
1050 find_common_loop (struct loop *loop_s, struct loop *loop_d)
1052 if (!loop_s) return loop_d;
1053 if (!loop_d) return loop_s;
1055 if (loop_s->depth < loop_d->depth)
1056 loop_d = loop_d->pred[loop_s->depth];
1057 else if (loop_s->depth > loop_d->depth)
1058 loop_s = loop_s->pred[loop_d->depth];
1060 while (loop_s != loop_d)
1062 loop_s = loop_s->outer;
1063 loop_d = loop_d->outer;
1065 return loop_s;
1068 /* Cancels the LOOP; it must be innermost one. */
1069 void
1070 cancel_loop (struct loops *loops, struct loop *loop)
1072 basic_block *bbs;
1073 unsigned i;
1075 if (loop->inner)
1076 abort ();
1078 /* Move blocks up one level (they should be removed as soon as possible). */
1079 bbs = get_loop_body (loop);
1080 for (i = 0; i < loop->num_nodes; i++)
1081 bbs[i]->loop_father = loop->outer;
1083 /* Remove the loop from structure. */
1084 flow_loop_tree_node_remove (loop);
1086 /* Remove loop from loops array. */
1087 loops->parray[loop->num] = NULL;
1089 /* Free loop data. */
1090 flow_loop_free (loop);
1093 /* Cancels LOOP and all its subloops. */
1094 void
1095 cancel_loop_tree (struct loops *loops, struct loop *loop)
1097 while (loop->inner)
1098 cancel_loop_tree (loops, loop->inner);
1099 cancel_loop (loops, loop);
1102 /* Checks that LOOPS are all right:
1103 -- sizes of loops are all right
1104 -- results of get_loop_body really belong to the loop
1105 -- loop header have just single entry edge and single latch edge
1106 -- loop latches have only single successor that is header of their loop
1107 -- irreducible loops are correctly marked
1109 void
1110 verify_loop_structure (struct loops *loops)
1112 unsigned *sizes, i, j;
1113 sbitmap irreds;
1114 basic_block *bbs, bb;
1115 struct loop *loop;
1116 int err = 0;
1117 edge e;
1119 /* Check sizes. */
1120 sizes = xcalloc (loops->num, sizeof (int));
1121 sizes[0] = 2;
1123 FOR_EACH_BB (bb)
1124 for (loop = bb->loop_father; loop; loop = loop->outer)
1125 sizes[loop->num]++;
1127 for (i = 0; i < loops->num; i++)
1129 if (!loops->parray[i])
1130 continue;
1132 if (loops->parray[i]->num_nodes != sizes[i])
1134 error ("Size of loop %d should be %d, not %d.",
1135 i, sizes[i], loops->parray[i]->num_nodes);
1136 err = 1;
1140 free (sizes);
1142 /* Check get_loop_body. */
1143 for (i = 1; i < loops->num; i++)
1145 loop = loops->parray[i];
1146 if (!loop)
1147 continue;
1148 bbs = get_loop_body (loop);
1150 for (j = 0; j < loop->num_nodes; j++)
1151 if (!flow_bb_inside_loop_p (loop, bbs[j]))
1153 error ("Bb %d do not belong to loop %d.",
1154 bbs[j]->index, i);
1155 err = 1;
1157 free (bbs);
1160 /* Check headers and latches. */
1161 for (i = 1; i < loops->num; i++)
1163 loop = loops->parray[i];
1164 if (!loop)
1165 continue;
1167 if ((loops->state & LOOPS_HAVE_PREHEADERS)
1168 && (!loop->header->pred->pred_next
1169 || loop->header->pred->pred_next->pred_next))
1171 error ("Loop %d's header does not have exactly 2 entries.", i);
1172 err = 1;
1174 if (loops->state & LOOPS_HAVE_SIMPLE_LATCHES)
1176 if (!loop->latch->succ
1177 || loop->latch->succ->succ_next)
1179 error ("Loop %d's latch does not have exactly 1 successor.", i);
1180 err = 1;
1182 if (loop->latch->succ->dest != loop->header)
1184 error ("Loop %d's latch does not have header as successor.", i);
1185 err = 1;
1187 if (loop->latch->loop_father != loop)
1189 error ("Loop %d's latch does not belong directly to it.", i);
1190 err = 1;
1193 if (loop->header->loop_father != loop)
1195 error ("Loop %d's header does not belong directly to it.", i);
1196 err = 1;
1198 if ((loops->state & LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS)
1199 && (loop_latch_edge (loop)->flags & EDGE_IRREDUCIBLE_LOOP))
1201 error ("Loop %d's latch is marked as part of irreducible region.", i);
1202 err = 1;
1206 /* Check irreducible loops. */
1207 if (loops->state & LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS)
1209 /* Record old info. */
1210 irreds = sbitmap_alloc (last_basic_block);
1211 FOR_EACH_BB (bb)
1213 if (bb->flags & BB_IRREDUCIBLE_LOOP)
1214 SET_BIT (irreds, bb->index);
1215 else
1216 RESET_BIT (irreds, bb->index);
1217 for (e = bb->succ; e; e = e->succ_next)
1218 if (e->flags & EDGE_IRREDUCIBLE_LOOP)
1219 e->flags |= EDGE_ALL_FLAGS + 1;
1222 /* Recount it. */
1223 mark_irreducible_loops (loops);
1225 /* Compare. */
1226 FOR_EACH_BB (bb)
1228 if ((bb->flags & BB_IRREDUCIBLE_LOOP)
1229 && !TEST_BIT (irreds, bb->index))
1231 error ("Basic block %d should be marked irreducible.", bb->index);
1232 err = 1;
1234 else if (!(bb->flags & BB_IRREDUCIBLE_LOOP)
1235 && TEST_BIT (irreds, bb->index))
1237 error ("Basic block %d should not be marked irreducible.", bb->index);
1238 err = 1;
1240 for (e = bb->succ; e; e = e->succ_next)
1242 if ((e->flags & EDGE_IRREDUCIBLE_LOOP)
1243 && !(e->flags & (EDGE_ALL_FLAGS + 1)))
1245 error ("Edge from %d to %d should be marked irreducible.",
1246 e->src->index, e->dest->index);
1247 err = 1;
1249 else if (!(e->flags & EDGE_IRREDUCIBLE_LOOP)
1250 && (e->flags & (EDGE_ALL_FLAGS + 1)))
1252 error ("Edge from %d to %d should not be marked irreducible.",
1253 e->src->index, e->dest->index);
1254 err = 1;
1256 e->flags &= ~(EDGE_ALL_FLAGS + 1);
1259 free (irreds);
1262 if (err)
1263 abort ();
1266 /* Returns latch edge of LOOP. */
1267 edge
1268 loop_latch_edge (const struct loop *loop)
1270 edge e;
1272 for (e = loop->header->pred; e->src != loop->latch; e = e->pred_next)
1273 continue;
1275 return e;
1278 /* Returns preheader edge of LOOP. */
1279 edge
1280 loop_preheader_edge (const struct loop *loop)
1282 edge e;
1284 for (e = loop->header->pred; e->src == loop->latch; e = e->pred_next)
1285 continue;
1287 return e;