+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
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
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;
/* 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);