aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Bruel <christian.bruel@st.com>2010-01-26 08:20:27 +0100
committerChristian Bruel <chrbr@gcc.gnu.org>2010-01-26 08:20:27 +0100
commit69b18163948c16e19bcfa1737de3eb47287c2b89 (patch)
treec1c2d90051c036dc5c61a7c5c12e7a4dadf44572
parent79b754d47ff5fef99fe57b3579ef37f135a6dc6e (diff)
downloadgcc-69b18163948c16e19bcfa1737de3eb47287c2b89.zip
gcc-69b18163948c16e19bcfa1737de3eb47287c2b89.tar.gz
gcc-69b18163948c16e19bcfa1737de3eb47287c2b89.tar.bz2
fix PR target/42841
From-SVN: r156229
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/sh/sh.c15
2 files changed, 16 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3af8ee3..ca8d69a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2010-01-25 Christian Bruel <christian.bruel@st.com>
+
+ PR target/42841
+ * config/sh/sh.c (find_barrier): Increase length for non delayed
+ conditional branches.
+ (sh_insn_length_adjustment): Use JUMP_TABLE_DATA_P.
+
2010-01-24 David S. Miller <davem@davemloft.net>
* gcc/config/sparc/sysv4.h (TARGET_ASM_NAMED_SECTION): Only
diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c
index aaa745d..283bb0a 100644
--- a/gcc/config/sh/sh.c
+++ b/gcc/config/sh/sh.c
@@ -4567,6 +4567,13 @@ find_barrier (int num_mova, rtx mova, rtx from)
&& ! TARGET_SMALLCODE)
new_align = 4;
+ /* There is a possibility that a bf is transformed into a bf/s by the
+ delay slot scheduler. */
+ if (JUMP_P (from) && !JUMP_TABLE_DATA_P (from)
+ && get_attr_type (from) == TYPE_CBRANCH
+ && GET_CODE (PATTERN (NEXT_INSN (PREV_INSN (from)))) != SEQUENCE)
+ inc += 2;
+
if (found_si)
{
count_si += inc;
@@ -9271,9 +9278,7 @@ sh_insn_length_adjustment (rtx insn)
&& GET_CODE (PATTERN (insn)) != USE
&& GET_CODE (PATTERN (insn)) != CLOBBER)
|| CALL_P (insn)
- || (JUMP_P (insn)
- && GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC
- && GET_CODE (PATTERN (insn)) != ADDR_VEC))
+ || (JUMP_P (insn) && !JUMP_TABLE_DATA_P (insn)))
&& GET_CODE (PATTERN (NEXT_INSN (PREV_INSN (insn)))) != SEQUENCE
&& get_attr_needs_delay_slot (insn) == NEEDS_DELAY_SLOT_YES)
return 2;
@@ -9281,9 +9286,7 @@ sh_insn_length_adjustment (rtx insn)
/* SH2e has a bug that prevents the use of annulled branches, so if
the delay slot is not filled, we'll have to put a NOP in it. */
if (sh_cpu_attr == CPU_SH2E
- && JUMP_P (insn)
- && GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC
- && GET_CODE (PATTERN (insn)) != ADDR_VEC
+ && JUMP_P (insn) && !JUMP_TABLE_DATA_P (insn)
&& get_attr_type (insn) == TYPE_CBRANCH
&& GET_CODE (PATTERN (NEXT_INSN (PREV_INSN (insn)))) != SEQUENCE)
return 2;