aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorDoug Evans <dje@gnu.org>1994-11-15 15:36:58 +0000
committerDoug Evans <dje@gnu.org>1994-11-15 15:36:58 +0000
commit3c7d7a4a7dddd51c8349bfb9cc71e3db1a4deeee (patch)
tree8cffc9462f0d4dda34733c6d76d92776c8c8cae3 /gcc
parentb2a80c0d2bb7bd4b7cb6fc0c56ea723a2dd8931c (diff)
downloadgcc-3c7d7a4a7dddd51c8349bfb9cc71e3db1a4deeee.zip
gcc-3c7d7a4a7dddd51c8349bfb9cc71e3db1a4deeee.tar.gz
gcc-3c7d7a4a7dddd51c8349bfb9cc71e3db1a4deeee.tar.bz2
(delete_insn): Delete labels in ADDR_VECs and
ADDR_DIFF_VECs if their use count becomes zero. From-SVN: r8439
Diffstat (limited to 'gcc')
-rw-r--r--gcc/jump.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/gcc/jump.c b/gcc/jump.c
index 28d25e5..e42e5f1 100644
--- a/gcc/jump.c
+++ b/gcc/jump.c
@@ -3375,6 +3375,24 @@ delete_insn (insn)
return next;
}
+ /* Likewise if we're deleting a dispatch table. */
+
+ if (GET_CODE (insn) == JUMP_INSN
+ && (GET_CODE (PATTERN (insn)) == ADDR_VEC
+ || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC))
+ {
+ rtx pat = PATTERN (insn);
+ int i, diff_vec_p = GET_CODE (pat) == ADDR_DIFF_VEC;
+ int len = XVECLEN (pat, diff_vec_p);
+
+ for (i = 0; i < len; i++)
+ if (--LABEL_NUSES (XEXP (XVECEXP (pat, diff_vec_p, i), 0)) == 0)
+ delete_insn (XEXP (XVECEXP (pat, diff_vec_p, i), 0));
+ while (next && INSN_DELETED_P (next))
+ next = NEXT_INSN (next);
+ return next;
+ }
+
while (prev && (INSN_DELETED_P (prev) || GET_CODE (prev) == NOTE))
prev = PREV_INSN (prev);