reorg.c (relax_delay_slots): When optimizing for code size...
* reorg.c (relax_delay_slots): When optimizing for code size, if a return with a filled delay slot is followed by a return with an unfilled delay slot, delete the first return and reemit the insn that was previously in its delay slot. From-SVN: r23729
This commit is contained in:
parent
e9741ffa97
commit
9f5a2691a1
@ -1,5 +1,10 @@
|
|||||||
Thu Nov 19 22:20:51 1998 Jeffrey A Law (law@cygnus.com)
|
Thu Nov 19 22:20:51 1998 Jeffrey A Law (law@cygnus.com)
|
||||||
|
|
||||||
|
* reorg.c (relax_delay_slots): When optimizing for code size, if a
|
||||||
|
return with a filled delay slot is followed by a return with an
|
||||||
|
unfilled delay slot, delete the first return and reemit the insn
|
||||||
|
that was previously in its delay slot.
|
||||||
|
|
||||||
* i860.c (single_insn_src_p): Add missing parens.
|
* i860.c (single_insn_src_p): Add missing parens.
|
||||||
* ginclude/math-3300.h: Likewise.
|
* ginclude/math-3300.h: Likewise.
|
||||||
|
|
||||||
|
34
gcc/reorg.c
34
gcc/reorg.c
@ -4200,6 +4200,40 @@ relax_delay_slots (first)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* See if we have a RETURN insn with a filled delay slot followed
|
||||||
|
by a RETURN insn with an unfilled a delay slot. If so, we can delete
|
||||||
|
the first RETURN (but not it's delay insn). This gives the same
|
||||||
|
effect in fewer instructions.
|
||||||
|
|
||||||
|
Only do so if optimizing for size since this results in slower, but
|
||||||
|
smaller code. */
|
||||||
|
if (optimize_size
|
||||||
|
&& GET_CODE (PATTERN (delay_insn)) == RETURN
|
||||||
|
&& next
|
||||||
|
&& GET_CODE (next) == JUMP_INSN
|
||||||
|
&& GET_CODE (PATTERN (next)) == RETURN)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* Delete the RETURN and just execute the delay list insns.
|
||||||
|
|
||||||
|
We do this by deleting the INSN containing the SEQUENCE, then
|
||||||
|
re-emitting the insns separately, and then deleting the RETURN.
|
||||||
|
This allows the count of the jump target to be properly
|
||||||
|
decremented. */
|
||||||
|
|
||||||
|
/* Clear the from target bit, since these insns are no longer
|
||||||
|
in delay slots. */
|
||||||
|
for (i = 0; i < XVECLEN (pat, 0); i++)
|
||||||
|
INSN_FROM_TARGET_P (XVECEXP (pat, 0, i)) = 0;
|
||||||
|
|
||||||
|
trial = PREV_INSN (insn);
|
||||||
|
delete_insn (insn);
|
||||||
|
emit_insn_after (pat, trial);
|
||||||
|
delete_scheduled_jump (delay_insn);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
/* Now look only at the cases where we have a filled JUMP_INSN. */
|
/* Now look only at the cases where we have a filled JUMP_INSN. */
|
||||||
if (GET_CODE (XVECEXP (PATTERN (insn), 0, 0)) != JUMP_INSN
|
if (GET_CODE (XVECEXP (PATTERN (insn), 0, 0)) != JUMP_INSN
|
||||||
|| ! (condjump_p (XVECEXP (PATTERN (insn), 0, 0))
|
|| ! (condjump_p (XVECEXP (PATTERN (insn), 0, 0))
|
||||||
|
Loading…
Reference in New Issue
Block a user