1 /* Natural loop discovery code for GNU compiler.
2 Copyright (C) 2000, 2001 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
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
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
23 #include "coretypes.h"
26 #include "hard-reg-set.h"
27 #include "basic-block.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
PARAMS ((const struct loops
*,
38 static void flow_loop_entry_edges_find
PARAMS ((struct loop
*));
39 static void flow_loop_exit_edges_find
PARAMS ((struct loop
*));
40 static int flow_loop_nodes_find
PARAMS ((basic_block
, struct loop
*));
41 static void flow_loop_pre_header_scan
PARAMS ((struct loop
*));
42 static basic_block flow_loop_pre_header_find
PARAMS ((basic_block
,
44 static int flow_loop_level_compute
PARAMS ((struct loop
*));
45 static int flow_loops_level_compute
PARAMS ((struct loops
*));
46 static void establish_preds
PARAMS ((struct loop
*));
47 static basic_block make_forwarder_block
PARAMS ((basic_block
, int, int,
49 static void canonicalize_loop_headers
PARAMS ((void));
50 static bool glb_enum_p
PARAMS ((basic_block
, void *));
51 static void redirect_edge_with_latch_update
PARAMS ((edge
, basic_block
));
53 /* Dump loop related CFG information. */
56 flow_loops_cfg_dump (loops
, file
)
57 const struct loops
*loops
;
63 if (! loops
->num
|| ! file
|| ! loops
->cfg
.dom
)
70 fprintf (file
, ";; %d succs { ", bb
->index
);
71 for (succ
= bb
->succ
; succ
; succ
= succ
->succ_next
)
72 fprintf (file
, "%d ", succ
->dest
->index
);
73 fprintf (file
, "}\n");
76 /* Dump the DFS node order. */
77 if (loops
->cfg
.dfs_order
)
79 fputs (";; DFS order: ", file
);
80 for (i
= 0; i
< n_basic_blocks
; i
++)
81 fprintf (file
, "%d ", loops
->cfg
.dfs_order
[i
]);
86 /* Dump the reverse completion node order. */
87 if (loops
->cfg
.rc_order
)
89 fputs (";; RC order: ", file
);
90 for (i
= 0; i
< n_basic_blocks
; i
++)
91 fprintf (file
, "%d ", loops
->cfg
.rc_order
[i
]);
97 /* Return nonzero if the nodes of LOOP are a subset of OUTER. */
100 flow_loop_nested_p (outer
, loop
)
101 const struct loop
*outer
;
102 const struct loop
*loop
;
104 return loop
->depth
> outer
->depth
105 && loop
->pred
[outer
->depth
] == outer
;
108 /* Dump the loop information specified by LOOP to the stream FILE
109 using auxiliary dump callback function LOOP_DUMP_AUX if non null. */
112 flow_loop_dump (loop
, file
, loop_dump_aux
, verbose
)
113 const struct loop
*loop
;
115 void (*loop_dump_aux
) PARAMS((const struct loop
*, FILE *, int));
121 if (! loop
|| ! loop
->header
)
124 fprintf (file
, ";;\n;; Loop %d:%s\n", loop
->num
,
125 loop
->invalid
? " invalid" : "");
127 fprintf (file
, ";; header %d, latch %d, pre-header %d\n",
128 loop
->header
->index
, loop
->latch
->index
,
129 loop
->pre_header
? loop
->pre_header
->index
: -1);
130 fprintf (file
, ";; depth %d, level %d, outer %ld\n",
131 loop
->depth
, loop
->level
,
132 (long) (loop
->outer
? loop
->outer
->num
: -1));
134 if (loop
->pre_header_edges
)
135 flow_edge_list_print (";; pre-header edges", loop
->pre_header_edges
,
136 loop
->num_pre_header_edges
, file
);
138 flow_edge_list_print (";; entry edges", loop
->entry_edges
,
139 loop
->num_entries
, file
);
140 fprintf (file
, ";; nodes:");
141 bbs
= get_loop_body (loop
);
142 for (i
= 0; i
< loop
->num_nodes
; i
++)
143 fprintf (file
, " %d", bbs
[i
]->index
);
145 fprintf (file
, "\n");
146 flow_edge_list_print (";; exit edges", loop
->exit_edges
,
147 loop
->num_exits
, file
);
150 loop_dump_aux (loop
, file
, verbose
);
153 /* Dump the loop information specified by LOOPS to the stream FILE,
154 using auxiliary dump callback function LOOP_DUMP_AUX if non null. */
157 flow_loops_dump (loops
, file
, loop_dump_aux
, verbose
)
158 const struct loops
*loops
;
160 void (*loop_dump_aux
) PARAMS((const struct loop
*, FILE *, int));
166 num_loops
= loops
->num
;
167 if (! num_loops
|| ! file
)
170 fprintf (file
, ";; %d loops found, %d levels\n",
171 num_loops
, loops
->levels
);
173 for (i
= 0; i
< num_loops
; i
++)
175 struct loop
*loop
= loops
->parray
[i
];
180 flow_loop_dump (loop
, file
, loop_dump_aux
, verbose
);
184 flow_loops_cfg_dump (loops
, file
);
187 /* Free data allocated for LOOP. */
189 flow_loop_free (loop
)
192 if (loop
->pre_header_edges
)
193 free (loop
->pre_header_edges
);
194 if (loop
->entry_edges
)
195 free (loop
->entry_edges
);
196 if (loop
->exit_edges
)
197 free (loop
->exit_edges
);
203 /* Free all the memory allocated for LOOPS. */
206 flow_loops_free (loops
)
216 /* Free the loop descriptors. */
217 for (i
= 0; i
< loops
->num
; i
++)
219 struct loop
*loop
= loops
->parray
[i
];
224 flow_loop_free (loop
);
227 free (loops
->parray
);
228 loops
->parray
= NULL
;
231 free_dominance_info (loops
->cfg
.dom
);
233 if (loops
->cfg
.dfs_order
)
234 free (loops
->cfg
.dfs_order
);
235 if (loops
->cfg
.rc_order
)
236 free (loops
->cfg
.rc_order
);
241 /* Find the entry edges into the LOOP. */
244 flow_loop_entry_edges_find (loop
)
251 for (e
= loop
->header
->pred
; e
; e
= e
->pred_next
)
253 if (flow_loop_outside_edge_p (loop
, e
))
260 loop
->entry_edges
= (edge
*) xmalloc (num_entries
* sizeof (edge
*));
263 for (e
= loop
->header
->pred
; e
; e
= e
->pred_next
)
265 if (flow_loop_outside_edge_p (loop
, e
))
266 loop
->entry_edges
[num_entries
++] = e
;
269 loop
->num_entries
= num_entries
;
272 /* Find the exit edges from the LOOP. */
275 flow_loop_exit_edges_find (loop
)
279 basic_block node
, *bbs
;
280 unsigned num_exits
, i
;
282 loop
->exit_edges
= NULL
;
285 /* Check all nodes within the loop to see if there are any
286 successors not in the loop. Note that a node may have multiple
289 bbs
= get_loop_body (loop
);
290 for (i
= 0; i
< loop
->num_nodes
; i
++)
293 for (e
= node
->succ
; e
; e
= e
->succ_next
)
295 basic_block dest
= e
->dest
;
297 if (!flow_bb_inside_loop_p (loop
, dest
))
308 loop
->exit_edges
= (edge
*) xmalloc (num_exits
* sizeof (edge
*));
310 /* Store all exiting edges into an array. */
312 for (i
= 0; i
< loop
->num_nodes
; i
++)
315 for (e
= node
->succ
; e
; e
= e
->succ_next
)
317 basic_block dest
= e
->dest
;
319 if (!flow_bb_inside_loop_p (loop
, dest
))
320 loop
->exit_edges
[num_exits
++] = e
;
324 loop
->num_exits
= num_exits
;
327 /* Find the nodes contained within the LOOP with header HEADER.
328 Return the number of nodes within the loop. */
331 flow_loop_nodes_find (header
, loop
)
339 header
->loop_father
= loop
;
340 header
->loop_depth
= loop
->depth
;
342 if (loop
->latch
->loop_father
!= loop
)
344 stack
= (basic_block
*) xmalloc (n_basic_blocks
* sizeof (basic_block
));
347 stack
[sp
++] = loop
->latch
;
348 loop
->latch
->loop_father
= loop
;
349 loop
->latch
->loop_depth
= loop
->depth
;
358 for (e
= node
->pred
; e
; e
= e
->pred_next
)
360 basic_block ancestor
= e
->src
;
362 if (ancestor
!= ENTRY_BLOCK_PTR
363 && ancestor
->loop_father
!= loop
)
365 ancestor
->loop_father
= loop
;
366 ancestor
->loop_depth
= loop
->depth
;
368 stack
[sp
++] = ancestor
;
377 /* Find the root node of the loop pre-header extended basic block and
378 the edges along the trace from the root node to the loop header. */
381 flow_loop_pre_header_scan (loop
)
388 loop
->num_pre_header_edges
= 0;
389 if (loop
->num_entries
!= 1)
392 ebb
= loop
->entry_edges
[0]->src
;
393 if (ebb
== ENTRY_BLOCK_PTR
)
396 /* Count number of edges along trace from loop header to
397 root of pre-header extended basic block. Usually this is
398 only one or two edges. */
399 for (num
= 1; ebb
->pred
->src
!= ENTRY_BLOCK_PTR
&& ! ebb
->pred
->pred_next
;
401 ebb
= ebb
->pred
->src
;
403 loop
->pre_header_edges
= (edge
*) xmalloc (num
* sizeof (edge
));
404 loop
->num_pre_header_edges
= num
;
406 /* Store edges in order that they are followed. The source of the first edge
407 is the root node of the pre-header extended basic block and the
408 destination of the last last edge is the loop header. */
409 for (e
= loop
->entry_edges
[0]; num
; e
= e
->src
->pred
)
410 loop
->pre_header_edges
[--num
] = e
;
413 /* Return the block for the pre-header of the loop with header
414 HEADER where DOM specifies the dominator information. Return NULL if
415 there is no pre-header. */
418 flow_loop_pre_header_find (header
, dom
)
422 basic_block pre_header
;
425 /* If block p is a predecessor of the header and is the only block
426 that the header does not dominate, then it is the pre-header. */
428 for (e
= header
->pred
; e
; e
= e
->pred_next
)
430 basic_block node
= e
->src
;
432 if (node
!= ENTRY_BLOCK_PTR
433 && ! dominated_by_p (dom
, node
, header
))
435 if (pre_header
== NULL
)
439 /* There are multiple edges into the header from outside
440 the loop so there is no pre-header block. */
451 establish_preds (loop
)
454 struct loop
*ploop
, *father
= loop
->outer
;
456 loop
->depth
= father
->depth
+ 1;
459 loop
->pred
= xmalloc (sizeof (struct loop
*) * loop
->depth
);
460 memcpy (loop
->pred
, father
->pred
, sizeof (struct loop
*) * father
->depth
);
461 loop
->pred
[father
->depth
] = father
;
463 for (ploop
= loop
->inner
; ploop
; ploop
= ploop
->next
)
464 establish_preds (ploop
);
467 /* Add LOOP to the loop hierarchy tree where FATHER is father of the
468 added loop. If LOOP has some children, take care of that their
469 pred field will be initialized correctly. */
472 flow_loop_tree_node_add (father
, loop
)
476 loop
->next
= father
->inner
;
477 father
->inner
= loop
;
478 loop
->outer
= father
;
480 establish_preds (loop
);
483 /* Remove LOOP from the loop hierarchy tree. */
486 flow_loop_tree_node_remove (loop
)
489 struct loop
*prev
, *father
;
491 father
= loop
->outer
;
494 /* Remove loop from the list of sons. */
495 if (father
->inner
== loop
)
496 father
->inner
= loop
->next
;
499 for (prev
= father
->inner
; prev
->next
!= loop
; prev
= prev
->next
);
500 prev
->next
= loop
->next
;
508 /* Helper function to compute loop nesting depth and enclosed loop level
509 for the natural loop specified by LOOP. Returns the loop level. */
512 flow_loop_level_compute (loop
)
521 /* Traverse loop tree assigning depth and computing level as the
522 maximum level of all the inner loops of this loop. The loop
523 level is equivalent to the height of the loop in the loop tree
524 and corresponds to the number of enclosed loop levels (including
526 for (inner
= loop
->inner
; inner
; inner
= inner
->next
)
528 int ilevel
= flow_loop_level_compute (inner
) + 1;
538 /* Compute the loop nesting depth and enclosed loop level for the loop
539 hierarchy tree specified by LOOPS. Return the maximum enclosed loop
543 flow_loops_level_compute (loops
)
546 return flow_loop_level_compute (loops
->tree_root
);
549 /* Scan a single natural loop specified by LOOP collecting information
550 about it specified by FLAGS. */
553 flow_loop_scan (loops
, loop
, flags
)
558 if (flags
& LOOP_ENTRY_EDGES
)
560 /* Find edges which enter the loop header.
561 Note that the entry edges should only
562 enter the header of a natural loop. */
563 flow_loop_entry_edges_find (loop
);
566 if (flags
& LOOP_EXIT_EDGES
)
568 /* Find edges which exit the loop. */
569 flow_loop_exit_edges_find (loop
);
572 if (flags
& LOOP_PRE_HEADER
)
574 /* Look to see if the loop has a pre-header node. */
576 = flow_loop_pre_header_find (loop
->header
, loops
->cfg
.dom
);
578 /* Find the blocks within the extended basic block of
579 the loop pre-header. */
580 flow_loop_pre_header_scan (loop
);
586 #define HEADER_BLOCK(B) (* (int *) (B)->aux)
587 #define LATCH_EDGE(E) (*(int *) (E)->aux)
589 /* Redirect edge and update latch and header info. */
591 redirect_edge_with_latch_update (e
, to
)
597 jump
= redirect_edge_and_branch_force (e
, to
);
600 alloc_aux_for_block (jump
, sizeof (int));
601 HEADER_BLOCK (jump
) = 0;
602 alloc_aux_for_edge (jump
->pred
, sizeof (int));
603 LATCH_EDGE (jump
->succ
) = LATCH_EDGE (e
);
604 LATCH_EDGE (jump
->pred
) = 0;
608 /* Split BB into entry part and rest; if REDIRECT_LATCH, redirect edges
609 marked as latch into entry part, analogically for REDIRECT_NONLATCH.
610 In both of these cases, ignore edge EXCEPT. If CONN_LATCH, set edge
611 between created entry part and BB as latch one. Return created entry
615 make_forwarder_block (bb
, redirect_latch
, redirect_nonlatch
, except
,
619 int redirect_nonlatch
;
623 edge e
, next_e
, fallthru
;
627 insn
= PREV_INSN (first_insn_after_basic_block_note (bb
));
629 /* For empty block split_block will return NULL. */
631 emit_note_after (NOTE_INSN_DELETED
, insn
);
633 fallthru
= split_block (bb
, insn
);
634 dummy
= fallthru
->src
;
637 bb
->aux
= xmalloc (sizeof (int));
638 HEADER_BLOCK (dummy
) = 0;
639 HEADER_BLOCK (bb
) = 1;
641 /* Redirect back edges we want to keep. */
642 for (e
= dummy
->pred
; e
; e
= next_e
)
644 next_e
= e
->pred_next
;
646 || !((redirect_latch
&& LATCH_EDGE (e
))
647 || (redirect_nonlatch
&& !LATCH_EDGE (e
))))
649 dummy
->frequency
-= EDGE_FREQUENCY (e
);
650 dummy
->count
-= e
->count
;
651 if (dummy
->frequency
< 0)
652 dummy
->frequency
= 0;
653 if (dummy
->count
< 0)
655 redirect_edge_with_latch_update (e
, bb
);
659 alloc_aux_for_edge (fallthru
, sizeof (int));
660 LATCH_EDGE (fallthru
) = conn_latch
;
665 /* Takes care of merging natural loops with shared headers. */
667 canonicalize_loop_headers ()
673 /* Compute the dominators. */
674 dom
= calculate_dominance_info (CDI_DOMINATORS
);
676 alloc_aux_for_blocks (sizeof (int));
677 alloc_aux_for_edges (sizeof (int));
679 /* Split blocks so that each loop has only single latch. */
683 int have_abnormal_edge
= 0;
685 for (e
= header
->pred
; e
; e
= e
->pred_next
)
687 basic_block latch
= e
->src
;
689 if (e
->flags
& EDGE_ABNORMAL
)
690 have_abnormal_edge
= 1;
692 if (latch
!= ENTRY_BLOCK_PTR
693 && dominated_by_p (dom
, latch
, header
))
699 if (have_abnormal_edge
)
700 HEADER_BLOCK (header
) = 0;
702 HEADER_BLOCK (header
) = num_latches
;
705 if (HEADER_BLOCK (ENTRY_BLOCK_PTR
->succ
->dest
))
709 /* We could not redirect edges freely here. On the other hand,
710 we can simply split the edge from entry block. */
711 bb
= split_edge (ENTRY_BLOCK_PTR
->succ
);
713 alloc_aux_for_edge (bb
->succ
, sizeof (int));
714 LATCH_EDGE (bb
->succ
) = 0;
715 alloc_aux_for_block (bb
, sizeof (int));
716 HEADER_BLOCK (bb
) = 0;
723 int max_freq
, is_heavy
;
726 if (!HEADER_BLOCK (header
))
729 num_latch
= HEADER_BLOCK (header
);
731 want_join_latch
= (num_latch
> 1);
733 if (!want_join_latch
)
736 /* Find a heavy edge. */
740 for (e
= header
->pred
; e
; e
= e
->pred_next
)
741 if (LATCH_EDGE (e
) &&
742 EDGE_FREQUENCY (e
) > max_freq
)
743 max_freq
= EDGE_FREQUENCY (e
);
744 for (e
= header
->pred
; e
; e
= e
->pred_next
)
745 if (LATCH_EDGE (e
) &&
746 EDGE_FREQUENCY (e
) >= max_freq
/ HEAVY_EDGE_RATIO
)
759 basic_block new_header
=
760 make_forwarder_block (header
, true, true, heavy
, 0);
762 make_forwarder_block (new_header
, true, false, NULL
, 1);
765 make_forwarder_block (header
, true, false, NULL
, 1);
768 free_aux_for_blocks ();
769 free_aux_for_edges ();
770 free_dominance_info (dom
);
773 /* Find all the natural loops in the function and save in LOOPS structure and
774 recalculate loop_depth information in basic block structures. FLAGS
775 controls which loop information is collected. Return the number of natural
779 flow_loops_find (loops
, flags
)
794 /* This function cannot be repeatedly called with different
795 flags to build up the loop information. The loop tree
796 must always be built if this function is called. */
797 if (! (flags
& LOOP_TREE
))
800 memset (loops
, 0, sizeof *loops
);
802 /* Taking care of this degenerate case makes the rest of
803 this code simpler. */
804 if (n_basic_blocks
== 0)
810 /* Join loops with shared headers. */
811 canonicalize_loop_headers ();
813 /* Compute the dominators. */
814 dom
= loops
->cfg
.dom
= calculate_dominance_info (CDI_DOMINATORS
);
816 /* Count the number of loop headers. This should be the
817 same as the number of natural loops. */
818 headers
= sbitmap_alloc (last_basic_block
);
819 sbitmap_zero (headers
);
824 int more_latches
= 0;
826 header
->loop_depth
= 0;
828 /* If we have an abnormal predecessor, do not consider the
829 loop (not worth the problems). */
830 for (e
= header
->pred
; e
; e
= e
->pred_next
)
831 if (e
->flags
& EDGE_ABNORMAL
)
836 for (e
= header
->pred
; e
; e
= e
->pred_next
)
838 basic_block latch
= e
->src
;
840 if (e
->flags
& EDGE_ABNORMAL
)
843 /* Look for back edges where a predecessor is dominated
844 by this block. A natural loop has a single entry
845 node (header) that dominates all the nodes in the
846 loop. It also has single back edge to the header
847 from a latch node. */
848 if (latch
!= ENTRY_BLOCK_PTR
&& dominated_by_p (dom
, latch
, header
))
850 /* Shared headers should be eliminated by now. */
854 SET_BIT (headers
, header
->index
);
860 /* Allocate loop structures. */
861 loops
->parray
= (struct loop
**) xcalloc (num_loops
+ 1, sizeof (struct loop
*));
863 /* Dummy loop containing whole function. */
864 loops
->parray
[0] = xcalloc (1, sizeof (struct loop
));
865 loops
->parray
[0]->next
= NULL
;
866 loops
->parray
[0]->inner
= NULL
;
867 loops
->parray
[0]->outer
= NULL
;
868 loops
->parray
[0]->depth
= 0;
869 loops
->parray
[0]->pred
= NULL
;
870 loops
->parray
[0]->num_nodes
= n_basic_blocks
+ 2;
871 loops
->parray
[0]->latch
= EXIT_BLOCK_PTR
;
872 loops
->parray
[0]->header
= ENTRY_BLOCK_PTR
;
873 ENTRY_BLOCK_PTR
->loop_father
= loops
->parray
[0];
874 EXIT_BLOCK_PTR
->loop_father
= loops
->parray
[0];
876 loops
->tree_root
= loops
->parray
[0];
878 /* Find and record information about all the natural loops
882 bb
->loop_father
= loops
->tree_root
;
886 /* Compute depth first search order of the CFG so that outer
887 natural loops will be found before inner natural loops. */
888 dfs_order
= (int *) xmalloc (n_basic_blocks
* sizeof (int));
889 rc_order
= (int *) xmalloc (n_basic_blocks
* sizeof (int));
890 flow_depth_first_order_compute (dfs_order
, rc_order
);
892 /* Save CFG derived information to avoid recomputing it. */
893 loops
->cfg
.dom
= dom
;
894 loops
->cfg
.dfs_order
= dfs_order
;
895 loops
->cfg
.rc_order
= rc_order
;
899 for (b
= 0; b
< n_basic_blocks
; b
++)
903 /* Search the nodes of the CFG in reverse completion order
904 so that we can find outer loops first. */
905 if (!TEST_BIT (headers
, rc_order
[b
]))
908 header
= BASIC_BLOCK (rc_order
[b
]);
910 loop
= loops
->parray
[num_loops
] = xcalloc (1, sizeof (struct loop
));
912 loop
->header
= header
;
913 loop
->num
= num_loops
;
916 /* Look for the latch for this header block. */
917 for (e
= header
->pred
; e
; e
= e
->pred_next
)
919 basic_block latch
= e
->src
;
921 if (latch
!= ENTRY_BLOCK_PTR
922 && dominated_by_p (dom
, latch
, header
))
929 flow_loop_tree_node_add (header
->loop_father
, loop
);
930 loop
->num_nodes
= flow_loop_nodes_find (loop
->header
, loop
);
933 sbitmap_free (headers
);
935 /* Assign the loop nesting depth and enclosed loop level for each
937 loops
->levels
= flow_loops_level_compute (loops
);
939 /* Scan the loops. */
940 for (i
= 1; i
< num_loops
; i
++)
941 flow_loop_scan (loops
, loops
->parray
[i
], flags
);
943 loops
->num
= num_loops
;
947 loops
->cfg
.dom
= NULL
;
948 free_dominance_info (dom
);
952 #ifdef ENABLE_CHECKING
954 verify_loop_structure (loops
);
960 /* Update the information regarding the loops in the CFG
961 specified by LOOPS. */
964 flow_loops_update (loops
, flags
)
968 /* One day we may want to update the current loop data. For now
969 throw away the old stuff and rebuild what we need. */
971 flow_loops_free (loops
);
973 return flow_loops_find (loops
, flags
);
976 /* Return nonzero if basic block BB belongs to LOOP. */
978 flow_bb_inside_loop_p (loop
, bb
)
979 const struct loop
*loop
;
980 const basic_block bb
;
982 struct loop
*source_loop
;
984 if (bb
== ENTRY_BLOCK_PTR
|| bb
== EXIT_BLOCK_PTR
)
987 source_loop
= bb
->loop_father
;
988 return loop
== source_loop
|| flow_loop_nested_p (loop
, source_loop
);
991 /* Return nonzero if edge E enters header of LOOP from outside of LOOP. */
994 flow_loop_outside_edge_p (loop
, e
)
995 const struct loop
*loop
;
998 if (e
->dest
!= loop
->header
)
1000 return !flow_bb_inside_loop_p (loop
, e
->src
);
1003 /* Enumeration predicate for get_loop_body. */
1005 glb_enum_p (bb
, glb_header
)
1009 return bb
!= (basic_block
) glb_header
;
1012 /* Gets basic blocks of a loop. */
1014 get_loop_body (loop
)
1015 const struct loop
*loop
;
1017 basic_block
*tovisit
, bb
;
1020 if (!loop
->num_nodes
)
1023 tovisit
= xcalloc (loop
->num_nodes
, sizeof (basic_block
));
1024 tovisit
[tv
++] = loop
->header
;
1026 if (loop
->latch
== EXIT_BLOCK_PTR
)
1028 /* There may be blocks unreachable from EXIT_BLOCK. */
1029 if (loop
->num_nodes
!= (unsigned) n_basic_blocks
+ 2)
1033 tovisit
[tv
++] = EXIT_BLOCK_PTR
;
1035 else if (loop
->latch
!= loop
->header
)
1037 tv
= dfs_enumerate_from (loop
->latch
, 1, glb_enum_p
,
1038 tovisit
+ 1, loop
->num_nodes
- 1,
1042 if (tv
!= loop
->num_nodes
)
1047 /* Gets exit edges of a LOOP, returning their number in N_EDGES. */
1049 get_loop_exit_edges (loop
, n_edges
)
1050 const struct loop
*loop
;
1057 if (loop
->latch
== EXIT_BLOCK_PTR
)
1060 body
= get_loop_body (loop
);
1062 for (i
= 0; i
< loop
->num_nodes
; i
++)
1063 for (e
= body
[i
]->succ
; e
; e
= e
->succ_next
)
1064 if (!flow_bb_inside_loop_p (loop
, e
->dest
))
1066 edges
= xmalloc (n
* sizeof (edge
));
1069 for (i
= 0; i
< loop
->num_nodes
; i
++)
1070 for (e
= body
[i
]->succ
; e
; e
= e
->succ_next
)
1071 if (!flow_bb_inside_loop_p (loop
, e
->dest
))
1078 /* Adds basic block BB to LOOP. */
1080 add_bb_to_loop (bb
, loop
)
1086 bb
->loop_father
= loop
;
1087 bb
->loop_depth
= loop
->depth
;
1089 for (i
= 0; i
< loop
->depth
; i
++)
1090 loop
->pred
[i
]->num_nodes
++;
1093 /* Remove basic block BB from loops. */
1095 remove_bb_from_loops (bb
)
1099 struct loop
*loop
= bb
->loop_father
;
1102 for (i
= 0; i
< loop
->depth
; i
++)
1103 loop
->pred
[i
]->num_nodes
--;
1104 bb
->loop_father
= NULL
;
1108 /* Finds nearest common ancestor in loop tree for given loops. */
1110 find_common_loop (loop_s
, loop_d
)
1111 struct loop
*loop_s
;
1112 struct loop
*loop_d
;
1114 if (!loop_s
) return loop_d
;
1115 if (!loop_d
) return loop_s
;
1117 if (loop_s
->depth
< loop_d
->depth
)
1118 loop_d
= loop_d
->pred
[loop_s
->depth
];
1119 else if (loop_s
->depth
> loop_d
->depth
)
1120 loop_s
= loop_s
->pred
[loop_d
->depth
];
1122 while (loop_s
!= loop_d
)
1124 loop_s
= loop_s
->outer
;
1125 loop_d
= loop_d
->outer
;
1130 /* Cancels the LOOP; it must be innermost one. */
1132 cancel_loop (loops
, loop
)
1133 struct loops
*loops
;
1142 /* Move blocks up one level (they should be removed as soon as possible). */
1143 bbs
= get_loop_body (loop
);
1144 for (i
= 0; i
< loop
->num_nodes
; i
++)
1145 bbs
[i
]->loop_father
= loop
->outer
;
1147 /* Remove the loop from structure. */
1148 flow_loop_tree_node_remove (loop
);
1150 /* Remove loop from loops array. */
1151 loops
->parray
[loop
->num
] = NULL
;
1153 /* Free loop data. */
1154 flow_loop_free (loop
);
1157 /* Cancels LOOP and all its subloops. */
1159 cancel_loop_tree (loops
, loop
)
1160 struct loops
*loops
;
1164 cancel_loop_tree (loops
, loop
->inner
);
1165 cancel_loop (loops
, loop
);
1168 /* Checks that LOOPS are allright:
1169 -- sizes of loops are allright
1170 -- results of get_loop_body really belong to the loop
1171 -- loop header have just single entry edge and single latch edge
1172 -- loop latches have only single successor that is header of their loop
1173 -- irreducible loops are correctly marked
1176 verify_loop_structure (loops
)
1177 struct loops
*loops
;
1179 unsigned *sizes
, i
, j
;
1181 basic_block
*bbs
, bb
;
1187 sizes
= xcalloc (loops
->num
, sizeof (int));
1191 for (loop
= bb
->loop_father
; loop
; loop
= loop
->outer
)
1194 for (i
= 0; i
< loops
->num
; i
++)
1196 if (!loops
->parray
[i
])
1199 if (loops
->parray
[i
]->num_nodes
!= sizes
[i
])
1201 error ("Size of loop %d should be %d, not %d.",
1202 i
, sizes
[i
], loops
->parray
[i
]->num_nodes
);
1209 /* Check get_loop_body. */
1210 for (i
= 1; i
< loops
->num
; i
++)
1212 loop
= loops
->parray
[i
];
1215 bbs
= get_loop_body (loop
);
1217 for (j
= 0; j
< loop
->num_nodes
; j
++)
1218 if (!flow_bb_inside_loop_p (loop
, bbs
[j
]))
1220 error ("Bb %d do not belong to loop %d.",
1227 /* Check headers and latches. */
1228 for (i
= 1; i
< loops
->num
; i
++)
1230 loop
= loops
->parray
[i
];
1234 if ((loops
->state
& LOOPS_HAVE_PREHEADERS
)
1235 && (!loop
->header
->pred
->pred_next
1236 || loop
->header
->pred
->pred_next
->pred_next
))
1238 error ("Loop %d's header does not have exactly 2 entries.", i
);
1241 if (loops
->state
& LOOPS_HAVE_SIMPLE_LATCHES
)
1243 if (!loop
->latch
->succ
1244 || loop
->latch
->succ
->succ_next
)
1246 error ("Loop %d's latch does not have exactly 1 successor.", i
);
1249 if (loop
->latch
->succ
->dest
!= loop
->header
)
1251 error ("Loop %d's latch does not have header as successor.", i
);
1254 if (loop
->latch
->loop_father
!= loop
)
1256 error ("Loop %d's latch does not belong directly to it.", i
);
1260 if (loop
->header
->loop_father
!= loop
)
1262 error ("Loop %d's header does not belong directly to it.", i
);
1265 if ((loops
->state
& LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS
)
1266 && (loop_latch_edge (loop
)->flags
& EDGE_IRREDUCIBLE_LOOP
))
1268 error ("Loop %d's latch is marked as part of irreducible region.", i
);
1273 /* Check irreducible loops. */
1274 if (loops
->state
& LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS
)
1276 /* Record old info. */
1277 irreds
= sbitmap_alloc (last_basic_block
);
1280 if (bb
->flags
& BB_IRREDUCIBLE_LOOP
)
1281 SET_BIT (irreds
, bb
->index
);
1283 RESET_BIT (irreds
, bb
->index
);
1284 for (e
= bb
->succ
; e
; e
= e
->succ_next
)
1285 if (e
->flags
& EDGE_IRREDUCIBLE_LOOP
)
1286 e
->flags
|= EDGE_ALL_FLAGS
+ 1;
1290 mark_irreducible_loops (loops
);
1295 if ((bb
->flags
& BB_IRREDUCIBLE_LOOP
)
1296 && !TEST_BIT (irreds
, bb
->index
))
1298 error ("Basic block %d should be marked irreducible.", bb
->index
);
1301 else if (!(bb
->flags
& BB_IRREDUCIBLE_LOOP
)
1302 && TEST_BIT (irreds
, bb
->index
))
1304 error ("Basic block %d should not be marked irreducible.", bb
->index
);
1307 for (e
= bb
->succ
; e
; e
= e
->succ_next
)
1309 if ((e
->flags
& EDGE_IRREDUCIBLE_LOOP
)
1310 && !(e
->flags
& (EDGE_ALL_FLAGS
+ 1)))
1312 error ("Edge from %d to %d should be marked irreducible.",
1313 e
->src
->index
, e
->dest
->index
);
1316 else if (!(e
->flags
& EDGE_IRREDUCIBLE_LOOP
)
1317 && (e
->flags
& (EDGE_ALL_FLAGS
+ 1)))
1319 error ("Edge from %d to %d should not be marked irreducible.",
1320 e
->src
->index
, e
->dest
->index
);
1323 e
->flags
&= ~(EDGE_ALL_FLAGS
+ 1);
1333 /* Returns latch edge of LOOP. */
1335 loop_latch_edge (loop
)
1336 const struct loop
*loop
;
1340 for (e
= loop
->header
->pred
; e
->src
!= loop
->latch
; e
= e
->pred_next
)
1346 /* Returns preheader edge of LOOP. */
1348 loop_preheader_edge (loop
)
1349 const struct loop
*loop
;
1353 for (e
= loop
->header
->pred
; e
->src
== loop
->latch
; e
= e
->pred_next
)