diff options
author | Josef Zlomek <zlomekj@suse.cz> | 2003-10-31 15:09:34 +0100 |
---|---|---|
committer | Josef Zlomek <zlomek@gcc.gnu.org> | 2003-10-31 14:09:34 +0000 |
commit | 5d693491f01a654997620056407055080db63e66 (patch) | |
tree | 4ae0b86a996aa25b13e3815e1be851a43ff14a75 /gcc/cfgrtl.c | |
parent | c2edc52b76c68acc7cf342c0485176902699c6e4 (diff) | |
download | gcc-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.c | 24 |
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. */ |