summaryrefslogtreecommitdiff
path: root/gcc/loop.c
diff options
context:
space:
mode:
authorBernd Schmidt <bernds@cygnus.co.uk>1999-10-10 11:37:46 +0000
committerBernd Schmidt <crux@gcc.gnu.org>1999-10-10 11:37:46 +0000
commit17bec8eee76776352741422eb69c48788c2ddf1c (patch)
treeb6ae3d6d89263adbe56709a7d54a3d75bb769731 /gcc/loop.c
parent85c45372dcd5cd6457e2c5e4d2fa941bb5dbc592 (diff)
downloadgcc-17bec8eee76776352741422eb69c48788c2ddf1c.tar.gz
Don't put things between tablejumps and jump tables in loop.c
From-SVN: r29887
Diffstat (limited to 'gcc/loop.c')
-rw-r--r--gcc/loop.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/gcc/loop.c b/gcc/loop.c
index 40ed922a783..ea815fff847 100644
--- a/gcc/loop.c
+++ b/gcc/loop.c
@@ -2841,16 +2841,30 @@ find_and_verify_loops (f)
rtx target
= JUMP_LABEL (insn) ? JUMP_LABEL (insn) : get_last_insn ();
int target_loop_num = uid_loop_num[INSN_UID (target)];
- rtx loc;
+ rtx loc, loc2;
for (loc = target; loc; loc = PREV_INSN (loc))
if (GET_CODE (loc) == BARRIER
+ /* Don't move things inside a tablejump. */
+ && ((loc2 = next_nonnote_insn (loc)) == 0
+ || GET_CODE (loc2) != CODE_LABEL
+ || (loc2 = next_nonnote_insn (loc2)) == 0
+ || GET_CODE (loc2) != JUMP_INSN
+ || (GET_CODE (PATTERN (loc2)) != ADDR_VEC
+ && GET_CODE (PATTERN (loc2)) != ADDR_DIFF_VEC))
&& uid_loop_num[INSN_UID (loc)] == target_loop_num)
break;
if (loc == 0)
for (loc = target; loc; loc = NEXT_INSN (loc))
if (GET_CODE (loc) == BARRIER
+ /* Don't move things inside a tablejump. */
+ && ((loc2 = next_nonnote_insn (loc)) == 0
+ || GET_CODE (loc2) != CODE_LABEL
+ || (loc2 = next_nonnote_insn (loc2)) == 0
+ || GET_CODE (loc2) != JUMP_INSN
+ || (GET_CODE (PATTERN (loc2)) != ADDR_VEC
+ && GET_CODE (PATTERN (loc2)) != ADDR_DIFF_VEC))
&& uid_loop_num[INSN_UID (loc)] == target_loop_num)
break;