OSDN Git Service

* tree-cfg.c (cleanup_tree_cfg): Don't iterate on
authorkazu <kazu@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 18 Oct 2004 21:16:53 +0000 (21:16 +0000)
committerkazu <kazu@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 18 Oct 2004 21:16:53 +0000 (21:16 +0000)
thread_jumps.
(thread_jumps): Iterate until no new forwarder block arises.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@89244 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/tree-cfg.c

index 94e4101..fb1fe2f 100644 (file)
@@ -1,5 +1,11 @@
 2004-10-18  Kazu Hirata  <kazu@cs.umass.edu>
 
+       * tree-cfg.c (cleanup_tree_cfg): Don't iterate on
+       thread_jumps.
+       (thread_jumps): Iterate until no new forwarder block arises.
+
+2004-10-18  Kazu Hirata  <kazu@cs.umass.edu>
+
        * tree-cfg.c (tree_forwarder_block_p): Don't set forwardable.
        (thread_jumps): Use forwardable as cache of
        tree_forwarder_block_p throughout the function.
index 3fd8232..012ad70 100644 (file)
@@ -718,18 +718,14 @@ cleanup_tree_cfg (void)
 
   retval = cleanup_control_flow ();
   retval |= delete_unreachable_blocks ();
-
-  /* thread_jumps sometimes leaves further transformation
-     opportunities for itself, so iterate on it until nothing
-     changes.  */
-  while (thread_jumps ())
-    retval = true;
+  retval |= thread_jumps ();
 
 #ifdef ENABLE_CHECKING
   if (retval)
     {
       gcc_assert (!cleanup_control_flow ());
       gcc_assert (!delete_unreachable_blocks ());
+      gcc_assert (!thread_jumps ());
     }
 #endif
 
@@ -3780,10 +3776,13 @@ thread_jumps (void)
     tree phi;
   int arg;
   bool retval = false;
+  bool rerun;
 
   FOR_EACH_BB (bb)
     bb_ann (bb)->forwardable = tree_forwarder_block_p (bb);
 
+ restart:
+  rerun = false;
   FOR_EACH_BB (bb)
     {
       edge_iterator ei;
@@ -3945,8 +3944,10 @@ thread_jumps (void)
         two arms eventually merge without any intervening
         statements.  */
       if (this_jump_threaded && tree_forwarder_block_p (bb))
-       bb_ann (bb)->forwardable = true;
+       bb_ann (bb)->forwardable = rerun = true;
     }
+  if (rerun)
+    goto restart;
 
   return retval;
 }