From 4ed88ee36cb81d22afeb3b5beba1d1655642b46b Mon Sep 17 00:00:00 2001 From: Zdenek Dvorak Date: Wed, 25 Jul 2007 01:31:28 +0200 Subject: [PATCH] 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 --- gcc/ChangeLog | 5 +++++ gcc/cfgloop.c | 48 ++++++++++++++++++++++++++++++------------------ 2 files changed, 35 insertions(+), 18 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 127fa6cb5d0..bc794a25a42 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2007-07-25 Zdenek Dvorak + + * cfgloop.c (init_loops_structure): New function. + (flow_loops_find): Create root of the loop tree unconditionally. + 2007-07-24 Daniel Jacobowitz * tree-ssa-ccp.c (fold_const_aggregate_ref): Use fold_convert. diff --git a/gcc/cfgloop.c b/gcc/cfgloop.c index 63637980c44..6542b3a5ed5 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. */