aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Earnshaw <rearnsha@arm.com>1999-10-20 10:21:47 +0000
committerRichard Earnshaw <rearnsha@gcc.gnu.org>1999-10-20 10:21:47 +0000
commitdc9e9f3f8891dad8aad9bf346a68bedeae82c03f (patch)
tree8b19148a801536dd02ea093c480fa7aa4bae8943 /gcc
parent2cd6f3b397d8f7ec02a448eb818b7a4893c5cee3 (diff)
downloadgcc-dc9e9f3f8891dad8aad9bf346a68bedeae82c03f.zip
gcc-dc9e9f3f8891dad8aad9bf346a68bedeae82c03f.tar.gz
gcc-dc9e9f3f8891dad8aad9bf346a68bedeae82c03f.tar.bz2
(jump_optimize_1): More accurately detect casesi insns.
From-SVN: r30099
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/jump.c12
2 files changed, 12 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f650a8c..9a7fd94 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,7 @@
+Wed Oct 20 10:46:41 1999 Richard Earnshaw (rearnsha@arm.com)
+
+ * jump.c (jump_optimize_1): More accurately detect casesi insns.
+
Tue Oct 19 23:43:50 1999 Jeffrey A Law (law@cygnus.com)
* pa.md (call, call_value): Do not emit a blockage after restoring
diff --git a/gcc/jump.c b/gcc/jump.c
index 2328d8f..9a16ac5 100644
--- a/gcc/jump.c
+++ b/gcc/jump.c
@@ -367,19 +367,23 @@ jump_optimize_1 (f, cross_jump, noop_moves, after_regscan, mark_labels_only)
int diff_vec_p = GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC;
int len = XVECLEN (pat, diff_vec_p);
rtx dispatch = prev_real_insn (insn);
+ rtx set;
for (i = 0; i < len; i++)
if (XEXP (XVECEXP (pat, diff_vec_p, i), 0)
!= XEXP (XVECEXP (pat, diff_vec_p, 0), 0))
break;
+
if (i == len
&& dispatch != 0
&& GET_CODE (dispatch) == JUMP_INSN
&& JUMP_LABEL (dispatch) != 0
- /* Don't mess with a casesi insn. */
- && !(GET_CODE (PATTERN (dispatch)) == SET
- && (GET_CODE (SET_SRC (PATTERN (dispatch)))
- == IF_THEN_ELSE))
+ /* Don't mess with a casesi insn.
+ XXX according to the comment before computed_jump_p(),
+ all casesi insns should be a parallel of the jump
+ and a USE of a LABEL_REF. */
+ && ! ((set = single_set (dispatch)) != NULL
+ && (GET_CODE (SET_SRC (set)) == IF_THEN_ELSE))
&& next_real_insn (JUMP_LABEL (dispatch)) == insn)
{
redirect_tablejump (dispatch,