* cfgcleanup.c (try_forward_edges): Allow multiple jump threading.
authorJan Hubicka <jh@suse.cz>
Sat, 5 Jan 2002 10:52:54 +0000 (11:52 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Sat, 5 Jan 2002 10:52:54 +0000 (10:52 +0000)
From-SVN: r48563

gcc/ChangeLog
gcc/cfgcleanup.c

index ebcf344b53439a35139a99fc13ba847ae981a9d6..2ada63479fe365dcd2f1e8f906c0886251c6c98e 100644 (file)
@@ -1,3 +1,7 @@
+Sat Jan  5 11:52:05 CET 2002  Jan Hubicka  <jh@suse.cz>
+
+       * cfgcleanup.c (try_forward_edges): Allow multiple jump threading.
+
 2002-01-05  Neil Booth  <neil@daikokuya.demon.co.uk>
 
        * doc/cppinternals.texi: Update.
index f4aec511b9f9c0d9f7b7bd3eb8e98c534110b5df..96dee62519ec5d7b4dc41d16dab3051c30443bbf 100644 (file)
@@ -369,7 +369,8 @@ try_forward_edges (mode, b)
      int mode;
 {
   bool changed = false;
-  edge e, next, threaded_edge;
+  edge e, next, *threaded_edges = NULL;
+  int nthreaded_edges = 0;
 
   for (e = b->succ; e; e = next)
     {
@@ -406,13 +407,17 @@ try_forward_edges (mode, b)
 
          /* Allow to thread only over one edge at time to simplify updating
             of probabilities.  */
-         else if ((mode & CLEANUP_THREADING) && !threaded)
+         else if (mode & CLEANUP_THREADING)
            {
-             threaded_edge = thread_jump (mode, e, target);
-             if (threaded_edge)
+             edge t = thread_jump (mode, e, target);
+             if (t)
                {
-                 new_target = threaded_edge->dest;
+                 new_target = t->dest;
                  new_target_threaded = true;
+                 if (!nthreaded_edges)
+                   threaded_edges = xmalloc (sizeof (*threaded_edges)
+                                             * n_basic_blocks);
+                 threaded_edges[nthreaded_edges++] = t;
                }
            }
 
@@ -462,6 +467,7 @@ try_forward_edges (mode, b)
          gcov_type edge_count = e->count;
          int edge_probability = e->probability;
          int edge_frequency;
+         int n = 0;
 
          /* Don't force if target is exit block.  */
          if (threaded && target != EXIT_BLOCK_PTR)
@@ -498,7 +504,7 @@ try_forward_edges (mode, b)
              first->succ->count -= edge_count;
              first->frequency -= edge_frequency;
              if (first->succ->succ_next)
-               t = threaded_edge;
+               t = threaded_edges [n++];
              else
                t = first->succ;
 
@@ -510,6 +516,8 @@ try_forward_edges (mode, b)
        }
     }
 
+  if (threaded_edges)
+    free (threaded_edges);
   return changed;
 }
 \f