reorg.c (relax_delay_slots): Take account of NOTE_INSN_SWITCH_TEXT_SECTIONS and targe...
authorKaz Kojima <kkojima@gcc.gnu.org>
Thu, 29 Jan 2015 08:36:38 +0000 (08:36 +0000)
committerKaz Kojima <kkojima@gcc.gnu.org>
Thu, 29 Jan 2015 08:36:38 +0000 (08:36 +0000)
* reorg.c (relax_delay_slots): Take account of NOTE_INSN_SWITCH_TEXT_SECTIONS
  and targetm.can_follow_jump.

From-SVN: r220235

gcc/ChangeLog
gcc/reorg.c

index 67f5f7fb44679261a5dd1b6e1ebcec617b2e404d..38cb9e509ae9b970156d5042519fd7b5453f0761 100644 (file)
@@ -1,3 +1,11 @@
+2015-01-29  Kaz Kojima  <kkojima@gcc.gnu.org>
+
+       PR target/64761
+       * reorg.c (switch_text_sections_between_p): New function.
+       (relax_delay_slots): Call it when testing if the jump insn
+       is removable.  Use targetm.can_follow_jump when testing if
+       the conditional branch can follow an unconditional jump.
+
 2015-01-27  Caroline Tice  <cmtice@google.com>
 
        Committing VTV Cywin/Ming patch for Patrick Wollgast
index 05b84442f2f5a8bfa431e3dc16026f7919ebbf43..2be34572d9988b0b15b575076ed27dabbbf526db 100644 (file)
@@ -3213,6 +3213,19 @@ label_before_next_insn (rtx x, rtx scan_limit)
   return insn;
 }
 
+/* Return TRUE if there is a NOTE_INSN_SWITCH_TEXT_SECTIONS note in between
+   BEG and END.  */
+
+static bool
+switch_text_sections_between_p (const rtx_insn *beg, const rtx_insn *end)
+{
+  const rtx_insn *p;
+  for (p = beg; p != end; p = NEXT_INSN (p))
+    if (NOTE_P (p) && NOTE_KIND (p) == NOTE_INSN_SWITCH_TEXT_SECTIONS)
+      return true;
+  return false;
+}
+
 \f
 /* Once we have tried two ways to fill a delay slot, make a pass over the
    code to try to improve the results and to do such things as more jump
@@ -3249,7 +3262,8 @@ relax_delay_slots (rtx_insn *first)
            target_label = find_end_label (target_label);
 
          if (target_label && next_active_insn (target_label) == next
-             && ! condjump_in_parallel_p (insn))
+             && ! condjump_in_parallel_p (insn)
+             && ! (next && switch_text_sections_between_p (insn, next)))
            {
              delete_jump (insn);
              continue;
@@ -3264,12 +3278,13 @@ relax_delay_slots (rtx_insn *first)
 
          /* See if this jump conditionally branches around an unconditional
             jump.  If so, invert this jump and point it to the target of the
-            second jump.  */
+            second jump.  Check if it's possible on the target.  */
          if (next && simplejump_or_return_p (next)
              && any_condjump_p (insn)
              && target_label
              && next_active_insn (target_label) == next_active_insn (next)
-             && no_labels_between_p (insn, next))
+             && no_labels_between_p (insn, next)
+             && targetm.can_follow_jump (insn, next))
            {
              rtx label = JUMP_LABEL (next);