diff options
| author | cpopetz <cpopetz@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-03-06 21:17:44 +0000 |
|---|---|---|
| committer | cpopetz <cpopetz@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-03-06 21:17:44 +0000 |
| commit | fd787fea586d4327ca7e34a29f2570061438b9f5 (patch) | |
| tree | 85c46414bfb11dcd32ce6e4dfb1d45a66a43d8be /gcc/config/sh/sh.c | |
| parent | dc9a8d76fa06d1cee93a4bda5ba5616bbceb6139 (diff) | |
| download | ppe42-gcc-fd787fea586d4327ca7e34a29f2570061438b9f5.tar.gz ppe42-gcc-fd787fea586d4327ca7e34a29f2570061438b9f5.zip | |
* config/sh/sh.c: (barrier_align): Handle a delay slot that is
filled with an insn from the jump target.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@32371 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/sh/sh.c')
| -rw-r--r-- | gcc/config/sh/sh.c | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c index 0c3d6f159ee..28d199cebfc 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) |

