aboutsummaryrefslogtreecommitdiff
path: root/gcc/flow.c
diff options
context:
space:
mode:
authorMichael Hayes <mhayes@cygnus.com>2000-10-18 10:10:38 +0000
committerMichael Hayes <m.hayes@gcc.gnu.org>2000-10-18 10:10:38 +0000
commit4a7da9b55397ecac9f71f3b4f3020ba242ee385c (patch)
tree272f90028f7da21af93c7b1200feddb5dd5c0ecb /gcc/flow.c
parent42c10750911b52ea95101f93eb29803c9064a420 (diff)
downloadgcc-4a7da9b55397ecac9f71f3b4f3020ba242ee385c.zip
gcc-4a7da9b55397ecac9f71f3b4f3020ba242ee385c.tar.gz
gcc-4a7da9b55397ecac9f71f3b4f3020ba242ee385c.tar.bz2
basic-block.h (struct loop): Delete fields pre_header_root and pre_header_trace and replace with...
* basic-block.h (struct loop): Delete fields pre_header_root and pre_header_trace and replace with pre_header_edges and num_pre_header_edges. * flow.c (flow_loop_dump): Dump pre_header_edges. (flow_loops_free): Free pre_header_edges. (flow_loop_pre_header_scan): Calculate pre_header_edges. From-SVN: r36934
Diffstat (limited to 'gcc/flow.c')
-rw-r--r--gcc/flow.c48
1 files changed, 29 insertions, 19 deletions
diff --git a/gcc/flow.c b/gcc/flow.c
index 2f56e91..d286f91 100644
--- a/gcc/flow.c
+++ b/gcc/flow.c
@@ -7409,12 +7409,9 @@ flow_loop_dump (loop, file, loop_dump_aux, verbose)
loop->depth, loop->level,
(long) (loop->outer ? loop->outer->num : -1));
- if (loop->pre_header_root)
- fprintf (file, ";; pre-header root %d\n",
- loop->pre_header_root->index);
- if (loop->pre_header_trace)
- flow_nodes_print (";; pre-header trace", loop->pre_header_trace,
- file);
+ if (loop->pre_header_edges)
+ flow_edge_list_print (";; pre-header edges", loop->pre_header_edges,
+ loop->num_pre_header_edges, file);
flow_edge_list_print (";; entry edges", loop->entry_edges,
loop->num_entries, file);
fprintf (file, ";; %d", loop->num_nodes);
@@ -7505,8 +7502,8 @@ flow_loops_free (loops)
{
struct loop *loop = &loops->array[i];
- if (loop->pre_header_trace)
- sbitmap_free (loop->pre_header_trace);
+ if (loop->pre_header_edges)
+ free (loop->pre_header_edges);
if (loop->nodes)
sbitmap_free (loop->nodes);
if (loop->entry_edges)
@@ -7888,35 +7885,48 @@ flow_dfs_compute_reverse_finish (data)
/* Find the root node of the loop pre-header extended basic block and
- the blocks along the trace from the root node to the loop header. */
+ the edges along the trace from the root node to the loop header. */
static void
flow_loop_pre_header_scan (loop)
struct loop *loop;
{
+ int num = 0;
basic_block ebb;
+ loop->num_pre_header_edges = 0;
+
if (loop->num_entries != 1)
return;
- /* Find pre_header root note and trace from root node to pre_header. */
- loop->pre_header_trace = sbitmap_alloc (n_basic_blocks);
- sbitmap_zero (loop->pre_header_trace);
-
ebb = loop->entry_edges[0]->src;
if (ebb != ENTRY_BLOCK_PTR)
{
- SET_BIT (loop->pre_header_trace, ebb->index);
- while (ebb->pred->src != ENTRY_BLOCK_PTR
- && ! ebb->pred->pred_next)
+ edge e;
+
+ /* Count number of edges along trace from loop header to
+ root of pre-header extended basic block. Usually this is
+ only one or two edges. */
+ num++;
+ while (ebb->pred->src != ENTRY_BLOCK_PTR && ! ebb->pred->pred_next)
{
ebb = ebb->pred->src;
- SET_BIT (loop->pre_header_trace, ebb->index);
+ num++;
+ }
+
+ loop->pre_header_edges = (edge *) xmalloc (num * sizeof (edge *));
+ loop->num_pre_header_edges = num;
+
+ /* Store edges in order that they are followed. The source
+ of the first edge is the root node of the pre-header extended
+ basic block and the destination of the last last edge is
+ the loop header. */
+ for (e = loop->entry_edges[0]; num; e = e->src->pred)
+ {
+ loop->pre_header_edges[--num] = e;
}
}
-
- loop->pre_header_root = ebb;
}