diff options
author | Bernd Schmidt <bernds@cygnus.co.uk> | 1999-10-10 11:37:46 +0000 |
---|---|---|
committer | Bernd Schmidt <crux@gcc.gnu.org> | 1999-10-10 11:37:46 +0000 |
commit | 17bec8eee76776352741422eb69c48788c2ddf1c (patch) | |
tree | b6ae3d6d89263adbe56709a7d54a3d75bb769731 /gcc/loop.c | |
parent | 85c45372dcd5cd6457e2c5e4d2fa941bb5dbc592 (diff) | |
download | gcc-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.c | 16 |
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; |