diff options
author | Michael Hayes <mhayes@cygnus.com> | 2000-10-18 10:10:38 +0000 |
---|---|---|
committer | Michael Hayes <m.hayes@gcc.gnu.org> | 2000-10-18 10:10:38 +0000 |
commit | 4a7da9b55397ecac9f71f3b4f3020ba242ee385c (patch) | |
tree | 272f90028f7da21af93c7b1200feddb5dd5c0ecb /gcc/flow.c | |
parent | 42c10750911b52ea95101f93eb29803c9064a420 (diff) | |
download | gcc-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.c | 48 |
1 files changed, 29 insertions, 19 deletions
@@ -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; } |