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
This commit is contained in:
Clinton Popetz 2000-03-06 21:17:44 +00:00 committed by Clinton Popetz
parent 1621934772
commit b1b41fe4ac
2 changed files with 25 additions and 3 deletions

View File

@ -1,3 +1,8 @@
2000-03-06 Clinton Popetz <cpopetz@cygnus.com>
* 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 <m.hayes@elec.canterbury.ac.nz>
* config/c4x/c4x-protos.h (c4x_global_name): Constify char *.

View File

@ -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)