From: Clinton Popetz Date: Mon, 6 Mar 2000 21:17:44 +0000 (+0000) Subject: sh.c: (barrier_align): Handle a delay slot that is filled with an insn from the jump... X-Git-Tag: prereleases/libstdc++-2.92~7840 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b1b41fe4acbba6e729d035d3d561e0f82ff5f06a;p=thirdparty%2Fgcc.git sh.c: (barrier_align): Handle a delay slot that is filled with an insn from the jump... * config/sh/sh.c: (barrier_align): Handle a delay slot that is filled with an insn from the jump target. From-SVN: r32371 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fb42c0923ebe..3c8feb5053bc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2000-03-06 Clinton Popetz + + * config/sh/sh.c: (barrier_align): Handle a delay slot that is + filled with an insn from the jump target. + 2000-03-07 Michael Hayes * config/c4x/c4x-protos.h (c4x_global_name): Constify char *. diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c index 0c3d6f159eef..28d199cebfc2 100644 --- a/gcc/config/sh/sh.c +++ b/gcc/config/sh/sh.c @@ -2711,7 +2711,7 @@ barrier_align (barrier_or_label) rtx barrier_or_label; { rtx next = next_real_insn (barrier_or_label), pat, prev; - int slot, credit; + int slot, credit, jump_to_next; if (! next) return 0; @@ -2754,6 +2754,13 @@ barrier_align (barrier_or_label) an alignment, against that of fetching unneeded insn in front of the branch target when there is no alignment. */ + /* There are two delay_slot cases to consider. One is the simple case + where the preceding branch is to the insn beyond the barrier (simple + delay slot filling), and the other is where the preceding branch has + a delay slot that is a duplicate of the insn after the barrier + (fill_eager_delay_slots) and the branch is to the insn after the insn + after the barrier. */ + /* PREV is presumed to be the JUMP_INSN for the barrier under investigation. Skip to the insn before it. */ prev = prev_real_insn (prev); @@ -2762,11 +2769,21 @@ barrier_align (barrier_or_label) credit >= 0 && prev && GET_CODE (prev) == INSN; prev = prev_real_insn (prev)) { + jump_to_next = 0; if (GET_CODE (PATTERN (prev)) == USE || GET_CODE (PATTERN (prev)) == CLOBBER) continue; if (GET_CODE (PATTERN (prev)) == SEQUENCE) - prev = XVECEXP (PATTERN (prev), 0, 1); + { + prev = XVECEXP (PATTERN (prev), 0, 1); + if (INSN_UID (prev) == INSN_UID (next)) + { + /* Delay slot was filled with insn at jump target. */ + jump_to_next = 1; + continue; + } + } + if (slot && get_attr_in_delay_slot (prev) == IN_DELAY_SLOT_YES) slot = 0; @@ -2775,7 +2792,7 @@ barrier_align (barrier_or_label) if (prev && GET_CODE (prev) == JUMP_INSN && JUMP_LABEL (prev) - && next_real_insn (JUMP_LABEL (prev)) == next_real_insn (barrier_or_label)) + && (jump_to_next || next_real_insn (JUMP_LABEL (prev)) == next)) { rtx pat = PATTERN (prev); if (GET_CODE (pat) == PARALLEL)