From: Jim Wilson Date: Thu, 16 Sep 1993 06:05:28 +0000 (-0700) Subject: (mark_set_resources): For CALL_INSN... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=33fe78517fb405739fdd5ae4491aa93dd3656bd3;p=gcc.git (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 --- 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. */