aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosef Zlomek <zlomek@matfyz.cz>2001-12-21 02:50:10 +0100
committerRichard Henderson <rth@gcc.gnu.org>2001-12-20 17:50:10 -0800
commitb09d108b488516d1fc8225ab460799d5e8c6dab9 (patch)
tree32379513001dec81f4dca82b4d14e1161d02c07c
parentf350566bf47f2584ccb8a7671ad6ffd4aa82a6b5 (diff)
downloadgcc-b09d108b488516d1fc8225ab460799d5e8c6dab9.zip
gcc-b09d108b488516d1fc8225ab460799d5e8c6dab9.tar.gz
gcc-b09d108b488516d1fc8225ab460799d5e8c6dab9.tar.bz2
cfgloop.c (flow_loops_find): Use the information of the depth first search order of the CFG correctly when...
* cfgloop.c (flow_loops_find): Use the information of the depth first search order of the CFG correctly when finding natural loops. From-SVN: r48227
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/cfgloop.c28
2 files changed, 19 insertions, 14 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5caed01..0db4281 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2001-12-20 Josef Zlomek <zlomek@matfyz.cz>
+
+ * cfgloop.c (flow_loops_find): Use the information of the depth
+ first search order of the CFG correctly when finding natural loops.
+
2001-12-20 Richard Henderson <rth@redhat.com>
* config/alpha/alpha.md (prologue_mcount): Update for explicit relocs.
diff --git a/gcc/cfgloop.c b/gcc/cfgloop.c
index cabd2f2..a94cbfe 100644
--- a/gcc/cfgloop.c
+++ b/gcc/cfgloop.c
@@ -737,26 +737,26 @@ flow_loops_find (loops, flags)
/* Find and record information about all the natural loops
in the CFG. */
num_loops = 0;
- for (b = 0; b < n_basic_blocks; b++)
+ for (b = n_basic_blocks - 1; b >= 0; b--)
{
- basic_block header;
+ basic_block latch;
/* Search the nodes of the CFG in reverse completion order
so that we can find outer loops first. */
- header = BASIC_BLOCK (rc_order[b]);
+ latch = BASIC_BLOCK (rc_order[b]);
- /* Look for all the possible latch blocks for this header. */
- for (e = header->pred; e; e = e->pred_next)
+ /* Look for all the possible headers for this latch block. */
+ for (e = latch->succ; e; e = e->succ_next)
{
- basic_block latch = e->src;
-
- /* Look for back edges where a predecessor is dominated
- by this block. A natural loop has a single entry
- node (header) that dominates all the nodes in the
- loop. It also has single back edge to the header
- from a latch node. Note that multiple natural loops
- may share the same header. */
- if (latch != ENTRY_BLOCK_PTR
+ basic_block header = e->dest;
+
+ /* Look for forward edges where this block is dominated by
+ a successor of this block. A natural loop has a single
+ entry node (header) that dominates all the nodes in the
+ loop. It also has single back edge to the header from a
+ latch node. Note that multiple natural loops may share
+ the same header. */
+ if (header != EXIT_BLOCK_PTR
&& TEST_BIT (dom[latch->index], header->index))
{
struct loop *loop;