diff options
author | Michael Hayes <m.hayes@elec.canterbury.ac.nz> | 2000-02-12 21:15:15 +0000 |
---|---|---|
committer | Michael Hayes <m.hayes@gcc.gnu.org> | 2000-02-12 21:15:15 +0000 |
commit | 3abd3239f3333c81e890f5aeefb7e4d06b526920 (patch) | |
tree | 1b7cbf9c800a43242297b150566f7fa69f3d670d /gcc/flow.c | |
parent | f5b647ab0f42fca1c078818cac72cb0003b762ac (diff) | |
download | gcc-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/flow.c')
-rw-r--r-- | gcc/flow.c | 46 |
1 files changed, 20 insertions, 26 deletions
@@ -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]); } |