(mark_referenced_resources): Make setjmp use all registers.
authorJim Wilson <wilson@gcc.gnu.org>
Wed, 29 Mar 1995 22:38:28 +0000 (14:38 -0800)
committerJim Wilson <wilson@gcc.gnu.org>
Wed, 29 Mar 1995 22:38:28 +0000 (14:38 -0800)
From-SVN: r9248

gcc/reorg.c

index 7c5e3c8a8844cfa4a4242557e9245642cf564e88..4c36d33b3fb58ac8879e57cb424c7b8cba59dbcb 100644 (file)
@@ -379,11 +379,13 @@ mark_referenced_resources (x, res, include_delayed_effects)
          rtx insn = PREV_INSN (x);
          rtx sequence = 0;
          int seq_size = 0;
+         rtx next = NEXT_INSN (x);
          int i;
 
          /* If we are part of a delay slot sequence, point at the SEQUENCE. */
          if (NEXT_INSN (insn) != x)
            {
+             next = NEXT_INSN (NEXT_INSN (insn));
              sequence = PATTERN (NEXT_INSN (insn));
              seq_size = XVECLEN (sequence, 0);
              if (GET_CODE (sequence) != SEQUENCE)
@@ -404,6 +406,18 @@ mark_referenced_resources (x, res, include_delayed_effects)
            if (global_regs[i])
              SET_HARD_REG_BIT (res->regs, i);
 
+         /* Check for a NOTE_INSN_SETJMP.  If it exists, then we must
+            assume that this call can need any register.
+
+            This is done to be more conservative about how we handle setjmp.
+            We assume that they both use and set all registers.  Using all
+            registers ensures that a register will not be considered dead
+            just because it crosses a setjmp call.  A register should be
+            considered dead only if the setjmp call returns non-zero.  */
+         if (next && GET_CODE (next) == NOTE
+             && NOTE_LINE_NUMBER (next) == NOTE_INSN_SETJMP)
+           SET_HARD_REG_SET (res->regs);
+
          {
            rtx link;