mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-11 14:11:31 +08:00
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:
parent
1621934772
commit
b1b41fe4ac
@ -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 *.
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user