From: Christian Bruel Date: Thu, 19 Jul 2012 11:56:09 +0000 (+0200) Subject: re PR target/54029 (SH: ICE in find_dead_or_set_registers) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=867ff7ed192fe7f614ad5c5429519f7e865e20f0;p=gcc.git re PR target/54029 (SH: ICE in find_dead_or_set_registers) PR target/54029 * config/sh/sh.c (gen_far_branch): Set JUMP_LABEL for return jumps. From-SVN: r189652 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4e8816a79e9..1ad278a950e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2012-07-19 Christian Bruel + + PR target/54029 + * config/sh/sh.c (gen_far_branch): Set JUMP_LABEL for return jumps. + 2012-07-19 Richard Guenther Eric Botcazou diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c index df39858e66b..02a37348812 100644 --- a/gcc/config/sh/sh.c +++ b/gcc/config/sh/sh.c @@ -5304,6 +5304,7 @@ gen_far_branch (struct far_branch *bp) } else jump = emit_jump_insn_after (gen_return (), insn); + /* Emit a barrier so that reorg knows that any following instructions are not reachable via a fall-through path. But don't do this when not optimizing, since we wouldn't suppress the @@ -5312,10 +5313,19 @@ gen_far_branch (struct far_branch *bp) if (optimize) emit_barrier_after (jump); emit_label_after (bp->near_label, insn); - JUMP_LABEL (jump) = bp->far_label; + + if (bp->far_label) + JUMP_LABEL (jump) = bp->far_label; + else + { + rtx pat = PATTERN (jump); + gcc_assert (ANY_RETURN_P (pat)); + JUMP_LABEL (jump) = pat; + } + ok = invert_jump (insn, label, 1); gcc_assert (ok); - + /* If we are branching around a jump (rather than a return), prevent reorg from using an insn from the jump target as the delay slot insn - when reorg did this, it pessimized code (we rather hide the delay slot)