aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKaz Kojima <kkojima@gcc.gnu.org>2008-02-20 23:35:41 +0000
committerKaz Kojima <kkojima@gcc.gnu.org>2008-02-20 23:35:41 +0000
commit6d4d15b84d914b9de4289fafdd541413d41a2138 (patch)
tree2b8423988dd7fed125f9f5a16fc721ca364b17f3
parent6d4a896759d342850e6a9ba2639d2159df79e5ea (diff)
downloadgcc-6d4d15b84d914b9de4289fafdd541413d41a2138.zip
gcc-6d4d15b84d914b9de4289fafdd541413d41a2138.tar.gz
gcc-6d4d15b84d914b9de4289fafdd541413d41a2138.tar.bz2
re PR target/35190 (Wrong branch instruction with -freorder-blocks-and-partition on SH)
PR target/35190 * config/sh/sh.md (jump_compact): Disable for crossing jumps. * config/sh/sh.c (find_barrier): Don't go past NOTE_INSN_SWITCH_TEXT_SECTIONS note. From-SVN: r132502
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/config/sh/sh.c9
-rw-r--r--gcc/config/sh/sh.md2
3 files changed, 18 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index fc400d2..4245df6 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2008-02-20 Kaz Kojima <kkojima@gcc.gnu.org>
+
+ PR target/35190
+ * config/sh/sh.md (jump_compact): Disable for crossing jumps.
+
+ * config/sh/sh.c (find_barrier): Don't go past
+ NOTE_INSN_SWITCH_TEXT_SECTIONS note.
+
2008-02-20 DJ Delorie <dj@redhat.com>
* config/h8300/h8300.md (insv): Force source operand to be a register.
diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c
index 4088ef7..37abdf6a 100644
--- a/gcc/config/sh/sh.c
+++ b/gcc/config/sh/sh.c
@@ -3897,6 +3897,7 @@ find_barrier (int num_mova, rtx mova, rtx from)
if (GET_CODE (from) == BARRIER)
{
+ rtx next;
found_barrier = from;
@@ -3905,6 +3906,14 @@ find_barrier (int num_mova, rtx mova, rtx from)
this kind of barrier. */
if (barrier_align (from) > 2)
good_barrier = from;
+
+ /* If we are at the end of a hot/cold block, dump the constants
+ here. */
+ next = NEXT_INSN (from);
+ if (next
+ && NOTE_P (next)
+ && NOTE_KIND (next) == NOTE_INSN_SWITCH_TEXT_SECTIONS)
+ break;
}
if (broken_move (from))
diff --git a/gcc/config/sh/sh.md b/gcc/config/sh/sh.md
index d7e2727..5a580b5 100644
--- a/gcc/config/sh/sh.md
+++ b/gcc/config/sh/sh.md
@@ -7378,7 +7378,7 @@ label:
(define_insn "jump_compact"
[(set (pc)
(label_ref (match_operand 0 "" "")))]
- "TARGET_SH1"
+ "TARGET_SH1 && !find_reg_note (insn, REG_CROSSING_JUMP, NULL_RTX)"
"*
{
/* The length is 16 if the delay slot is unfilled. */