diff options
| author | amylaar <amylaar@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-11-24 19:51:09 +0000 |
|---|---|---|
| committer | amylaar <amylaar@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-11-24 19:51:09 +0000 |
| commit | d3df77e9eb6d523975fb2dec0bde0aaf635294df (patch) | |
| tree | 772f187cfef204e2fc4ec8ddcfaa859d3fec9f87 | |
| parent | 9c74ba3aa31d8b8ef3286aefd73445486f70292d (diff) | |
| download | ppe42-gcc-d3df77e9eb6d523975fb2dec0bde0aaf635294df.tar.gz ppe42-gcc-d3df77e9eb6d523975fb2dec0bde0aaf635294df.zip | |
* jump.c (delete_computation): Re-instate deletion of feeding insn.
(delete_insn): Look for REG_LABEL notes.
(redirect_tablejump): Delete feeding insns.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@37714 138bc75d-0d04-0410-961f-82ee72b054a4
| -rw-r--r-- | gcc/ChangeLog | 6 | ||||
| -rw-r--r-- | 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 <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, 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); |

