diff options
author | m.hayes <m.hayes@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-10-18 10:10:38 +0000 |
---|---|---|
committer | m.hayes <m.hayes@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-10-18 10:10:38 +0000 |
commit | 1f080ed568030b75e5e6ac7512353f0bbeb4e6bb (patch) | |
tree | 272f90028f7da21af93c7b1200feddb5dd5c0ecb | |
parent | 641502d98c352a6648aafbd395baa32dfb1fa81b (diff) | |
download | gcc-1f080ed568030b75e5e6ac7512353f0bbeb4e6bb.tar.gz |
* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@36934 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/basic-block.h | 10 | ||||
-rw-r--r-- | gcc/flow.c | 48 |
3 files changed, 44 insertions, 23 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 46e67c24ee7..1345e5fb510 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2000-10-18 Michael Hayes <mhayes@cygnus.com> + + * 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. + 2000-10-18 Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at> * contrib.texi: Update references to steering committee members diff --git a/gcc/basic-block.h b/gcc/basic-block.h index 2d6e2d42294..04177ebbda2 100644 --- a/gcc/basic-block.h +++ b/gcc/basic-block.h @@ -276,11 +276,13 @@ struct loop /* Basic block of loop pre-header or NULL if it does not exist. */ basic_block pre_header; - /* Root node of pre_header extended basic block. */ - basic_block pre_header_root; + /* Array of edges along the pre-header extended basic block trace. + The source of the first edge is the root node of pre-header + extended basic block, if it exists. */ + edge *pre_header_edges; - /* Bitmap of blocks of trace from pre_header root to pre_header. */ - sbitmap pre_header_trace; + /* Number of edges along the pre_header extended basic block trace. */ + int num_pre_header_edges; /* The first block in the loop. This is not necessarily the same as the loop header. */ diff --git a/gcc/flow.c b/gcc/flow.c index 2f56e91dde8..d286f91e2b3 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; } |