From: Andrew Haley Date: Tue, 24 Jul 2001 15:25:51 +0000 (+0000) Subject: sh.c (barrier_align): Check that an operand really is an insn before extracting its... X-Git-Tag: prereleases/libstdc++-3.0.95~3084 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2b9d17c73c1b69e3e61a010ce31723338713a02d;p=thirdparty%2Fgcc.git sh.c (barrier_align): Check that an operand really is an insn before extracting its INSN_CODE. 2001-07-18 Andrew Haley * config/sh/sh.c (barrier_align): Check that an operand really is an insn before extracting its INSN_CODE. From-SVN: r44303 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d2c4334e0148..bea9ac4eb83d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2001-07-18 Andrew Haley + + * config/sh/sh.c (barrier_align): Check that an operand really is + an insn before extracting its INSN_CODE. + 2001-07-24 Andrew Haley * config/sh/sh.h (OVERRIDE_OPTIONS): Add braces to get rid of diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c index ec09d08b6662..a9813697501d 100644 --- a/gcc/config/sh/sh.c +++ b/gcc/config/sh/sh.c @@ -2956,28 +2956,32 @@ barrier_align (barrier_or_label) } if (prev && GET_CODE (prev) == JUMP_INSN - && JUMP_LABEL (prev) - && (jump_to_next || next_real_insn (JUMP_LABEL (prev)) == next + && JUMP_LABEL (prev)) + { + rtx x; + if (jump_to_next + || next_real_insn (JUMP_LABEL (prev)) == next /* If relax_delay_slots() decides NEXT was redundant with some previous instruction, it will have redirected PREV's jump to the following insn. */ || JUMP_LABEL (prev) == next_nonnote_insn (next) /* There is no upper bound on redundant instructions that - might have been skipped, but we must not put an alignment - where none had been before. */ - || (INSN_CODE (NEXT_INSN (NEXT_INSN (PREV_INSN (prev)))) - == CODE_FOR_block_branch_redirect) - || (INSN_CODE (NEXT_INSN (NEXT_INSN (PREV_INSN (prev)))) - == CODE_FOR_indirect_jump_scratch))) - { - rtx pat = PATTERN (prev); - if (GET_CODE (pat) == PARALLEL) - pat = XVECEXP (pat, 0, 0); - if (credit - slot >= (GET_CODE (SET_SRC (pat)) == PC ? 2 : 0)) - return 0; - } + might have been skipped, but we must not put an + alignment where none had been before. */ + || (x = (NEXT_INSN (NEXT_INSN (PREV_INSN (prev)))), + (INSN_P (x) + && (INSN_CODE (x) == CODE_FOR_block_branch_redirect + || INSN_CODE (x) == CODE_FOR_indirect_jump_scratch)))) + { + rtx pat = PATTERN (prev); + if (GET_CODE (pat) == PARALLEL) + pat = XVECEXP (pat, 0, 0); + if (credit - slot >= (GET_CODE (SET_SRC (pat)) == PC ? 2 : 0)) + return 0; + } + } } - + return CACHE_LOG; }