1 /* Natural loop discovery code for GNU compiler.
2 Copyright (C) 2000, 2001, 2003, 2004, 2005 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, 51 Franklin Street, Fifth Floor, Boston, MA
23 #include "coretypes.h"
26 #include "hard-reg-set.h"
29 #include "basic-block.h"
34 #include "tree-flow.h"
36 /* Ratio of frequencies of edges so that one of more latch edges is
37 considered to belong to inner loop with same header. */
38 #define HEAVY_EDGE_RATIO 8
40 #define HEADER_BLOCK(B) (* (int *) (B)->aux)
41 #define LATCH_EDGE(E) (*(int *) (E)->aux)
43 static void flow_loops_cfg_dump (const struct loops
*, FILE *);
44 static int flow_loop_level_compute (struct loop
*);
45 static void flow_loops_level_compute (struct loops
*);
46 static void establish_preds (struct loop
*);
47 static void canonicalize_loop_headers (void);
48 static bool glb_enum_p (basic_block
, void *);
50 /* Dump loop related CFG information. */
53 flow_loops_cfg_dump (const struct loops
*loops
, FILE *file
)
58 if (! loops
->num
|| ! file
)
66 fprintf (file
, ";; %d succs { ", bb
->index
);
67 FOR_EACH_EDGE (succ
, ei
, bb
->succs
)
68 fprintf (file
, "%d ", succ
->dest
->index
);
69 fprintf (file
, "}\n");
72 /* Dump the DFS node order. */
73 if (loops
->cfg
.dfs_order
)
75 fputs (";; DFS order: ", file
);
76 for (i
= NUM_FIXED_BLOCKS
; i
< n_basic_blocks
; i
++)
77 fprintf (file
, "%d ", loops
->cfg
.dfs_order
[i
]);
82 /* Dump the reverse completion node order. */
83 if (loops
->cfg
.rc_order
)
85 fputs (";; RC order: ", file
);
86 for (i
= NUM_FIXED_BLOCKS
; i
< n_basic_blocks
; i
++)
87 fprintf (file
, "%d ", loops
->cfg
.rc_order
[i
]);
93 /* Return nonzero if the nodes of LOOP are a subset of OUTER. */
96 flow_loop_nested_p (const struct loop
*outer
, const struct loop
*loop
)
98 return (loop
->depth
> outer
->depth
99 && loop
->pred
[outer
->depth
] == outer
);
102 /* Returns the loop such that LOOP is nested DEPTH (indexed from zero)
103 loops within LOOP. */
106 superloop_at_depth (struct loop
*loop
, unsigned depth
)
108 gcc_assert (depth
<= (unsigned) loop
->depth
);
110 if (depth
== (unsigned) loop
->depth
)
113 return loop
->pred
[depth
];
116 /* Dump the loop information specified by LOOP to the stream FILE
117 using auxiliary dump callback function LOOP_DUMP_AUX if non null. */
120 flow_loop_dump (const struct loop
*loop
, FILE *file
,
121 void (*loop_dump_aux
) (const struct loop
*, FILE *, int),
127 if (! loop
|| ! loop
->header
)
130 fprintf (file
, ";;\n;; Loop %d\n", loop
->num
);
132 fprintf (file
, ";; header %d, latch %d\n",
133 loop
->header
->index
, loop
->latch
->index
);
134 fprintf (file
, ";; depth %d, level %d, outer %ld\n",
135 loop
->depth
, loop
->level
,
136 (long) (loop
->outer
? loop
->outer
->num
: -1));
138 fprintf (file
, ";; nodes:");
139 bbs
= get_loop_body (loop
);
140 for (i
= 0; i
< loop
->num_nodes
; i
++)
141 fprintf (file
, " %d", bbs
[i
]->index
);
143 fprintf (file
, "\n");
146 loop_dump_aux (loop
, file
, verbose
);
149 /* Dump the loop information specified by LOOPS to the stream FILE,
150 using auxiliary dump callback function LOOP_DUMP_AUX if non null. */
153 flow_loops_dump (const struct loops
*loops
, FILE *file
, void (*loop_dump_aux
) (const struct loop
*, FILE *, int), int verbose
)
158 num_loops
= loops
->num
;
159 if (! num_loops
|| ! file
)
162 fprintf (file
, ";; %d loops found\n", num_loops
);
164 for (i
= 0; i
< num_loops
; i
++)
166 struct loop
*loop
= loops
->parray
[i
];
171 flow_loop_dump (loop
, file
, loop_dump_aux
, verbose
);
175 flow_loops_cfg_dump (loops
, file
);
178 /* Free data allocated for LOOP. */
180 flow_loop_free (struct loop
*loop
)
187 /* Free all the memory allocated for LOOPS. */
190 flow_loops_free (struct loops
*loops
)
196 gcc_assert (loops
->num
);
198 /* Free the loop descriptors. */
199 for (i
= 0; i
< loops
->num
; i
++)
201 struct loop
*loop
= loops
->parray
[i
];
206 flow_loop_free (loop
);
209 free (loops
->parray
);
210 loops
->parray
= NULL
;
212 if (loops
->cfg
.dfs_order
)
213 free (loops
->cfg
.dfs_order
);
214 if (loops
->cfg
.rc_order
)
215 free (loops
->cfg
.rc_order
);
220 /* Find the nodes contained within the LOOP with header HEADER.
221 Return the number of nodes within the loop. */
224 flow_loop_nodes_find (basic_block header
, struct loop
*loop
)
230 header
->loop_father
= loop
;
231 header
->loop_depth
= loop
->depth
;
233 if (loop
->latch
->loop_father
!= loop
)
235 stack
= XNEWVEC (basic_block
, n_basic_blocks
);
238 stack
[sp
++] = loop
->latch
;
239 loop
->latch
->loop_father
= loop
;
240 loop
->latch
->loop_depth
= loop
->depth
;
250 FOR_EACH_EDGE (e
, ei
, node
->preds
)
252 basic_block ancestor
= e
->src
;
254 if (ancestor
!= ENTRY_BLOCK_PTR
255 && ancestor
->loop_father
!= loop
)
257 ancestor
->loop_father
= loop
;
258 ancestor
->loop_depth
= loop
->depth
;
260 stack
[sp
++] = ancestor
;
269 /* For each loop in the lOOPS tree that has just a single exit
270 record the exit edge. */
273 mark_single_exit_loops (struct loops
*loops
)
280 for (i
= 1; i
< loops
->num
; i
++)
282 loop
= loops
->parray
[i
];
284 loop
->single_exit
= NULL
;
290 if (bb
->loop_father
== loops
->tree_root
)
292 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
294 if (e
->dest
== EXIT_BLOCK_PTR
)
297 if (flow_bb_inside_loop_p (bb
->loop_father
, e
->dest
))
300 for (loop
= bb
->loop_father
;
301 loop
!= e
->dest
->loop_father
;
304 /* If we have already seen an exit, mark this by the edge that
305 surely does not occur as any exit. */
306 if (loop
->single_exit
)
307 loop
->single_exit
= single_succ_edge (ENTRY_BLOCK_PTR
);
309 loop
->single_exit
= e
;
314 for (i
= 1; i
< loops
->num
; i
++)
316 loop
= loops
->parray
[i
];
320 if (loop
->single_exit
== single_succ_edge (ENTRY_BLOCK_PTR
))
321 loop
->single_exit
= NULL
;
324 loops
->state
|= LOOPS_HAVE_MARKED_SINGLE_EXITS
;
328 establish_preds (struct loop
*loop
)
330 struct loop
*ploop
, *father
= loop
->outer
;
332 loop
->depth
= father
->depth
+ 1;
334 /* Remember the current loop depth if it is the largest seen so far. */
335 cfun
->max_loop_depth
= MAX (cfun
->max_loop_depth
, loop
->depth
);
339 loop
->pred
= XNEWVEC (struct loop
*, loop
->depth
);
340 memcpy (loop
->pred
, father
->pred
, sizeof (struct loop
*) * father
->depth
);
341 loop
->pred
[father
->depth
] = father
;
343 for (ploop
= loop
->inner
; ploop
; ploop
= ploop
->next
)
344 establish_preds (ploop
);
347 /* Add LOOP to the loop hierarchy tree where FATHER is father of the
348 added loop. If LOOP has some children, take care of that their
349 pred field will be initialized correctly. */
352 flow_loop_tree_node_add (struct loop
*father
, struct loop
*loop
)
354 loop
->next
= father
->inner
;
355 father
->inner
= loop
;
356 loop
->outer
= father
;
358 establish_preds (loop
);
361 /* Remove LOOP from the loop hierarchy tree. */
364 flow_loop_tree_node_remove (struct loop
*loop
)
366 struct loop
*prev
, *father
;
368 father
= loop
->outer
;
371 /* Remove loop from the list of sons. */
372 if (father
->inner
== loop
)
373 father
->inner
= loop
->next
;
376 for (prev
= father
->inner
; prev
->next
!= loop
; prev
= prev
->next
);
377 prev
->next
= loop
->next
;
385 /* Helper function to compute loop nesting depth and enclosed loop level
386 for the natural loop specified by LOOP. Returns the loop level. */
389 flow_loop_level_compute (struct loop
*loop
)
397 /* Traverse loop tree assigning depth and computing level as the
398 maximum level of all the inner loops of this loop. The loop
399 level is equivalent to the height of the loop in the loop tree
400 and corresponds to the number of enclosed loop levels (including
402 for (inner
= loop
->inner
; inner
; inner
= inner
->next
)
404 int ilevel
= flow_loop_level_compute (inner
) + 1;
414 /* Compute the loop nesting depth and enclosed loop level for the loop
415 hierarchy tree specified by LOOPS. Return the maximum enclosed loop
419 flow_loops_level_compute (struct loops
*loops
)
421 flow_loop_level_compute (loops
->tree_root
);
424 /* A callback to update latch and header info for basic block JUMP created
425 by redirecting an edge. */
428 update_latch_info (basic_block jump
)
430 alloc_aux_for_block (jump
, sizeof (int));
431 HEADER_BLOCK (jump
) = 0;
432 alloc_aux_for_edge (single_pred_edge (jump
), sizeof (int));
433 LATCH_EDGE (single_pred_edge (jump
)) = 0;
434 set_immediate_dominator (CDI_DOMINATORS
, jump
, single_pred (jump
));
437 /* A callback for make_forwarder block, to redirect all edges except for
438 MFB_KJ_EDGE to the entry part. E is the edge for that we should decide
439 whether to redirect it. */
441 static edge mfb_kj_edge
;
443 mfb_keep_just (edge e
)
445 return e
!= mfb_kj_edge
;
448 /* A callback for make_forwarder block, to redirect the latch edges into an
449 entry part. E is the edge for that we should decide whether to redirect
453 mfb_keep_nonlatch (edge e
)
455 return LATCH_EDGE (e
);
458 /* Takes care of merging natural loops with shared headers. */
461 canonicalize_loop_headers (void)
466 alloc_aux_for_blocks (sizeof (int));
467 alloc_aux_for_edges (sizeof (int));
469 /* Split blocks so that each loop has only single latch. */
474 int have_abnormal_edge
= 0;
476 FOR_EACH_EDGE (e
, ei
, header
->preds
)
478 basic_block latch
= e
->src
;
480 if (e
->flags
& EDGE_ABNORMAL
)
481 have_abnormal_edge
= 1;
483 if (latch
!= ENTRY_BLOCK_PTR
484 && dominated_by_p (CDI_DOMINATORS
, latch
, header
))
490 if (have_abnormal_edge
)
491 HEADER_BLOCK (header
) = 0;
493 HEADER_BLOCK (header
) = num_latches
;
496 if (HEADER_BLOCK (single_succ (ENTRY_BLOCK_PTR
)))
500 /* We could not redirect edges freely here. On the other hand,
501 we can simply split the edge from entry block. */
502 bb
= split_edge (single_succ_edge (ENTRY_BLOCK_PTR
));
504 alloc_aux_for_edge (single_succ_edge (bb
), sizeof (int));
505 LATCH_EDGE (single_succ_edge (bb
)) = 0;
506 alloc_aux_for_block (bb
, sizeof (int));
507 HEADER_BLOCK (bb
) = 0;
512 int max_freq
, is_heavy
;
513 edge heavy
, tmp_edge
;
516 if (HEADER_BLOCK (header
) <= 1)
519 /* Find a heavy edge. */
523 FOR_EACH_EDGE (e
, ei
, header
->preds
)
524 if (LATCH_EDGE (e
) &&
525 EDGE_FREQUENCY (e
) > max_freq
)
526 max_freq
= EDGE_FREQUENCY (e
);
527 FOR_EACH_EDGE (e
, ei
, header
->preds
)
528 if (LATCH_EDGE (e
) &&
529 EDGE_FREQUENCY (e
) >= max_freq
/ HEAVY_EDGE_RATIO
)
542 /* Split out the heavy edge, and create inner loop for it. */
544 tmp_edge
= make_forwarder_block (header
, mfb_keep_just
,
546 alloc_aux_for_block (tmp_edge
->dest
, sizeof (int));
547 HEADER_BLOCK (tmp_edge
->dest
) = 1;
548 alloc_aux_for_edge (tmp_edge
, sizeof (int));
549 LATCH_EDGE (tmp_edge
) = 0;
550 HEADER_BLOCK (header
)--;
553 if (HEADER_BLOCK (header
) > 1)
555 /* Create a new latch block. */
556 tmp_edge
= make_forwarder_block (header
, mfb_keep_nonlatch
,
558 alloc_aux_for_block (tmp_edge
->dest
, sizeof (int));
559 HEADER_BLOCK (tmp_edge
->src
) = 0;
560 HEADER_BLOCK (tmp_edge
->dest
) = 1;
561 alloc_aux_for_edge (tmp_edge
, sizeof (int));
562 LATCH_EDGE (tmp_edge
) = 1;
566 free_aux_for_blocks ();
567 free_aux_for_edges ();
569 #ifdef ENABLE_CHECKING
570 verify_dominators (CDI_DOMINATORS
);
574 /* Initialize all the parallel_p fields of the loops structure to true. */
577 initialize_loops_parallel_p (struct loops
*loops
)
581 for (i
= 0; i
< loops
->num
; i
++)
583 struct loop
*loop
= loops
->parray
[i
];
584 loop
->parallel_p
= true;
588 /* Find all the natural loops in the function and save in LOOPS structure and
589 recalculate loop_depth information in basic block structures.
590 Return the number of natural loops found. */
593 flow_loops_find (struct loops
*loops
)
604 memset (loops
, 0, sizeof *loops
);
606 /* We are going to recount the maximum loop depth,
607 so throw away the last count. */
608 cfun
->max_loop_depth
= 0;
610 /* Taking care of this degenerate case makes the rest of
611 this code simpler. */
612 if (n_basic_blocks
== NUM_FIXED_BLOCKS
)
618 /* Ensure that the dominators are computed. */
619 calculate_dominance_info (CDI_DOMINATORS
);
621 /* Join loops with shared headers. */
622 canonicalize_loop_headers ();
624 /* Count the number of loop headers. This should be the
625 same as the number of natural loops. */
626 headers
= sbitmap_alloc (last_basic_block
);
627 sbitmap_zero (headers
);
633 int more_latches
= 0;
635 header
->loop_depth
= 0;
637 /* If we have an abnormal predecessor, do not consider the
638 loop (not worth the problems). */
639 FOR_EACH_EDGE (e
, ei
, header
->preds
)
640 if (e
->flags
& EDGE_ABNORMAL
)
645 FOR_EACH_EDGE (e
, ei
, header
->preds
)
647 basic_block latch
= e
->src
;
649 gcc_assert (!(e
->flags
& EDGE_ABNORMAL
));
651 /* Look for back edges where a predecessor is dominated
652 by this block. A natural loop has a single entry
653 node (header) that dominates all the nodes in the
654 loop. It also has single back edge to the header
655 from a latch node. */
656 if (latch
!= ENTRY_BLOCK_PTR
657 && dominated_by_p (CDI_DOMINATORS
, latch
, header
))
659 /* Shared headers should be eliminated by now. */
660 gcc_assert (!more_latches
);
662 SET_BIT (headers
, header
->index
);
668 /* Allocate loop structures. */
669 loops
->parray
= XCNEWVEC (struct loop
*, num_loops
+ 1);
671 /* Dummy loop containing whole function. */
672 loops
->parray
[0] = XCNEW (struct loop
);
673 loops
->parray
[0]->next
= NULL
;
674 loops
->parray
[0]->inner
= NULL
;
675 loops
->parray
[0]->outer
= NULL
;
676 loops
->parray
[0]->depth
= 0;
677 loops
->parray
[0]->pred
= NULL
;
678 loops
->parray
[0]->num_nodes
= n_basic_blocks
;
679 loops
->parray
[0]->latch
= EXIT_BLOCK_PTR
;
680 loops
->parray
[0]->header
= ENTRY_BLOCK_PTR
;
681 ENTRY_BLOCK_PTR
->loop_father
= loops
->parray
[0];
682 EXIT_BLOCK_PTR
->loop_father
= loops
->parray
[0];
684 loops
->tree_root
= loops
->parray
[0];
686 /* Find and record information about all the natural loops
690 bb
->loop_father
= loops
->tree_root
;
694 /* Compute depth first search order of the CFG so that outer
695 natural loops will be found before inner natural loops. */
696 dfs_order
= XNEWVEC (int, n_basic_blocks
);
697 rc_order
= XNEWVEC (int, n_basic_blocks
);
698 pre_and_rev_post_order_compute (dfs_order
, rc_order
, false);
700 /* Save CFG derived information to avoid recomputing it. */
701 loops
->cfg
.dfs_order
= dfs_order
;
702 loops
->cfg
.rc_order
= rc_order
;
706 for (b
= 0; b
< n_basic_blocks
- NUM_FIXED_BLOCKS
; b
++)
711 /* Search the nodes of the CFG in reverse completion order
712 so that we can find outer loops first. */
713 if (!TEST_BIT (headers
, rc_order
[b
]))
716 header
= BASIC_BLOCK (rc_order
[b
]);
718 loop
= loops
->parray
[num_loops
] = XCNEW (struct loop
);
720 loop
->header
= header
;
721 loop
->num
= num_loops
;
724 /* Look for the latch for this header block. */
725 FOR_EACH_EDGE (e
, ei
, header
->preds
)
727 basic_block latch
= e
->src
;
729 if (latch
!= ENTRY_BLOCK_PTR
730 && dominated_by_p (CDI_DOMINATORS
, latch
, header
))
737 flow_loop_tree_node_add (header
->loop_father
, loop
);
738 loop
->num_nodes
= flow_loop_nodes_find (loop
->header
, loop
);
741 /* Assign the loop nesting depth and enclosed loop level for each
743 flow_loops_level_compute (loops
);
745 loops
->num
= num_loops
;
746 initialize_loops_parallel_p (loops
);
749 sbitmap_free (headers
);
752 #ifdef ENABLE_CHECKING
754 verify_loop_structure (loops
);
760 /* Return nonzero if basic block BB belongs to LOOP. */
762 flow_bb_inside_loop_p (const struct loop
*loop
, const basic_block bb
)
764 struct loop
*source_loop
;
766 if (bb
== ENTRY_BLOCK_PTR
|| bb
== EXIT_BLOCK_PTR
)
769 source_loop
= bb
->loop_father
;
770 return loop
== source_loop
|| flow_loop_nested_p (loop
, source_loop
);
773 /* Enumeration predicate for get_loop_body. */
775 glb_enum_p (basic_block bb
, void *glb_header
)
777 return bb
!= (basic_block
) glb_header
;
780 /* Gets basic blocks of a LOOP. Header is the 0-th block, rest is in dfs
781 order against direction of edges from latch. Specially, if
782 header != latch, latch is the 1-st block. */
784 get_loop_body (const struct loop
*loop
)
786 basic_block
*tovisit
, bb
;
789 gcc_assert (loop
->num_nodes
);
791 tovisit
= XCNEWVEC (basic_block
, loop
->num_nodes
);
792 tovisit
[tv
++] = loop
->header
;
794 if (loop
->latch
== EXIT_BLOCK_PTR
)
796 /* There may be blocks unreachable from EXIT_BLOCK. */
797 gcc_assert (loop
->num_nodes
== (unsigned) n_basic_blocks
);
800 tovisit
[tv
++] = EXIT_BLOCK_PTR
;
802 else if (loop
->latch
!= loop
->header
)
804 tv
= dfs_enumerate_from (loop
->latch
, 1, glb_enum_p
,
805 tovisit
+ 1, loop
->num_nodes
- 1,
809 gcc_assert (tv
== loop
->num_nodes
);
813 /* Fills dominance descendants inside LOOP of the basic block BB into
814 array TOVISIT from index *TV. */
817 fill_sons_in_loop (const struct loop
*loop
, basic_block bb
,
818 basic_block
*tovisit
, int *tv
)
820 basic_block son
, postpone
= NULL
;
822 tovisit
[(*tv
)++] = bb
;
823 for (son
= first_dom_son (CDI_DOMINATORS
, bb
);
825 son
= next_dom_son (CDI_DOMINATORS
, son
))
827 if (!flow_bb_inside_loop_p (loop
, son
))
830 if (dominated_by_p (CDI_DOMINATORS
, loop
->latch
, son
))
835 fill_sons_in_loop (loop
, son
, tovisit
, tv
);
839 fill_sons_in_loop (loop
, postpone
, tovisit
, tv
);
842 /* Gets body of a LOOP (that must be different from the outermost loop)
843 sorted by dominance relation. Additionally, if a basic block s dominates
844 the latch, then only blocks dominated by s are be after it. */
847 get_loop_body_in_dom_order (const struct loop
*loop
)
849 basic_block
*tovisit
;
852 gcc_assert (loop
->num_nodes
);
854 tovisit
= XCNEWVEC (basic_block
, loop
->num_nodes
);
856 gcc_assert (loop
->latch
!= EXIT_BLOCK_PTR
);
859 fill_sons_in_loop (loop
, loop
->header
, tovisit
, &tv
);
861 gcc_assert (tv
== (int) loop
->num_nodes
);
866 /* Get body of a LOOP in breadth first sort order. */
869 get_loop_body_in_bfs_order (const struct loop
*loop
)
877 gcc_assert (loop
->num_nodes
);
878 gcc_assert (loop
->latch
!= EXIT_BLOCK_PTR
);
880 blocks
= XCNEWVEC (basic_block
, loop
->num_nodes
);
881 visited
= BITMAP_ALLOC (NULL
);
884 while (i
< loop
->num_nodes
)
889 if (!bitmap_bit_p (visited
, bb
->index
))
891 /* This basic block is now visited */
892 bitmap_set_bit (visited
, bb
->index
);
896 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
898 if (flow_bb_inside_loop_p (loop
, e
->dest
))
900 if (!bitmap_bit_p (visited
, e
->dest
->index
))
902 bitmap_set_bit (visited
, e
->dest
->index
);
903 blocks
[i
++] = e
->dest
;
908 gcc_assert (i
>= vc
);
913 BITMAP_FREE (visited
);
917 /* Gets exit edges of a LOOP, returning their number in N_EDGES. */
919 get_loop_exit_edges (const struct loop
*loop
, unsigned int *num_edges
)
926 gcc_assert (loop
->latch
!= EXIT_BLOCK_PTR
);
928 body
= get_loop_body (loop
);
930 for (i
= 0; i
< loop
->num_nodes
; i
++)
931 FOR_EACH_EDGE (e
, ei
, body
[i
]->succs
)
932 if (!flow_bb_inside_loop_p (loop
, e
->dest
))
934 edges
= XNEWVEC (edge
, n
);
937 for (i
= 0; i
< loop
->num_nodes
; i
++)
938 FOR_EACH_EDGE (e
, ei
, body
[i
]->succs
)
939 if (!flow_bb_inside_loop_p (loop
, e
->dest
))
946 /* Counts the number of conditional branches inside LOOP. */
949 num_loop_branches (const struct loop
*loop
)
954 gcc_assert (loop
->latch
!= EXIT_BLOCK_PTR
);
956 body
= get_loop_body (loop
);
958 for (i
= 0; i
< loop
->num_nodes
; i
++)
959 if (EDGE_COUNT (body
[i
]->succs
) >= 2)
966 /* Adds basic block BB to LOOP. */
968 add_bb_to_loop (basic_block bb
, struct loop
*loop
)
972 bb
->loop_father
= loop
;
973 bb
->loop_depth
= loop
->depth
;
975 for (i
= 0; i
< loop
->depth
; i
++)
976 loop
->pred
[i
]->num_nodes
++;
979 /* Remove basic block BB from loops. */
981 remove_bb_from_loops (basic_block bb
)
984 struct loop
*loop
= bb
->loop_father
;
987 for (i
= 0; i
< loop
->depth
; i
++)
988 loop
->pred
[i
]->num_nodes
--;
989 bb
->loop_father
= NULL
;
993 /* Finds nearest common ancestor in loop tree for given loops. */
995 find_common_loop (struct loop
*loop_s
, struct loop
*loop_d
)
997 if (!loop_s
) return loop_d
;
998 if (!loop_d
) return loop_s
;
1000 if (loop_s
->depth
< loop_d
->depth
)
1001 loop_d
= loop_d
->pred
[loop_s
->depth
];
1002 else if (loop_s
->depth
> loop_d
->depth
)
1003 loop_s
= loop_s
->pred
[loop_d
->depth
];
1005 while (loop_s
!= loop_d
)
1007 loop_s
= loop_s
->outer
;
1008 loop_d
= loop_d
->outer
;
1013 /* Cancels the LOOP; it must be innermost one. */
1016 cancel_loop (struct loops
*loops
, struct loop
*loop
)
1021 gcc_assert (!loop
->inner
);
1023 /* Move blocks up one level (they should be removed as soon as possible). */
1024 bbs
= get_loop_body (loop
);
1025 for (i
= 0; i
< loop
->num_nodes
; i
++)
1026 bbs
[i
]->loop_father
= loop
->outer
;
1028 /* Remove the loop from structure. */
1029 flow_loop_tree_node_remove (loop
);
1031 /* Remove loop from loops array. */
1032 loops
->parray
[loop
->num
] = NULL
;
1034 /* Free loop data. */
1035 flow_loop_free (loop
);
1038 /* Cancels LOOP and all its subloops. */
1040 cancel_loop_tree (struct loops
*loops
, struct loop
*loop
)
1043 cancel_loop_tree (loops
, loop
->inner
);
1044 cancel_loop (loops
, loop
);
1047 /* Checks that LOOPS are all right:
1048 -- sizes of loops are all right
1049 -- results of get_loop_body really belong to the loop
1050 -- loop header have just single entry edge and single latch edge
1051 -- loop latches have only single successor that is header of their loop
1052 -- irreducible loops are correctly marked
1055 verify_loop_structure (struct loops
*loops
)
1057 unsigned *sizes
, i
, j
;
1059 basic_block
*bbs
, bb
;
1065 sizes
= XCNEWVEC (unsigned, loops
->num
);
1069 for (loop
= bb
->loop_father
; loop
; loop
= loop
->outer
)
1072 for (i
= 0; i
< loops
->num
; i
++)
1074 if (!loops
->parray
[i
])
1077 if (loops
->parray
[i
]->num_nodes
!= sizes
[i
])
1079 error ("size of loop %d should be %d, not %d",
1080 i
, sizes
[i
], loops
->parray
[i
]->num_nodes
);
1085 /* Check get_loop_body. */
1086 for (i
= 1; i
< loops
->num
; i
++)
1088 loop
= loops
->parray
[i
];
1091 bbs
= get_loop_body (loop
);
1093 for (j
= 0; j
< loop
->num_nodes
; j
++)
1094 if (!flow_bb_inside_loop_p (loop
, bbs
[j
]))
1096 error ("bb %d do not belong to loop %d",
1103 /* Check headers and latches. */
1104 for (i
= 1; i
< loops
->num
; i
++)
1106 loop
= loops
->parray
[i
];
1110 if ((loops
->state
& LOOPS_HAVE_PREHEADERS
)
1111 && EDGE_COUNT (loop
->header
->preds
) != 2)
1113 error ("loop %d's header does not have exactly 2 entries", i
);
1116 if (loops
->state
& LOOPS_HAVE_SIMPLE_LATCHES
)
1118 if (!single_succ_p (loop
->latch
))
1120 error ("loop %d's latch does not have exactly 1 successor", i
);
1123 if (single_succ (loop
->latch
) != loop
->header
)
1125 error ("loop %d's latch does not have header as successor", i
);
1128 if (loop
->latch
->loop_father
!= loop
)
1130 error ("loop %d's latch does not belong directly to it", i
);
1134 if (loop
->header
->loop_father
!= loop
)
1136 error ("loop %d's header does not belong directly to it", i
);
1139 if ((loops
->state
& LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS
)
1140 && (loop_latch_edge (loop
)->flags
& EDGE_IRREDUCIBLE_LOOP
))
1142 error ("loop %d's latch is marked as part of irreducible region", i
);
1147 /* Check irreducible loops. */
1148 if (loops
->state
& LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS
)
1150 /* Record old info. */
1151 irreds
= sbitmap_alloc (last_basic_block
);
1155 if (bb
->flags
& BB_IRREDUCIBLE_LOOP
)
1156 SET_BIT (irreds
, bb
->index
);
1158 RESET_BIT (irreds
, bb
->index
);
1159 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
1160 if (e
->flags
& EDGE_IRREDUCIBLE_LOOP
)
1161 e
->flags
|= EDGE_ALL_FLAGS
+ 1;
1165 mark_irreducible_loops (loops
);
1172 if ((bb
->flags
& BB_IRREDUCIBLE_LOOP
)
1173 && !TEST_BIT (irreds
, bb
->index
))
1175 error ("basic block %d should be marked irreducible", bb
->index
);
1178 else if (!(bb
->flags
& BB_IRREDUCIBLE_LOOP
)
1179 && TEST_BIT (irreds
, bb
->index
))
1181 error ("basic block %d should not be marked irreducible", bb
->index
);
1184 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
1186 if ((e
->flags
& EDGE_IRREDUCIBLE_LOOP
)
1187 && !(e
->flags
& (EDGE_ALL_FLAGS
+ 1)))
1189 error ("edge from %d to %d should be marked irreducible",
1190 e
->src
->index
, e
->dest
->index
);
1193 else if (!(e
->flags
& EDGE_IRREDUCIBLE_LOOP
)
1194 && (e
->flags
& (EDGE_ALL_FLAGS
+ 1)))
1196 error ("edge from %d to %d should not be marked irreducible",
1197 e
->src
->index
, e
->dest
->index
);
1200 e
->flags
&= ~(EDGE_ALL_FLAGS
+ 1);
1206 /* Check the single_exit. */
1207 if (loops
->state
& LOOPS_HAVE_MARKED_SINGLE_EXITS
)
1209 memset (sizes
, 0, sizeof (unsigned) * loops
->num
);
1213 if (bb
->loop_father
== loops
->tree_root
)
1215 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
1217 if (e
->dest
== EXIT_BLOCK_PTR
)
1220 if (flow_bb_inside_loop_p (bb
->loop_father
, e
->dest
))
1223 for (loop
= bb
->loop_father
;
1224 loop
!= e
->dest
->loop_father
;
1228 if (loop
->single_exit
1229 && loop
->single_exit
!= e
)
1231 error ("wrong single exit %d->%d recorded for loop %d",
1232 loop
->single_exit
->src
->index
,
1233 loop
->single_exit
->dest
->index
,
1235 error ("right exit is %d->%d",
1236 e
->src
->index
, e
->dest
->index
);
1243 for (i
= 1; i
< loops
->num
; i
++)
1245 loop
= loops
->parray
[i
];
1250 && !loop
->single_exit
)
1252 error ("single exit not recorded for loop %d", loop
->num
);
1257 && loop
->single_exit
)
1259 error ("loop %d should not have single exit (%d -> %d)",
1261 loop
->single_exit
->src
->index
,
1262 loop
->single_exit
->dest
->index
);
1273 /* Returns latch edge of LOOP. */
1275 loop_latch_edge (const struct loop
*loop
)
1277 return find_edge (loop
->latch
, loop
->header
);
1280 /* Returns preheader edge of LOOP. */
1282 loop_preheader_edge (const struct loop
*loop
)
1287 FOR_EACH_EDGE (e
, ei
, loop
->header
->preds
)
1288 if (e
->src
!= loop
->latch
)
1294 /* Returns true if E is an exit of LOOP. */
1297 loop_exit_edge_p (const struct loop
*loop
, edge e
)
1299 return (flow_bb_inside_loop_p (loop
, e
->src
)
1300 && !flow_bb_inside_loop_p (loop
, e
->dest
));