re PR target/65987 ([SH] Wrong jump generated for gcc.dg/tree-prof/va-arg-pack-1...
authorKaz Kojima <kkojima@gcc.gnu.org>
Mon, 4 May 2015 23:25:58 +0000 (23:25 +0000)
committerKaz Kojima <kkojima@gcc.gnu.org>
Mon, 4 May 2015 23:25:58 +0000 (23:25 +0000)
PR target/65987
* config/sh/sh.c (output_far_jump, split_branches): Take into account
  sectiion crossing jumps.

From-SVN: r222783

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

index 116a6d6435952dc00a5ada859a0e4a52d7492b34..75a6d9ec5c08f14328c190a61ae9d00a207e0fdb 100644 (file)
@@ -1,3 +1,9 @@
+2015-05-04  Kaz Kojima  <kkojima@gcc.gnu.org>
+
+       PR target/65987
+       * config/sh/sh.c (output_far_jump): Take into account crossing jumps.
+       (split_branches): Likewise.
+
 2015-05-04  Sandra Loosemore  <sandra@codesourcery.com>
 
        * common.opt (fdelete-null-pointer-checks): Init to -1.
index 1cf6ed0a9cae2c79647bf030aea2bd1dbc648449..a4c9c4c0ba25de81c5f46e5fa88b1720c45420b6 100644 (file)
@@ -2747,7 +2747,8 @@ output_far_jump (rtx_insn *insn, rtx op)
 
   if (TARGET_SH2
       && offset >= -32764
-      && offset - get_attr_length (insn) <= 32766)
+      && offset - get_attr_length (insn) <= 32766
+      && ! CROSSING_JUMP_P (insn))
     {
       far = 0;
       jump =   "mov.w  %O0,%1" "\n"
@@ -6753,6 +6754,13 @@ split_branches (rtx_insn *first)
 
            if (type == TYPE_JUMP)
              {
+               if (CROSSING_JUMP_P (insn))
+                 {
+                   emit_insn_before (gen_block_branch_redirect (const0_rtx),
+                                     insn);
+                   continue;
+                 }
+
                far_label = as_a <rtx_insn *> (
                              XEXP (SET_SRC (PATTERN (insn)), 0));
                dest_uid = get_dest_uid (far_label, max_uid);