aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/sh/sh.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/config/sh/sh.c')
-rw-r--r--gcc/config/sh/sh.c10
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)