aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZdenek Dvorak <dvorakz@suse.cz>2007-07-25 01:31:28 +0200
committerZdenek Dvorak <rakdver@gcc.gnu.org>2007-07-24 23:31:28 +0000
commit4ed88ee36cb81d22afeb3b5beba1d1655642b46b (patch)
treea96cbdf48b071cfed25532a66f9b0589d936deee
parent7d0a07d0c66be19ec1bd822242a6451dc0d3b024 (diff)
downloadgcc-4ed88ee36cb81d22afeb3b5beba1d1655642b46b.zip
gcc-4ed88ee36cb81d22afeb3b5beba1d1655642b46b.tar.gz
gcc-4ed88ee36cb81d22afeb3b5beba1d1655642b46b.tar.bz2
cfgloop.c (init_loops_structure): New function.
* cfgloop.c (init_loops_structure): New function. (flow_loops_find): Create root of the loop tree unconditionally. From-SVN: r126891
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/cfgloop.c48
2 files changed, 35 insertions, 18 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 127fa6c..bc794a2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2007-07-25 Zdenek Dvorak <dvorakz@suse.cz>
+
+ * cfgloop.c (init_loops_structure): New function.
+ (flow_loops_find): Create root of the loop tree unconditionally.
+
2007-07-24 Daniel Jacobowitz <dan@codesourcery.com>
* tree-ssa-ccp.c (fold_const_aggregate_ref): Use fold_convert.
diff --git a/gcc/cfgloop.c b/gcc/cfgloop.c
index 6363798..6542b3a 100644
--- a/gcc/cfgloop.c
+++ b/gcc/cfgloop.c
@@ -343,6 +343,29 @@ alloc_loop (void)
return loop;
}
+/* Initializes loops structure LOOPS, reserving place for NUM_LOOPS loops
+ (including the root of the loop tree). */
+
+static void
+init_loops_structure (struct loops *loops, unsigned num_loops)
+{
+ struct loop *root;
+
+ memset (loops, 0, sizeof *loops);
+ loops->larray = VEC_alloc (loop_p, gc, num_loops);
+
+ /* Dummy loop containing whole function. */
+ root = alloc_loop ();
+ root->num_nodes = n_basic_blocks;
+ root->latch = EXIT_BLOCK_PTR;
+ root->header = ENTRY_BLOCK_PTR;
+ ENTRY_BLOCK_PTR->loop_father = root;
+ EXIT_BLOCK_PTR->loop_father = root;
+
+ VEC_quick_push (loop_p, loops->larray, root);
+ loops->tree_root = root;
+}
+
/* Find all the natural loops in the function and save in LOOPS structure and
recalculate loop_depth information in basic block structures.
Return the number of natural loops found. */
@@ -358,21 +381,21 @@ flow_loops_find (struct loops *loops)
int *rc_order;
basic_block header;
basic_block bb;
- struct loop *root;
- memset (loops, 0, sizeof *loops);
+ /* Ensure that the dominators are computed. */
+ calculate_dominance_info (CDI_DOMINATORS);
/* Taking care of this degenerate case makes the rest of
this code simpler. */
if (n_basic_blocks == NUM_FIXED_BLOCKS)
- return 0;
+ {
+ init_loops_structure (loops, 1);
+ return 1;
+ }
dfs_order = NULL;
rc_order = NULL;
- /* Ensure that the dominators are computed. */
- calculate_dominance_info (CDI_DOMINATORS);
-
/* Count the number of loop headers. This should be the
same as the number of natural loops. */
headers = sbitmap_alloc (last_basic_block);
@@ -415,18 +438,7 @@ flow_loops_find (struct loops *loops)
}
/* Allocate loop structures. */
- loops->larray = VEC_alloc (loop_p, gc, num_loops + 1);
-
- /* Dummy loop containing whole function. */
- root = alloc_loop ();
- root->num_nodes = n_basic_blocks;
- root->latch = EXIT_BLOCK_PTR;
- root->header = ENTRY_BLOCK_PTR;
- ENTRY_BLOCK_PTR->loop_father = root;
- EXIT_BLOCK_PTR->loop_father = root;
-
- VEC_quick_push (loop_p, loops->larray, root);
- loops->tree_root = root;
+ init_loops_structure (loops, num_loops + 1);
/* Find and record information about all the natural loops
in the CFG. */