OSDN Git Service

* basic-block.h (struct loop): Delete fields pre_header_root
authorm.hayes <m.hayes@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 18 Oct 2000 10:10:38 +0000 (10:10 +0000)
committerm.hayes <m.hayes@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 18 Oct 2000 10:10:38 +0000 (10:10 +0000)
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

gcc/ChangeLog
gcc/basic-block.h
gcc/flow.c

index 46e67c2..1345e5f 100644 (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
index 2d6e2d4..04177eb 100644 (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.  */
index 2f56e91..d286f91 100644 (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;
 }