aboutsummaryrefslogtreecommitdiff
path: root/gcc/sched.c
diff options
context:
space:
mode:
authorJim Wilson <wilson@gcc.gnu.org>1993-10-05 16:22:04 -0700
committerJim Wilson <wilson@gcc.gnu.org>1993-10-05 16:22:04 -0700
commitdf5f5124d52b891ed9f0ee6da1d21d6ef4fbc82f (patch)
tree551127c5c736e073b2526982560a9af56214bc1d /gcc/sched.c
parent67c8d7deb23a770b7aca61dd995c98f465c1ba0b (diff)
downloadgcc-df5f5124d52b891ed9f0ee6da1d21d6ef4fbc82f.zip
gcc-df5f5124d52b891ed9f0ee6da1d21d6ef4fbc82f.tar.gz
gcc-df5f5124d52b891ed9f0ee6da1d21d6ef4fbc82f.tar.bz2
(sched_analyze_2): Make volatile asms depend on all
pseudo registers. From-SVN: r5621
Diffstat (limited to 'gcc/sched.c')
-rw-r--r--gcc/sched.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/gcc/sched.c b/gcc/sched.c
index 7f9c831..ac0b7a5 100644
--- a/gcc/sched.c
+++ b/gcc/sched.c
@@ -1940,11 +1940,16 @@ sched_analyze_2 (x, insn)
rtx u;
/* Traditional and volatile asm instructions must be considered to use
- and clobber all hard registers and all of memory. So must
- TRAP_IF and UNSPEC_VOLATILE operations. */
+ and clobber all hard registers, all pseudo-registers and all of
+ memory. So must TRAP_IF and UNSPEC_VOLATILE operations.
+
+ Consider for instance a volatile asm that changes the fpu rounding
+ mode. An insn should not be moved across this even if it only uses
+ pseudo-regs because it might give an incorrectly rounded result. */
if (code != ASM_OPERANDS || MEM_VOLATILE_P (x))
{
- for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
+ int max_reg = max_reg_num ();
+ for (i = 0; i < max_reg; i++)
{
for (u = reg_last_uses[i]; u; u = XEXP (u, 1))
add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI);