From 33fe78517fb405739fdd5ae4491aa93dd3656bd3 Mon Sep 17 00:00:00 2001 From: Jim Wilson Date: Wed, 15 Sep 1993 23:05:28 -0700 Subject: [PATCH] (mark_set_resources): For CALL_INSN... (mark_set_resources): For CALL_INSN, if followed by a NOTE_INSN_SETJMP note, then assume that all registers are clobbered. Handle case where CALL_INSN is in a sequence. From-SVN: r5334 --- gcc/reorg.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/gcc/reorg.c b/gcc/reorg.c index 98062164318..ba3ef381e50 100644 --- a/gcc/reorg.c +++ b/gcc/reorg.c @@ -506,12 +506,18 @@ mark_set_resources (x, res, in_dest, include_delayed_effects) if (include_delayed_effects) { rtx next = NEXT_INSN (x); + rtx prev = PREV_INSN (x); res->cc = res->memory = 1; for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) if (call_used_regs[i] || global_regs[i]) SET_HARD_REG_BIT (res->regs, i); + /* If X is part of a delay slot sequence, then NEXT should be + the first insn after the sequence. */ + if (NEXT_INSN (prev) != x) + next = NEXT_INSN (NEXT_INSN (prev)); + /* Skip any possible labels between the CALL_INSN and CLOBBERs. */ while (GET_CODE (next) == CODE_LABEL) next = NEXT_INSN (next); @@ -520,6 +526,12 @@ mark_set_resources (x, res, in_dest, include_delayed_effects) && GET_CODE (PATTERN (next)) == CLOBBER); next = NEXT_INSN (next)) mark_set_resources (XEXP (PATTERN (next), 0), res, 1, 0); + + /* Check for a NOTE_INSN_SETJMP. If it exists, then we must + assume that this call can clobber any register. */ + if (next && GET_CODE (next) == NOTE + && NOTE_LINE_NUMBER (next) == NOTE_INSN_SETJMP) + SET_HARD_REG_SET (res->regs); } /* ... and also what it's RTL says it modifies, if anything. */ -- 2.30.2