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 basic_block make_forwarder_block
PARAMS ((basic_block
, int, int,
48 static void canonicalize_loop_headers
PARAMS ((void));
49 static bool glb_enum_p
PARAMS ((basic_block
, void *));
50 static void redirect_edge_with_latch_update
PARAMS ((edge
, basic_block
));
51 static void flow_loop_free
PARAMS ((struct loop
*));
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. */
450 /* Add LOOP to the loop hierarchy tree where FATHER is father of the
454 flow_loop_tree_node_add (father
, loop
)
458 loop
->next
= father
->inner
;
459 father
->inner
= loop
;
460 loop
->outer
= father
;
462 loop
->depth
= father
->depth
+ 1;
463 loop
->pred
= xmalloc (sizeof (struct loop
*) * loop
->depth
);
464 memcpy (loop
->pred
, father
->pred
, sizeof (struct loop
*) * father
->depth
);
465 loop
->pred
[father
->depth
] = father
;
468 /* Remove LOOP from the loop hierarchy tree. */
471 flow_loop_tree_node_remove (loop
)
474 struct loop
*prev
, *father
;
476 father
= loop
->outer
;
479 /* Remove loop from the list of sons. */
480 if (father
->inner
== loop
)
481 father
->inner
= loop
->next
;
484 for (prev
= father
->inner
; prev
->next
!= loop
; prev
= prev
->next
);
485 prev
->next
= loop
->next
;
493 /* Helper function to compute loop nesting depth and enclosed loop level
494 for the natural loop specified by LOOP. Returns the loop level. */
497 flow_loop_level_compute (loop
)
506 /* Traverse loop tree assigning depth and computing level as the
507 maximum level of all the inner loops of this loop. The loop
508 level is equivalent to the height of the loop in the loop tree
509 and corresponds to the number of enclosed loop levels (including
511 for (inner
= loop
->inner
; inner
; inner
= inner
->next
)
513 int ilevel
= flow_loop_level_compute (inner
) + 1;
523 /* Compute the loop nesting depth and enclosed loop level for the loop
524 hierarchy tree specified by LOOPS. Return the maximum enclosed loop
528 flow_loops_level_compute (loops
)
531 return flow_loop_level_compute (loops
->tree_root
);
534 /* Scan a single natural loop specified by LOOP collecting information
535 about it specified by FLAGS. */
538 flow_loop_scan (loops
, loop
, flags
)
543 if (flags
& LOOP_ENTRY_EDGES
)
545 /* Find edges which enter the loop header.
546 Note that the entry edges should only
547 enter the header of a natural loop. */
548 flow_loop_entry_edges_find (loop
);
551 if (flags
& LOOP_EXIT_EDGES
)
553 /* Find edges which exit the loop. */
554 flow_loop_exit_edges_find (loop
);
557 if (flags
& LOOP_PRE_HEADER
)
559 /* Look to see if the loop has a pre-header node. */
561 = flow_loop_pre_header_find (loop
->header
, loops
->cfg
.dom
);
563 /* Find the blocks within the extended basic block of
564 the loop pre-header. */
565 flow_loop_pre_header_scan (loop
);
571 #define HEADER_BLOCK(B) (* (int *) (B)->aux)
572 #define LATCH_EDGE(E) (*(int *) (E)->aux)
574 /* Redirect edge and update latch and header info. */
576 redirect_edge_with_latch_update (e
, to
)
582 jump
= redirect_edge_and_branch_force (e
, to
);
585 alloc_aux_for_block (jump
, sizeof (int));
586 HEADER_BLOCK (jump
) = 0;
587 alloc_aux_for_edge (jump
->pred
, sizeof (int));
588 LATCH_EDGE (jump
->succ
) = LATCH_EDGE (e
);
589 LATCH_EDGE (jump
->pred
) = 0;
593 /* Split BB into entry part and rest; if REDIRECT_LATCH, redirect edges
594 marked as latch into entry part, analogically for REDIRECT_NONLATCH.
595 In both of these cases, ignore edge EXCEPT. If CONN_LATCH, set edge
596 between created entry part and BB as latch one. Return created entry
600 make_forwarder_block (bb
, redirect_latch
, redirect_nonlatch
, except
,
604 int redirect_nonlatch
;
608 edge e
, next_e
, fallthru
;
612 insn
= PREV_INSN (first_insn_after_basic_block_note (bb
));
614 /* For empty block split_block will return NULL. */
616 emit_note_after (NOTE_INSN_DELETED
, insn
);
618 fallthru
= split_block (bb
, insn
);
619 dummy
= fallthru
->src
;
622 bb
->aux
= xmalloc (sizeof (int));
623 HEADER_BLOCK (dummy
) = 0;
624 HEADER_BLOCK (bb
) = 1;
626 /* Redirect back edges we want to keep. */
627 for (e
= dummy
->pred
; e
; e
= next_e
)
629 next_e
= e
->pred_next
;
631 || !((redirect_latch
&& LATCH_EDGE (e
))
632 || (redirect_nonlatch
&& !LATCH_EDGE (e
))))
634 dummy
->frequency
-= EDGE_FREQUENCY (e
);
635 dummy
->count
-= e
->count
;
636 if (dummy
->frequency
< 0)
637 dummy
->frequency
= 0;
638 if (dummy
->count
< 0)
640 redirect_edge_with_latch_update (e
, bb
);
644 alloc_aux_for_edge (fallthru
, sizeof (int));
645 LATCH_EDGE (fallthru
) = conn_latch
;
650 /* Takes care of merging natural loops with shared headers. */
652 canonicalize_loop_headers ()
658 /* Compute the dominators. */
659 dom
= calculate_dominance_info (CDI_DOMINATORS
);
661 alloc_aux_for_blocks (sizeof (int));
662 alloc_aux_for_edges (sizeof (int));
664 /* Split blocks so that each loop has only single latch. */
668 int have_abnormal_edge
= 0;
670 for (e
= header
->pred
; e
; e
= e
->pred_next
)
672 basic_block latch
= e
->src
;
674 if (e
->flags
& EDGE_ABNORMAL
)
675 have_abnormal_edge
= 1;
677 if (latch
!= ENTRY_BLOCK_PTR
678 && dominated_by_p (dom
, latch
, header
))
684 if (have_abnormal_edge
)
685 HEADER_BLOCK (header
) = 0;
687 HEADER_BLOCK (header
) = num_latches
;
690 if (HEADER_BLOCK (ENTRY_BLOCK_PTR
->succ
->dest
))
694 /* We could not redirect edges freely here. On the other hand,
695 we can simply split the edge from entry block. */
696 bb
= split_edge (ENTRY_BLOCK_PTR
->succ
);
698 alloc_aux_for_edge (bb
->succ
, sizeof (int));
699 LATCH_EDGE (bb
->succ
) = 0;
700 alloc_aux_for_block (bb
, sizeof (int));
701 HEADER_BLOCK (bb
) = 0;
708 int max_freq
, is_heavy
;
711 if (!HEADER_BLOCK (header
))
714 num_latch
= HEADER_BLOCK (header
);
716 want_join_latch
= (num_latch
> 1);
718 if (!want_join_latch
)
721 /* Find a heavy edge. */
725 for (e
= header
->pred
; e
; e
= e
->pred_next
)
726 if (LATCH_EDGE (e
) &&
727 EDGE_FREQUENCY (e
) > max_freq
)
728 max_freq
= EDGE_FREQUENCY (e
);
729 for (e
= header
->pred
; e
; e
= e
->pred_next
)
730 if (LATCH_EDGE (e
) &&
731 EDGE_FREQUENCY (e
) >= max_freq
/ HEAVY_EDGE_RATIO
)
744 basic_block new_header
=
745 make_forwarder_block (header
, true, true, heavy
, 0);
747 make_forwarder_block (new_header
, true, false, NULL
, 1);
750 make_forwarder_block (header
, true, false, NULL
, 1);
753 free_aux_for_blocks ();
754 free_aux_for_edges ();
755 free_dominance_info (dom
);
758 /* Find all the natural loops in the function and save in LOOPS structure and
759 recalculate loop_depth information in basic block structures. FLAGS
760 controls which loop information is collected. Return the number of natural
764 flow_loops_find (loops
, flags
)
779 /* This function cannot be repeatedly called with different
780 flags to build up the loop information. The loop tree
781 must always be built if this function is called. */
782 if (! (flags
& LOOP_TREE
))
785 memset (loops
, 0, sizeof *loops
);
787 /* Taking care of this degenerate case makes the rest of
788 this code simpler. */
789 if (n_basic_blocks
== 0)
795 /* Join loops with shared headers. */
796 canonicalize_loop_headers ();
798 /* Compute the dominators. */
799 dom
= loops
->cfg
.dom
= calculate_dominance_info (CDI_DOMINATORS
);
801 /* Count the number of loop headers. This should be the
802 same as the number of natural loops. */
803 headers
= sbitmap_alloc (last_basic_block
);
804 sbitmap_zero (headers
);
809 int more_latches
= 0;
811 header
->loop_depth
= 0;
813 /* If we have an abnormal predecessor, do not consider the
814 loop (not worth the problems). */
815 for (e
= header
->pred
; e
; e
= e
->pred_next
)
816 if (e
->flags
& EDGE_ABNORMAL
)
821 for (e
= header
->pred
; e
; e
= e
->pred_next
)
823 basic_block latch
= e
->src
;
825 if (e
->flags
& EDGE_ABNORMAL
)
828 /* Look for back edges where a predecessor is dominated
829 by this block. A natural loop has a single entry
830 node (header) that dominates all the nodes in the
831 loop. It also has single back edge to the header
832 from a latch node. */
833 if (latch
!= ENTRY_BLOCK_PTR
&& dominated_by_p (dom
, latch
, header
))
835 /* Shared headers should be eliminated by now. */
839 SET_BIT (headers
, header
->index
);
845 /* Allocate loop structures. */
846 loops
->parray
= (struct loop
**) xcalloc (num_loops
+ 1, sizeof (struct loop
*));
848 /* Dummy loop containing whole function. */
849 loops
->parray
[0] = xcalloc (1, sizeof (struct loop
));
850 loops
->parray
[0]->next
= NULL
;
851 loops
->parray
[0]->inner
= NULL
;
852 loops
->parray
[0]->outer
= NULL
;
853 loops
->parray
[0]->depth
= 0;
854 loops
->parray
[0]->pred
= NULL
;
855 loops
->parray
[0]->num_nodes
= n_basic_blocks
+ 2;
856 loops
->parray
[0]->latch
= EXIT_BLOCK_PTR
;
857 loops
->parray
[0]->header
= ENTRY_BLOCK_PTR
;
858 ENTRY_BLOCK_PTR
->loop_father
= loops
->parray
[0];
859 EXIT_BLOCK_PTR
->loop_father
= loops
->parray
[0];
861 loops
->tree_root
= loops
->parray
[0];
863 /* Find and record information about all the natural loops
867 bb
->loop_father
= loops
->tree_root
;
871 /* Compute depth first search order of the CFG so that outer
872 natural loops will be found before inner natural loops. */
873 dfs_order
= (int *) xmalloc (n_basic_blocks
* sizeof (int));
874 rc_order
= (int *) xmalloc (n_basic_blocks
* sizeof (int));
875 flow_depth_first_order_compute (dfs_order
, rc_order
);
877 /* Save CFG derived information to avoid recomputing it. */
878 loops
->cfg
.dom
= dom
;
879 loops
->cfg
.dfs_order
= dfs_order
;
880 loops
->cfg
.rc_order
= rc_order
;
884 for (b
= 0; b
< n_basic_blocks
; b
++)
888 /* Search the nodes of the CFG in reverse completion order
889 so that we can find outer loops first. */
890 if (!TEST_BIT (headers
, rc_order
[b
]))
893 header
= BASIC_BLOCK (rc_order
[b
]);
895 loop
= loops
->parray
[num_loops
] = xcalloc (1, sizeof (struct loop
));
897 loop
->header
= header
;
898 loop
->num
= num_loops
;
901 /* Look for the latch for this header block. */
902 for (e
= header
->pred
; e
; e
= e
->pred_next
)
904 basic_block latch
= e
->src
;
906 if (latch
!= ENTRY_BLOCK_PTR
907 && dominated_by_p (dom
, latch
, header
))
914 flow_loop_tree_node_add (header
->loop_father
, loop
);
915 loop
->num_nodes
= flow_loop_nodes_find (loop
->header
, loop
);
918 sbitmap_free (headers
);
920 /* Assign the loop nesting depth and enclosed loop level for each
922 loops
->levels
= flow_loops_level_compute (loops
);
924 /* Scan the loops. */
925 for (i
= 1; i
< num_loops
; i
++)
926 flow_loop_scan (loops
, loops
->parray
[i
], flags
);
928 loops
->num
= num_loops
;
932 loops
->cfg
.dom
= NULL
;
933 free_dominance_info (dom
);
937 #ifdef ENABLE_CHECKING
939 verify_loop_structure (loops
);
945 /* Update the information regarding the loops in the CFG
946 specified by LOOPS. */
949 flow_loops_update (loops
, flags
)
953 /* One day we may want to update the current loop data. For now
954 throw away the old stuff and rebuild what we need. */
956 flow_loops_free (loops
);
958 return flow_loops_find (loops
, flags
);
961 /* Return nonzero if basic block BB belongs to LOOP. */
963 flow_bb_inside_loop_p (loop
, bb
)
964 const struct loop
*loop
;
965 const basic_block bb
;
967 struct loop
*source_loop
;
969 if (bb
== ENTRY_BLOCK_PTR
|| bb
== EXIT_BLOCK_PTR
)
972 source_loop
= bb
->loop_father
;
973 return loop
== source_loop
|| flow_loop_nested_p (loop
, source_loop
);
976 /* Return nonzero if edge E enters header of LOOP from outside of LOOP. */
979 flow_loop_outside_edge_p (loop
, e
)
980 const struct loop
*loop
;
983 if (e
->dest
!= loop
->header
)
985 return !flow_bb_inside_loop_p (loop
, e
->src
);
988 /* Enumeration predicate for get_loop_body. */
990 glb_enum_p (bb
, glb_header
)
994 return bb
!= (basic_block
) glb_header
;
997 /* Gets basic blocks of a loop. */
1000 const struct loop
*loop
;
1002 basic_block
*tovisit
, bb
;
1005 if (!loop
->num_nodes
)
1008 tovisit
= xcalloc (loop
->num_nodes
, sizeof (basic_block
));
1009 tovisit
[tv
++] = loop
->header
;
1011 if (loop
->latch
== EXIT_BLOCK_PTR
)
1013 /* There may be blocks unreachable from EXIT_BLOCK. */
1014 if (loop
->num_nodes
!= (unsigned) n_basic_blocks
+ 2)
1018 tovisit
[tv
++] = EXIT_BLOCK_PTR
;
1020 else if (loop
->latch
!= loop
->header
)
1022 tv
= dfs_enumerate_from (loop
->latch
, 1, glb_enum_p
,
1023 tovisit
+ 1, loop
->num_nodes
- 1,
1027 if (tv
!= loop
->num_nodes
)
1032 /* Adds basic block BB to LOOP. */
1034 add_bb_to_loop (bb
, loop
)
1040 bb
->loop_father
= loop
;
1041 bb
->loop_depth
= loop
->depth
;
1043 for (i
= 0; i
< loop
->depth
; i
++)
1044 loop
->pred
[i
]->num_nodes
++;
1047 /* Remove basic block BB from loops. */
1049 remove_bb_from_loops (bb
)
1053 struct loop
*loop
= bb
->loop_father
;
1056 for (i
= 0; i
< loop
->depth
; i
++)
1057 loop
->pred
[i
]->num_nodes
--;
1058 bb
->loop_father
= NULL
;
1062 /* Finds nearest common ancestor in loop tree for given loops. */
1064 find_common_loop (loop_s
, loop_d
)
1065 struct loop
*loop_s
;
1066 struct loop
*loop_d
;
1068 if (!loop_s
) return loop_d
;
1069 if (!loop_d
) return loop_s
;
1071 if (loop_s
->depth
< loop_d
->depth
)
1072 loop_d
= loop_d
->pred
[loop_s
->depth
];
1073 else if (loop_s
->depth
> loop_d
->depth
)
1074 loop_s
= loop_s
->pred
[loop_d
->depth
];
1076 while (loop_s
!= loop_d
)
1078 loop_s
= loop_s
->outer
;
1079 loop_d
= loop_d
->outer
;
1084 /* Cancels the LOOP; it must be innermost one. */
1086 cancel_loop (loops
, loop
)
1087 struct loops
*loops
;
1096 /* Move blocks up one level (they should be removed as soon as possible). */
1097 bbs
= get_loop_body (loop
);
1098 for (i
= 0; i
< loop
->num_nodes
; i
++)
1099 bbs
[i
]->loop_father
= loop
->outer
;
1101 /* Remove the loop from structure. */
1102 flow_loop_tree_node_remove (loop
);
1104 /* Remove loop from loops array. */
1105 loops
->parray
[loop
->num
] = NULL
;
1107 /* Free loop data. */
1108 flow_loop_free (loop
);
1111 /* Cancels LOOP and all its subloops. */
1113 cancel_loop_tree (loops
, loop
)
1114 struct loops
*loops
;
1118 cancel_loop_tree (loops
, loop
->inner
);
1119 cancel_loop (loops
, loop
);
1122 /* Checks that LOOPS are allright:
1123 -- sizes of loops are allright
1124 -- results of get_loop_body really belong to the loop
1125 -- loop header have just single entry edge and single latch edge
1126 -- loop latches have only single successor that is header of their loop
1127 -- irreducible loops are correctly marked
1130 verify_loop_structure (loops
)
1131 struct loops
*loops
;
1133 unsigned *sizes
, i
, j
;
1135 basic_block
*bbs
, bb
;
1140 sizes
= xcalloc (loops
->num
, sizeof (int));
1144 for (loop
= bb
->loop_father
; loop
; loop
= loop
->outer
)
1147 for (i
= 0; i
< loops
->num
; i
++)
1149 if (!loops
->parray
[i
])
1152 if (loops
->parray
[i
]->num_nodes
!= sizes
[i
])
1154 error ("Size of loop %d should be %d, not %d.",
1155 i
, sizes
[i
], loops
->parray
[i
]->num_nodes
);
1162 /* Check get_loop_body. */
1163 for (i
= 1; i
< loops
->num
; i
++)
1165 loop
= loops
->parray
[i
];
1168 bbs
= get_loop_body (loop
);
1170 for (j
= 0; j
< loop
->num_nodes
; j
++)
1171 if (!flow_bb_inside_loop_p (loop
, bbs
[j
]))
1173 error ("Bb %d do not belong to loop %d.",
1180 /* Check headers and latches. */
1181 for (i
= 1; i
< loops
->num
; i
++)
1183 loop
= loops
->parray
[i
];
1187 if ((loops
->state
& LOOPS_HAVE_PREHEADERS
)
1188 && (!loop
->header
->pred
->pred_next
1189 || loop
->header
->pred
->pred_next
->pred_next
))
1191 error ("Loop %d's header does not have exactly 2 entries.", i
);
1194 if (loops
->state
& LOOPS_HAVE_SIMPLE_LATCHES
)
1196 if (!loop
->latch
->succ
1197 || loop
->latch
->succ
->succ_next
)
1199 error ("Loop %d's latch does not have exactly 1 successor.", i
);
1202 if (loop
->latch
->succ
->dest
!= loop
->header
)
1204 error ("Loop %d's latch does not have header as successor.", i
);
1207 if (loop
->latch
->loop_father
!= loop
)
1209 error ("Loop %d's latch does not belong directly to it.", i
);
1213 if (loop
->header
->loop_father
!= loop
)
1215 error ("Loop %d's header does not belong directly to it.", i
);
1220 /* Check irreducible loops. */
1221 if (loops
->state
& LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS
)
1223 /* Record old info. */
1224 irreds
= sbitmap_alloc (last_basic_block
);
1226 if (bb
->flags
& BB_IRREDUCIBLE_LOOP
)
1227 SET_BIT (irreds
, bb
->index
);
1229 RESET_BIT (irreds
, bb
->index
);
1232 mark_irreducible_loops (loops
);
1237 if ((bb
->flags
& BB_IRREDUCIBLE_LOOP
)
1238 && !TEST_BIT (irreds
, bb
->index
))
1240 error ("Basic block %d should be marked irreducible.", bb
->index
);
1243 else if (!(bb
->flags
& BB_IRREDUCIBLE_LOOP
)
1244 && TEST_BIT (irreds
, bb
->index
))
1246 error ("Basic block %d should not be marked irreducible.", bb
->index
);
1257 /* Returns latch edge of LOOP. */
1259 loop_latch_edge (loop
)
1260 const struct loop
*loop
;
1264 for (e
= loop
->header
->pred
; e
->src
!= loop
->latch
; e
= e
->pred_next
)
1270 /* Returns preheader edge of LOOP. */
1272 loop_preheader_edge (loop
)
1273 const struct loop
*loop
;
1277 for (e
= loop
->header
->pred
; e
->src
== loop
->latch
; e
= e
->pred_next
)