re PR target/54029 (SH: ICE in find_dead_or_set_registers)
authorChristian Bruel <christian.bruel@st.com>
Thu, 19 Jul 2012 11:56:09 +0000 (13:56 +0200)
committerChristian Bruel <chrbr@gcc.gnu.org>
Thu, 19 Jul 2012 11:56:09 +0000 (13:56 +0200)
PR target/54029
* config/sh/sh.c (gen_far_branch): Set JUMP_LABEL for return jumps.

From-SVN: r189652

gcc/ChangeLog
gcc/config/sh/sh.c

index 4e8816a79e9c0abbed742ea88a28e57bd2c04990..1ad278a950ee4d948395397e3c1cbe975ed0256e 100644 (file)
@@ -1,3 +1,8 @@
+2012-07-19  Christian Bruel  <christian.bruel@st.com>
+
+       PR target/54029
+       * config/sh/sh.c (gen_far_branch): Set JUMP_LABEL for return jumps.
+
 2012-07-19  Richard Guenther  <rguenther@suse.de>
        Eric Botcazou  <ebotcazou@adacore.com>
 
index df39858e66b664979d50fe64eb11e5d91e581d9a..02a373488121e2bb4ae285626f4f62ebd35671fb 100644 (file)
@@ -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)