aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Henderson <rth@cygnus.com>2000-03-19 03:30:38 -0800
committerRichard Henderson <rth@gcc.gnu.org>2000-03-19 03:30:38 -0800
commit1519ae2c7fb8cacc3a24bbca784618adeca28251 (patch)
tree053b5728c84e3fc8f12d1958a32b54540969c4f8
parentb6166b4d0fd0ea3767a48034d773967c057220ee (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/flow.c28
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
diff --git a/gcc/flow.c b/gcc/flow.c
index f0e5b53..79203d7 100644
--- a/gcc/flow.c
+++ b/gcc/flow.c
@@ -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;
}