aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMichael Hayes <m.hayes@elec.canterbury.ac.nz>2000-02-12 21:15:15 +0000
committerMichael Hayes <m.hayes@gcc.gnu.org>2000-02-12 21:15:15 +0000
commit3abd3239f3333c81e890f5aeefb7e4d06b526920 (patch)
tree1b7cbf9c800a43242297b150566f7fa69f3d670d /gcc
parentf5b647ab0f42fca1c078818cac72cb0003b762ac (diff)
downloadgcc-3abd3239f3333c81e890f5aeefb7e4d06b526920.zip
gcc-3abd3239f3333c81e890f5aeefb7e4d06b526920.tar.gz
gcc-3abd3239f3333c81e890f5aeefb7e4d06b526920.tar.bz2
flow.c (flow_loop_tree_node_add): Use better algorithm by passing previously inserted node instead of root node.
* flow.c (flow_loop_tree_node_add): Use better algorithm by passing previously inserted node instead of root node. Caller changed. From-SVN: r31948
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/flow.c46
2 files changed, 26 insertions, 27 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 229c6b8..4e3bf23 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,4 +1,9 @@
-2000-02-12 Michael Hayes <m.hayes@elec.canterbury.ac.nz>
+2000-02-13 Michael Hayes <m.hayes@elec.canterbury.ac.nz>
+
+ * flow.c (flow_loop_tree_node_add): Use better algorithm by passing
+ previously inserted node instead of root node. Caller changed.
+
+2000-02-13 Michael Hayes <m.hayes@elec.canterbury.ac.nz>
* basic-block.h (FLOW_LOOP_FIRST_BLOCK, FLOW_LOOP_LAST_BLOCK): Delete.
diff --git a/gcc/flow.c b/gcc/flow.c
index 49b2ae1..6508075 100644
--- a/gcc/flow.c
+++ b/gcc/flow.c
@@ -6716,41 +6716,35 @@ flow_loop_pre_header_find (header, dom)
}
-/* Add LOOP to the loop hierarchy tree so that it is a sibling or a
- descendant of ROOT. */
+/* Add LOOP to the loop hierarchy tree where PREVLOOP was the loop
+ previously added. The insertion algorithm assumes that the loops
+ are added in the order found by a depth first search of the CFG. */
static void
-flow_loop_tree_node_add (root, loop)
- struct loop *root;
+flow_loop_tree_node_add (prevloop, loop)
+ struct loop *prevloop;
struct loop *loop;
{
- struct loop *outer;
- if (! loop)
- return;
+ if (flow_loop_nested_p (prevloop, loop))
+ {
+ prevloop->inner = loop;
+ loop->outer = prevloop;
+ return;
+ }
- for (outer = root; outer; outer = outer->next)
+ while (prevloop->outer)
{
- if (flow_loop_nested_p (outer, loop))
+ if (flow_loop_nested_p (prevloop->outer, loop))
{
- if (outer->inner)
- {
- /* Add LOOP as a sibling or descendent of OUTER->INNER. */
- flow_loop_tree_node_add (outer->inner, loop);
- }
- else
- {
- /* Add LOOP as child of OUTER. */
- outer->inner = loop;
- loop->outer = outer;
- loop->next = NULL;
- }
+ prevloop->next = loop;
+ loop->outer = prevloop->outer;
return;
}
+ prevloop = prevloop->outer;
}
- /* Add LOOP as a sibling of ROOT. */
- loop->next = root->next;
- root->next = loop;
- loop->outer = root->outer;
+
+ prevloop->next = loop;
+ loop->outer = NULL;
}
@@ -6774,7 +6768,7 @@ flow_loops_tree_build (loops)
/* Add the remaining loops to the tree. */
for (i = 1; i < num_loops; i++)
- flow_loop_tree_node_add (loops->tree, &loops->array[i]);
+ flow_loop_tree_node_add (&loops->array[i - 1], &loops->array[i]);
}