aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJeff Law <law@redhat.com>2002-02-04 09:03:14 -0700
committerJeff Law <law@gcc.gnu.org>2002-02-04 09:03:14 -0700
commit5b1cacd89e1977d35cad4bedaf6915900d0a6971 (patch)
treee8df6f9cdd391074172099255b71b5000ca7ade6 /gcc
parent5987ca1c3806cf5e6d829ba2a92961499aea2da0 (diff)
downloadgcc-5b1cacd89e1977d35cad4bedaf6915900d0a6971.zip
gcc-5b1cacd89e1977d35cad4bedaf6915900d0a6971.tar.gz
gcc-5b1cacd89e1977d35cad4bedaf6915900d0a6971.tar.bz2
cfgrtl.c (try_redirect_by_replacing_jump): Remove associated CODE_LABEL and jump table when...
* cfgrtl.c (try_redirect_by_replacing_jump): Remove associated CODE_LABEL and jump table when replacing a table jump with a simple jump. From-SVN: r49478
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/cfgrtl.c15
2 files changed, 20 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 19dd639..63c0ce5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+Mon Feb 4 09:05:58 2002 Jeffrey A Law (law@redhat.com)
+
+ * cfgrtl.c (try_redirect_by_replacing_jump): Remove associated
+ CODE_LABEL and jump table when replacing a table jump with a
+ simple jump.
+
2002-02-04 Ulrich Weigand <uweigand@de.ibm.com>
* config/s390/s390-protos.h (legitimize_la_operand,
diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c
index f318798..9e8269b 100644
--- a/gcc/cfgrtl.c
+++ b/gcc/cfgrtl.c
@@ -714,7 +714,7 @@ try_redirect_by_replacing_jump (e, target)
else
{
rtx target_label = block_label (target);
- rtx barrier;
+ rtx barrier, tmp;
emit_jump_insn_after (gen_jump (target_label), insn);
JUMP_LABEL (src->end) = target_label;
@@ -723,8 +723,21 @@ try_redirect_by_replacing_jump (e, target)
fprintf (rtl_dump_file, "Replacing insn %i by jump %i\n",
INSN_UID (insn), INSN_UID (src->end));
+
delete_insn_chain (kill_from, insn);
+ /* Recognize a tablejump that we are converting to a
+ simple jump and remove its associated CODE_LABEL
+ and ADDR_VEC or ADDR_DIFF_VEC. */
+ if ((tmp = JUMP_LABEL (insn)) != 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))
+ {
+ delete_insn_chain (JUMP_LABEL (insn), tmp);
+ }
+
barrier = next_nonnote_insn (src->end);
if (!barrier || GET_CODE (barrier) != BARRIER)
emit_barrier_after (src->end);