aboutsummaryrefslogtreecommitdiff
path: root/gcc/cfgrtl.c
diff options
context:
space:
mode:
authorJosef Zlomek <zlomekj@suse.cz>2003-10-31 15:09:34 +0100
committerJosef Zlomek <zlomek@gcc.gnu.org>2003-10-31 14:09:34 +0000
commit5d693491f01a654997620056407055080db63e66 (patch)
tree4ae0b86a996aa25b13e3815e1be851a43ff14a75 /gcc/cfgrtl.c
parentc2edc52b76c68acc7cf342c0485176902699c6e4 (diff)
downloadgcc-5d693491f01a654997620056407055080db63e66.zip
gcc-5d693491f01a654997620056407055080db63e66.tar.gz
gcc-5d693491f01a654997620056407055080db63e66.tar.bz2
cfgrtl.c (try_redirect_by_replacing_jump): Move jump immediatelly before BARRIER.
PR/11640 * cfgrtl.c (try_redirect_by_replacing_jump): Move jump immediatelly before BARRIER. From-SVN: r73142
Diffstat (limited to 'gcc/cfgrtl.c')
-rw-r--r--gcc/cfgrtl.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c
index f383438..7354c73 100644
--- a/gcc/cfgrtl.c
+++ b/gcc/cfgrtl.c
@@ -793,6 +793,30 @@ try_redirect_by_replacing_jump (edge e, basic_block target, bool in_cfglayout)
barrier = next_nonnote_insn (src->end);
if (!barrier || GET_CODE (barrier) != BARRIER)
emit_barrier_after (src->end);
+ else
+ {
+ if (barrier != NEXT_INSN (src->end))
+ {
+ /* Move the jump before barrier so that the notes
+ which originally were or were created before jump table are
+ inside the basic block. */
+ rtx new_insn = src->end;
+ rtx tmp;
+
+ for (tmp = NEXT_INSN (src->end); tmp != barrier;
+ tmp = NEXT_INSN (tmp))
+ set_block_for_insn (tmp, src);
+
+ NEXT_INSN (PREV_INSN (new_insn)) = NEXT_INSN (new_insn);
+ PREV_INSN (NEXT_INSN (new_insn)) = PREV_INSN (new_insn);
+
+ NEXT_INSN (new_insn) = barrier;
+ NEXT_INSN (PREV_INSN (barrier)) = new_insn;
+
+ PREV_INSN (new_insn) = PREV_INSN (barrier);
+ PREV_INSN (barrier) = new_insn;
+ }
+ }
}
/* Keep only one edge out and set proper flags. */