aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJim Wilson <wilson@gcc.gnu.org>1997-02-03 17:00:11 -0800
committerJim Wilson <wilson@gcc.gnu.org>1997-02-03 17:00:11 -0800
commit44c389e479e9e226cd7d4e33abf8fda15209c894 (patch)
treec90a3bd0b9e7fd1c73451e1075175d8c6e74c7bc /gcc
parentb91b26c962cc51f3f1058aceb4de20b31f100c8c (diff)
downloadgcc-44c389e479e9e226cd7d4e33abf8fda15209c894.zip
gcc-44c389e479e9e226cd7d4e33abf8fda15209c894.tar.gz
gcc-44c389e479e9e226cd7d4e33abf8fda15209c894.tar.bz2
(find_cross_jump): Don't allow old-style and volatile asms
to match. From-SVN: r13603
Diffstat (limited to 'gcc')
-rw-r--r--gcc/jump.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/gcc/jump.c b/gcc/jump.c
index 1d2b3cb..e1382b3 100644
--- a/gcc/jump.c
+++ b/gcc/jump.c
@@ -2605,7 +2605,19 @@ find_cross_jump (e1, e2, minimum, f1, f2)
}
#endif
- if (lose || GET_CODE (p1) != GET_CODE (p2)
+ /* Don't allow old-style asm or volatile extended asms to be accepted
+ for cross jumping purposes. It is conceptually correct to allow
+ them, since cross-jumping preserves the dynamic instruction order
+ even though it is changing the static instruction order. However,
+ if an asm is being used to emit an assembler pseudo-op, such as
+ the MIPS `.set reorder' pseudo-op, then the static instruction order
+ matters and it must be preserved. */
+ if (GET_CODE (p1) == ASM_INPUT || GET_CODE (p2) == ASM_INPUT
+ || (GET_CODE (p1) == ASM_OPERANDS && MEM_VOLATILE_P (p1))
+ || (GET_CODE (p2) == ASM_OPERANDS && MEM_VOLATILE_P (p2)))
+ lose = 1;
+
+ if (lose || GET_CODE (p1) != GET_CODE (p2)
|| ! rtx_renumbered_equal_p (p1, p2))
{
/* The following code helps take care of G++ cleanups. */