jump.c (delete_computation): Re-instate deletion of feeding insn.

* jump.c (delete_computation): Re-instate deletion of feeding insn.
	(delete_insn): Look for REG_LABEL notes.
	(redirect_tablejump): Delete feeding insns.

From-SVN: r37714
This commit is contained in:
J"orn Rennecke 2000-11-24 19:51:09 +00:00 committed by Joern Rennecke
parent 90d10fb9c6
commit 692dc9c635
2 changed files with 31 additions and 11 deletions

View file

@ -1,3 +1,9 @@
Fri Nov 24 19:48:09 2000 J"orn Rennecke <amylaar@redhat.com>
* jump.c (delete_computation): Re-instate deletion of feeding insn.
(delete_insn): Look for REG_LABEL notes.
(redirect_tablejump): Delete feeding insns.
2000-11-24 Bernd Schmidt <bernds@redhat.co.uk>
* config/i386/i386.md (call_pop_0, call_pop_1, call_value_pop_0,

View file

@ -2705,17 +2705,6 @@ delete_computation (insn)
}
#endif
#ifdef INSN_SCHEDULING
/* ?!? The schedulers do not keep REG_DEAD notes accurate after
reload has completed. The schedulers need to be fixed. Until
they are, we must not rely on the death notes here. */
if (reload_completed && flag_schedule_insns_after_reload)
{
delete_insn (insn);
return;
}
#endif
for (note = REG_NOTES (insn); note; note = next)
{
next = XEXP (note, 1);
@ -2745,6 +2734,7 @@ delete_insn (insn)
register rtx prev = PREV_INSN (insn);
register int was_code_label = (GET_CODE (insn) == CODE_LABEL);
register int dont_really_delete = 0;
rtx note;
while (next && INSN_DELETED_P (next))
next = NEXT_INSN (next);
@ -2864,6 +2854,13 @@ delete_insn (insn)
return next;
}
/* Likewise for an ordinary INSN / CALL_INSN with a REG_LABEL note. */
if (GET_CODE (insn) == INSN || GET_CODE (insn) == CALL_INSN)
for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
if (REG_NOTE_KIND (note) == REG_LABEL)
if (--LABEL_NUSES (XEXP (note, 0)) == 0)
delete_insn (XEXP (note, 0));
while (prev && (INSN_DELETED_P (prev) || GET_CODE (prev) == NOTE))
prev = PREV_INSN (prev);
@ -3327,6 +3324,7 @@ redirect_tablejump (jump, nlabel)
rtx jump, nlabel;
{
register rtx olabel = JUMP_LABEL (jump);
rtx *notep, note, next;
/* Add this jump to the jump_chain of NLABEL. */
if (jump_chain && INSN_UID (nlabel) < max_jump_chain
@ -3336,6 +3334,22 @@ redirect_tablejump (jump, nlabel)
jump_chain[INSN_UID (nlabel)] = jump;
}
for (notep = &REG_NOTES (jump), note = *notep; note; note = next)
{
next = XEXP (note, 1);
if (REG_NOTE_KIND (note) != REG_DEAD
/* Verify that the REG_NOTE is legitimate. */
|| GET_CODE (XEXP (note, 0)) != REG
|| ! reg_mentioned_p (XEXP (note, 0), PATTERN (jump)))
notep = &XEXP (note, 1);
else
{
delete_prior_computation (note, jump);
*notep = next;
}
}
PATTERN (jump) = gen_jump (nlabel);
JUMP_LABEL (jump) = nlabel;
++LABEL_NUSES (nlabel);