aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1996-02-23 08:46:45 -0500
committerRichard Kenner <kenner@gcc.gnu.org>1996-02-23 08:46:45 -0500
commitb453cb0b75e558aad1baa4f299b09b5af0616573 (patch)
tree95639ac9abf386839a2bcdbf08e5ec7cef0bb74a /gcc
parent0dddb42d9003167d9485ef1079f0ecc8d37e34a5 (diff)
downloadgcc-b453cb0b75e558aad1baa4f299b09b5af0616573.zip
gcc-b453cb0b75e558aad1baa4f299b09b5af0616573.tar.gz
gcc-b453cb0b75e558aad1baa4f299b09b5af0616573.tar.bz2
(reload): For special CONST_CALL_P NOTE_INSN_SETJMP, mark all
call-saved regs as used. From-SVN: r11341
Diffstat (limited to 'gcc')
-rw-r--r--gcc/reload1.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/gcc/reload1.c b/gcc/reload1.c
index 788c36a..9b27b47 100644
--- a/gcc/reload1.c
+++ b/gcc/reload1.c
@@ -551,12 +551,20 @@ reload (first, global, dumpfile)
/* Look for REG_EQUIV notes; record what each pseudo is equivalent to.
Also find all paradoxical subregs and find largest such for each pseudo.
On machines with small register classes, record hard registers that
- are used for user variables. These can never be used for spills. */
+ are used for user variables. These can never be used for spills.
+ Also look for a "constant" NOTE_INSN_SETJMP. This means that all
+ caller-saved registers must be marked live. */
for (insn = first; insn; insn = NEXT_INSN (insn))
{
rtx set = single_set (insn);
+ if (GET_CODE (insn) == NOTE && CONST_CALL_P (insn)
+ && NOTE_LINE_NUMBER (insn) == NOTE_INSN_SETJMP)
+ for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
+ if (! call_used_regs[i])
+ regs_ever_live[i] = 1;
+
if (set != 0 && GET_CODE (SET_DEST (set)) == REG)
{
rtx note = find_reg_note (insn, REG_EQUIV, NULL_RTX);