Fix misscheduling of epilogue predicate register restore.

* config/ia64/ia64.c (rtx_needs_barrier, case UNSPEC): Move case 6...
	(rtx_needs_barrier, case UNSPEC_VOLATILE): to here.
	* config/ia64/ia64.md (pr_restore): Change UNSPEC to UNSPEC_VOLATILE.

From-SVN: r32714
This commit is contained in:
Jim Wilson 2000-03-23 19:38:24 +00:00 committed by Jim Wilson
parent fc5b7cda3c
commit d4daa0b423
3 changed files with 21 additions and 11 deletions

View File

@ -1,3 +1,9 @@
Thu Mar 23 11:34:39 2000 Jim Wilson <wilson@cygnus.com>
* config/ia64/ia64.c (rtx_needs_barrier, case UNSPEC): Move case 6...
(rtx_needs_barrier, case UNSPEC_VOLATILE): to here.
* config/ia64/ia64.md (pr_restore): Change UNSPEC to UNSPEC_VOLATILE.
Thu Mar 23 16:04:40 2000 Andrew Haley <aph@cygnus.com>
* config/mips/mips.md (movdf_internal1a): Delete (set 'f', 'F')

View File

@ -2421,16 +2421,7 @@ rtx_needs_barrier (x, flags, pred)
need_barrier |= rws_access_reg (i, flags, pred);
break;
case 6: /* mov pr= */
/* This writes all predicate registers. */
new_flags.is_write = 1;
/* We need to skip by two, because rws_access_reg always writes
to two predicate registers at a time. */
/* ??? Strictly speaking, we shouldn't be counting writes to pr0. */
for (i = PR_REG (0); i < PR_REG (64); i += 2)
need_barrier |= rws_access_reg (i, new_flags, pred);
break;
case 6:
case 7:
abort ();
@ -2486,6 +2477,16 @@ rtx_needs_barrier (x, flags, pred)
need_barrier = rws_access_reg (REG_AR_PFS, new_flags, pred);
break;
case 6: /* mov pr= */
/* This writes all predicate registers. */
new_flags.is_write = 1;
/* We need to skip by two, because rws_access_reg always writes
to two predicate registers at a time. */
/* ??? Strictly speaking, we shouldn't be counting writes to pr0. */
for (i = PR_REG (0); i < PR_REG (64); i += 2)
need_barrier |= rws_access_reg (i, new_flags, pred);
break;
default:
abort ();
}

View File

@ -3049,8 +3049,11 @@
"mov %0 = pr"
[(set_attr "type" "I")])
;; ??? This is volatile to prevent it from being moved before a conditional
;; expression that calculates the return value.
(define_insn "pr_restore"
[(unspec [(const_int 0)] 6)
[(unspec_volatile [(const_int 0)] 6)
(use (match_operand:DI 0 "register_operand" "r"))]
""
"mov pr = %0, -1"