diff options
author | Richard Henderson <rth@cygnus.com> | 2000-03-19 03:30:38 -0800 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2000-03-19 03:30:38 -0800 |
commit | 1519ae2c7fb8cacc3a24bbca784618adeca28251 (patch) | |
tree | 053b5728c84e3fc8f12d1958a32b54540969c4f8 | |
parent | b6166b4d0fd0ea3767a48034d773967c057220ee (diff) | |
download | gcc-1519ae2c7fb8cacc3a24bbca784618adeca28251.zip gcc-1519ae2c7fb8cacc3a24bbca784618adeca28251.tar.gz gcc-1519ae2c7fb8cacc3a24bbca784618adeca28251.tar.bz2 |
flow.c (delete_block): Delete the addr_vec along with the block.
* flow.c (delete_block): Delete the addr_vec along with the block.
(flow_delete_insn): Decrement LABEL_NUSES when deleting insns that
reference labels.
From-SVN: r32635
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/flow.c | 28 |
2 files changed, 28 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5f9babb..cdaef9d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2000-03-19 Richard Henderson <rth@cygnus.com> + + * flow.c (delete_block): Delete the addr_vec along with the block. + (flow_delete_insn): Decrement LABEL_NUSES when deleting insns that + reference labels. + 2000-03-18 Mark Mitchell <mark@codesourcery.com> * emit-rtl.c (remove_unncessary_notes): Check that all @@ -1853,7 +1853,7 @@ delete_block (b) basic_block b; { int deleted_handler = 0; - rtx insn, end; + rtx insn, end, tmp; /* If the head of this block is a CODE_LABEL, then it might be the label for an exception handler which can't be reached. @@ -1902,11 +1902,22 @@ delete_block (b) } } - /* Selectively unlink the insn chain. Include any BARRIER that may - follow the basic block. */ - end = next_nonnote_insn (b->end); - if (!end || GET_CODE (end) != BARRIER) - end = b->end; + /* Include any jump table following the basic block. */ + end = b->end; + if (GET_CODE (end) == JUMP_INSN + && (tmp = JUMP_LABEL (end)) != NULL_RTX + && (tmp = NEXT_INSN (tmp)) != NULL_RTX + && GET_CODE (tmp) == JUMP_INSN + && (GET_CODE (PATTERN (tmp)) == ADDR_VEC + || GET_CODE (PATTERN (tmp)) == ADDR_DIFF_VEC)) + end = tmp; + + /* Include any barrier that may follow the basic block. */ + tmp = next_nonnote_insn (b->end); + if (tmp && GET_CODE (tmp) == BARRIER) + end = tmp; + + /* Selectively delete the entire chain. */ flow_delete_insn_chain (insn, end); no_delete_insns: @@ -1972,6 +1983,7 @@ flow_delete_insn (insn) { rtx prev = PREV_INSN (insn); rtx next = NEXT_INSN (insn); + rtx note; PREV_INSN (insn) = NULL_RTX; NEXT_INSN (insn) = NULL_RTX; @@ -1991,6 +2003,10 @@ flow_delete_insn (insn) if (GET_CODE (insn) == JUMP_INSN && JUMP_LABEL (insn)) LABEL_NUSES (JUMP_LABEL (insn))--; + /* Also if deleting an insn that references a label. */ + else if ((note = find_reg_note (insn, REG_LABEL, NULL_RTX)) != NULL_RTX) + LABEL_NUSES (XEXP (note, 0))--; + return next; } |