From 692dc9c6351e59286337a6b0db77ecba58ff5268 Mon Sep 17 00:00:00 2001 From: "J\"orn Rennecke" Date: Fri, 24 Nov 2000 19:51:09 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 6 ++++++ gcc/jump.c | 36 +++++++++++++++++++++++++----------- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a97643705c7..9dcaaf5bd6d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +Fri Nov 24 19:48:09 2000 J"orn Rennecke + + * 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 * config/i386/i386.md (call_pop_0, call_pop_1, call_value_pop_0, diff --git a/gcc/jump.c b/gcc/jump.c index 195e60f9d8b..dcdd4aec693 100644 --- a/gcc/jump.c +++ b/gcc/jump.c @@ -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); -- 2.30.2