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
This commit is contained in:
Michael Hayes 2000-10-18 10:10:38 +00:00 committed by Michael Hayes
parent 42c1075091
commit 4a7da9b553
3 changed files with 44 additions and 23 deletions

View File

@ -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

View File

@ -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. */

View File

@ -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;
}