diff options
author | J"orn Rennecke <amylaar@redhat.com> | 2000-11-24 19:51:09 +0000 |
---|---|---|
committer | Joern Rennecke <amylaar@gcc.gnu.org> | 2000-11-24 19:51:09 +0000 |
commit | 692dc9c6351e59286337a6b0db77ecba58ff5268 (patch) | |
tree | 772f187cfef204e2fc4ec8ddcfaa859d3fec9f87 /gcc/jump.c | |
parent | 90d10fb9c6738cd6533bb9668a47b834e0ebe661 (diff) | |
download | gcc-692dc9c6351e59286337a6b0db77ecba58ff5268.zip gcc-692dc9c6351e59286337a6b0db77ecba58ff5268.tar.gz gcc-692dc9c6351e59286337a6b0db77ecba58ff5268.tar.bz2 |
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
Diffstat (limited to 'gcc/jump.c')
-rw-r--r-- | gcc/jump.c | 36 |
1 files changed, 25 insertions, 11 deletions
@@ -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 = ®_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); |