diff options
Diffstat (limited to 'gcc/config/sh/sh.c')
-rw-r--r-- | gcc/config/sh/sh.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c index 8afb976..30d890e 100644 --- a/gcc/config/sh/sh.c +++ b/gcc/config/sh/sh.c @@ -2941,7 +2941,15 @@ barrier_align (barrier_or_label) /* 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))) + || 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. */ + || (NEXT_INSN (PREV_INSN (prev)) != prev + && ((INSN_CODE (NEXT_INSN (NEXT_INSN (prev))) + == CODE_FOR_block_branch_redirect) + || (INSN_CODE (NEXT_INSN (NEXT_INSN (prev))) + == CODE_FOR_indirect_jump_scratch))))) { rtx pat = PATTERN (prev); if (GET_CODE (pat) == PARALLEL) |