aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorSteven Bosscher <steven@gcc.gnu.org>2007-03-15 20:08:29 +0000
committerSteven Bosscher <steven@gcc.gnu.org>2007-03-15 20:08:29 +0000
commit49ea3702aa813f8181f4803830e0506abbd19e7a (patch)
tree9b1ab29c213a2680b9ef2b4f06ef1795ab842e8d /gcc
parent30bcc028906e873ba60715aaed036248e1420e10 (diff)
downloadgcc-49ea3702aa813f8181f4803830e0506abbd19e7a.zip
gcc-49ea3702aa813f8181f4803830e0506abbd19e7a.tar.gz
gcc-49ea3702aa813f8181f4803830e0506abbd19e7a.tar.bz2
cfglayout.c (fixup_reorder_chain): Postpone deleting dead jump tables...
* 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. From-SVN: r122957
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/cfglayout.c4
-rw-r--r--gcc/cfgrtl.c7
3 files changed, 17 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2567719..32724cc 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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>
diff --git a/gcc/cfglayout.c b/gcc/cfglayout.c
index 545cc5d..ef085fc 100644
--- a/gcc/cfglayout.c
+++ b/gcc/cfglayout.c
@@ -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
diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c
index 1eb75ab..9bc2b99 100644
--- a/gcc/cfgrtl.c
+++ b/gcc/cfgrtl.c
@@ -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)))));
}