* cfglayout.c (fixup_reorder_chain): Postpone deleting dead
authorsteven <steven@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 15 Mar 2007 20:08:29 +0000 (20:08 +0000)
committersteven <steven@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 15 Mar 2007 20:08:29 +0000 (20:08 +0000)
jump tables, move the call to delete_dead_jumptables from here...
(cfg_layout_finalize): ...to here.  But rebuild jump labels first.
* cfgrtl.c (cfg_layout_can_merge_blocks_p): When not optimizing,
don't allow merging of blocks that try_redirect_by_replacing_jump
also does not handle when not optimizing.

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

gcc/ChangeLog
gcc/cfglayout.c
gcc/cfgrtl.c

index 2567719..32724cc 100644 (file)
@@ -1,3 +1,13 @@
+2007-03-15  Steven Bosscher  <steven@gcc.gnu.org>
+
+       PR middle-end/31159
+       * cfglayout.c (fixup_reorder_chain): Postpone deleting dead
+       jump tables, move the call to delete_dead_jumptables from here...
+       (cfg_layout_finalize): ...to here.  But rebuild jump labels first.
+       * cfgrtl.c (cfg_layout_can_merge_blocks_p): When not optimizing,
+       don't allow merging of blocks that try_redirect_by_replacing_jump
+       also does not handle when not optimizing.
+
 2007-03-15  Uros Bizjak  <ubizjak@gmail.com>
            Francois-Xavier Coudert  <coudert@clipper.ens.fr>
 
index 545cc5d..ef085fc 100644 (file)
@@ -697,7 +697,6 @@ fixup_reorder_chain (void)
 #ifdef ENABLE_CHECKING
   verify_insn_chain ();
 #endif
-  delete_dead_jumptables ();
 
   /* Now add jumps and labels as needed to match the blocks new
      outgoing edges.  */
@@ -1193,6 +1192,9 @@ cfg_layout_finalize (void)
     fixup_fallthru_exit_predecessor ();
   fixup_reorder_chain ();
 
+  rebuild_jump_labels (get_insns ());
+  delete_dead_jumptables ();
+
 #ifdef ENABLE_CHECKING
   verify_insn_chain ();
 #endif
index 1eb75ab..9bc2b99 100644 (file)
@@ -2519,10 +2519,11 @@ cfg_layout_can_merge_blocks_p (basic_block a, basic_block b)
          /* Must be simple edge.  */
          && !(single_succ_edge (a)->flags & EDGE_COMPLEX)
          && a != ENTRY_BLOCK_PTR && b != EXIT_BLOCK_PTR
-         /* If the jump insn has side effects,
-            we can't kill the edge.  */
+         /* If the jump insn has side effects, we can't kill the edge.
+            When not optimizing, try_redirect_by_replacing_jump will
+            not allow us to redirect an edge by replacing a table jump.  */
          && (!JUMP_P (BB_END (a))
-             || (reload_completed
+             || ((!optimize || reload_completed)
                  ? simplejump_p (BB_END (a)) : onlyjump_p (BB_END (a)))));
 }