summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorm.hayes <m.hayes@138bc75d-0d04-0410-961f-82ee72b054a4>2000-10-18 10:10:38 +0000
committerm.hayes <m.hayes@138bc75d-0d04-0410-961f-82ee72b054a4>2000-10-18 10:10:38 +0000
commit1f080ed568030b75e5e6ac7512353f0bbeb4e6bb (patch)
tree272f90028f7da21af93c7b1200feddb5dd5c0ecb
parent641502d98c352a6648aafbd395baa32dfb1fa81b (diff)
downloadgcc-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/ChangeLog9
-rw-r--r--gcc/basic-block.h10
-rw-r--r--gcc/flow.c48
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;
}