flow.c (flow_loop_tree_node_add): Use better algorithm by passing previously inserted...
authorMichael Hayes <m.hayes@elec.canterbury.ac.nz>
Sat, 12 Feb 2000 21:15:15 +0000 (21:15 +0000)
committerMichael Hayes <m.hayes@gcc.gnu.org>
Sat, 12 Feb 2000 21:15:15 +0000 (21:15 +0000)
* flow.c (flow_loop_tree_node_add): Use better algorithm by passing
  previously inserted node instead of root node. Caller changed.

From-SVN: r31948

gcc/ChangeLog
gcc/flow.c

index 229c6b89e5998e11f5a37bab8b3de8452650deeb..4e3bf23ff5092b292a3bc65b8641cc0250954a16 100644 (file)
@@ -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.
 
index 49b2ae16422400f9a838946e50102d67f7166a38..6508075ebaa5348e566e29bc58ffbd4347092d0d 100644 (file)
@@ -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]);
 }