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
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 (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. */
53 flow_loops_cfg_dump (const struct loops
*loops
, FILE *file
)
58 if (! loops
->num
|| ! file
)
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
]);
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
]);
92 /* Return nonzero if the nodes of LOOP are a subset of OUTER. */
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. */
105 flow_loop_dump (const struct loop
*loop
, FILE *file
,
106 void (*loop_dump_aux
) (const struct loop
*, FILE *, int),
112 if (! loop
|| ! loop
->header
)
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
);
136 fprintf (file
, "\n");
137 flow_edge_list_print (";; exit edges", loop
->exit_edges
,
138 loop
->num_exits
, file
);
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. */
148 flow_loops_dump (const struct loops
*loops
, FILE *file
, void (*loop_dump_aux
) (const struct loop
*, FILE *, int), int verbose
)
153 num_loops
= loops
->num
;
154 if (! num_loops
|| ! file
)
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
];
167 flow_loop_dump (loop
, file
, loop_dump_aux
, verbose
);
171 flow_loops_cfg_dump (loops
, file
);
174 /* Free data allocated for LOOP. */
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
);
189 /* Free all the memory allocated for LOOPS. */
192 flow_loops_free (struct loops
*loops
)
201 /* Free the loop descriptors. */
202 for (i
= 0; i
< loops
->num
; i
++)
204 struct loop
*loop
= loops
->parray
[i
];
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. */
226 flow_loop_entry_edges_find (struct loop
*loop
)
232 for (e
= loop
->header
->pred
; e
; e
= e
->pred_next
)
234 if (flow_loop_outside_edge_p (loop
, e
))
241 loop
->entry_edges
= xmalloc (num_entries
* sizeof (edge
*));
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. */
256 flow_loop_exit_edges_find (struct loop
*loop
)
259 basic_block node
, *bbs
;
260 unsigned num_exits
, i
;
262 loop
->exit_edges
= NULL
;
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
269 bbs
= get_loop_body (loop
);
270 for (i
= 0; i
< loop
->num_nodes
; 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
))
288 loop
->exit_edges
= xmalloc (num_exits
* sizeof (edge
*));
290 /* Store all exiting edges into an array. */
292 for (i
= 0; i
< loop
->num_nodes
; 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
;
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. */
311 flow_loop_nodes_find (basic_block header
, struct loop
*loop
)
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
));
325 stack
[sp
++] = loop
->latch
;
326 loop
->latch
->loop_father
= loop
;
327 loop
->latch
->loop_depth
= loop
->depth
;
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
;
346 stack
[sp
++] = ancestor
;
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. */
359 flow_loop_pre_header_scan (struct loop
*loop
)
365 loop
->num_pre_header_edges
= 0;
366 if (loop
->num_entries
!= 1)
369 ebb
= loop
->entry_edges
[0]->src
;
370 if (ebb
== ENTRY_BLOCK_PTR
)
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
;
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. */
394 flow_loop_pre_header_find (basic_block header
)
396 basic_block pre_header
;
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. */
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
)
413 /* There are multiple edges into the header from outside
414 the loop so there is no pre-header block. */
425 establish_preds (struct loop
*loop
)
427 struct loop
*ploop
, *father
= loop
->outer
;
429 loop
->depth
= father
->depth
+ 1;
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. */
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. */
457 flow_loop_tree_node_remove (struct loop
*loop
)
459 struct loop
*prev
, *father
;
461 father
= loop
->outer
;
464 /* Remove loop from the list of sons. */
465 if (father
->inner
== loop
)
466 father
->inner
= loop
->next
;
469 for (prev
= father
->inner
; prev
->next
!= loop
; prev
= prev
->next
);
470 prev
->next
= loop
->next
;
478 /* Helper function to compute loop nesting depth and enclosed loop level
479 for the natural loop specified by LOOP. Returns the loop level. */
482 flow_loop_level_compute (struct loop
*loop
)
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
495 for (inner
= loop
->inner
; inner
; inner
= inner
->next
)
497 int ilevel
= flow_loop_level_compute (inner
) + 1;
507 /* Compute the loop nesting depth and enclosed loop level for the loop
508 hierarchy tree specified by LOOPS. Return the maximum enclosed loop
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
);
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. */
555 redirect_edge_with_latch_update (edge e
, basic_block to
)
559 jump
= redirect_edge_and_branch_force (e
, to
);
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
577 make_forwarder_block (basic_block bb
, int redirect_latch
, int redirect_nonlatch
, edge except
, int conn_latch
)
579 edge e
, next_e
, fallthru
;
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
;
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
;
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)
611 redirect_edge_with_latch_update (e
, bb
);
615 alloc_aux_for_edge (fallthru
, sizeof (int));
616 LATCH_EDGE (fallthru
) = conn_latch
;
621 /* Takes care of merging natural loops with shared headers. */
623 canonicalize_loop_headers (void)
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. */
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
))
654 if (have_abnormal_edge
)
655 HEADER_BLOCK (header
) = 0;
657 HEADER_BLOCK (header
) = num_latches
;
660 free_dominance_info (CDI_DOMINATORS
);
662 if (HEADER_BLOCK (ENTRY_BLOCK_PTR
->succ
->dest
))
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;
680 int max_freq
, is_heavy
;
683 if (!HEADER_BLOCK (header
))
686 num_latch
= HEADER_BLOCK (header
);
688 want_join_latch
= (num_latch
> 1);
690 if (!want_join_latch
)
693 /* Find a heavy edge. */
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
)
716 basic_block new_header
=
717 make_forwarder_block (header
, true, true, heavy
, 0);
719 make_forwarder_block (new_header
, true, false, NULL
, 1);
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
735 flow_loops_find (struct loops
*loops
, int flags
)
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
))
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)
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
);
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
)
789 for (e
= header
->pred
; e
; e
= e
->pred_next
)
791 basic_block latch
= e
->src
;
793 if (e
->flags
& EDGE_ABNORMAL
)
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. */
808 SET_BIT (headers
, header
->index
);
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
836 bb
->loop_father
= loops
->tree_root
;
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
;
852 for (b
= 0; b
< n_basic_blocks
; b
++)
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
]))
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
;
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
))
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
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
;
898 free_dominance_info (CDI_DOMINATORS
);
901 sbitmap_free (headers
);
904 #ifdef ENABLE_CHECKING
906 verify_loop_structure (loops
);
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. */
921 flow_loops_free (loops
);
923 return flow_loops_find (loops
, flags
);
926 /* Return nonzero if basic block BB belongs to LOOP. */
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
)
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. */
942 flow_loop_outside_edge_p (const struct loop
*loop
, edge e
)
944 if (e
->dest
!= loop
->header
)
946 return !flow_bb_inside_loop_p (loop
, e
->src
);
949 /* Enumeration predicate for get_loop_body. */
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. */
960 get_loop_body (const struct loop
*loop
)
962 basic_block
*tovisit
, bb
;
965 if (!loop
->num_nodes
)
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)
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,
987 if (tv
!= loop
->num_nodes
)
992 /* Gets exit edges of a LOOP, returning their number in N_EDGES. */
994 get_loop_exit_edges (const struct loop
*loop
, unsigned int *n_edges
)
1000 if (loop
->latch
== EXIT_BLOCK_PTR
)
1003 body
= get_loop_body (loop
);
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
))
1009 edges
= xmalloc (n
* sizeof (edge
));
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
))
1021 /* Adds basic block BB to LOOP. */
1023 add_bb_to_loop (basic_block bb
, struct loop
*loop
)
1027 bb
->loop_father
= loop
;
1028 bb
->loop_depth
= loop
->depth
;
1030 for (i
= 0; i
< loop
->depth
; i
++)
1031 loop
->pred
[i
]->num_nodes
++;
1034 /* Remove basic block BB from loops. */
1036 remove_bb_from_loops (basic_block bb
)
1039 struct loop
*loop
= bb
->loop_father
;
1042 for (i
= 0; i
< loop
->depth
; i
++)
1043 loop
->pred
[i
]->num_nodes
--;
1044 bb
->loop_father
= NULL
;
1048 /* Finds nearest common ancestor in loop tree for given loops. */
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
;
1068 /* Cancels the LOOP; it must be innermost one. */
1070 cancel_loop (struct loops
*loops
, struct loop
*loop
)
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. */
1095 cancel_loop_tree (struct loops
*loops
, struct loop
*loop
)
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
1110 verify_loop_structure (struct loops
*loops
)
1112 unsigned *sizes
, i
, j
;
1114 basic_block
*bbs
, bb
;
1120 sizes
= xcalloc (loops
->num
, sizeof (int));
1124 for (loop
= bb
->loop_father
; loop
; loop
= loop
->outer
)
1127 for (i
= 0; i
< loops
->num
; i
++)
1129 if (!loops
->parray
[i
])
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
);
1142 /* Check get_loop_body. */
1143 for (i
= 1; i
< loops
->num
; i
++)
1145 loop
= loops
->parray
[i
];
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.",
1160 /* Check headers and latches. */
1161 for (i
= 1; i
< loops
->num
; i
++)
1163 loop
= loops
->parray
[i
];
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
);
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
);
1182 if (loop
->latch
->succ
->dest
!= loop
->header
)
1184 error ("Loop %d's latch does not have header as successor.", i
);
1187 if (loop
->latch
->loop_father
!= loop
)
1189 error ("Loop %d's latch does not belong directly to it.", i
);
1193 if (loop
->header
->loop_father
!= loop
)
1195 error ("Loop %d's header does not belong directly to it.", i
);
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
);
1206 /* Check irreducible loops. */
1207 if (loops
->state
& LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS
)
1209 /* Record old info. */
1210 irreds
= sbitmap_alloc (last_basic_block
);
1213 if (bb
->flags
& BB_IRREDUCIBLE_LOOP
)
1214 SET_BIT (irreds
, bb
->index
);
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;
1223 mark_irreducible_loops (loops
);
1228 if ((bb
->flags
& BB_IRREDUCIBLE_LOOP
)
1229 && !TEST_BIT (irreds
, bb
->index
))
1231 error ("Basic block %d should be marked irreducible.", bb
->index
);
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
);
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
);
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
);
1256 e
->flags
&= ~(EDGE_ALL_FLAGS
+ 1);
1266 /* Returns latch edge of LOOP. */
1268 loop_latch_edge (const struct loop
*loop
)
1272 for (e
= loop
->header
->pred
; e
->src
!= loop
->latch
; e
= e
->pred_next
)
1278 /* Returns preheader edge of LOOP. */
1280 loop_preheader_edge (const struct loop
*loop
)
1284 for (e
= loop
->header
->pred
; e
->src
== loop
->latch
; e
= e
->pred_next
)