From: Christian Bruel Date: Tue, 26 Jan 2010 07:28:05 +0000 (+0100) Subject: fix PR target/42841 X-Git-Tag: releases/gcc-4.3.5~204 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=96cd4f11a9d50af25904813e15b7c2d1e9e14eda;p=thirdparty%2Fgcc.git fix PR target/42841 From-SVN: r156231 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 03045ec2966b..86c7e34e01fc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2010-01-25 Christian Bruel + + 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 * 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 fa54872eff29..2db614209a40 100644 --- a/gcc/config/sh/sh.c +++ b/gcc/config/sh/sh.c @@ -4020,6 +4020,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; @@ -8451,9 +8458,7 @@ sh_insn_length_adjustment (rtx insn) && GET_CODE (PATTERN (insn)) != USE && GET_CODE (PATTERN (insn)) != CLOBBER) || GET_CODE (insn) == CALL_INSN - || (GET_CODE (insn) == JUMP_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; @@ -8461,9 +8466,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 == CPU_SH2E - && GET_CODE (insn) == JUMP_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;