OSDN Git Service

(mark_used_regs): Do recurse in setting of global hard reg.
authorrms <rms@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 7 Aug 1992 04:00:44 +0000 (04:00 +0000)
committerrms <rms@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 7 Aug 1992 04:00:44 +0000 (04:00 +0000)
Do set reg_next_use for global hard reg.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@1778 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/flow.c

index 93b76f7..7e3b207 100644 (file)
@@ -1524,6 +1524,7 @@ insn_dead_p (x, needed, call_ok)
          register REGSET_ELT_TYPE bit
            = (REGSET_ELT_TYPE) 1 << (regno % REGSET_ELT_BITS);
 
+         /* Don't delete insns to set global regs.  */
          if ((regno < FIRST_PSEUDO_REGISTER && global_regs[regno])
              /* Make sure insns to set frame pointer aren't deleted.  */
              || regno == FRAME_POINTER_REGNUM
@@ -2167,7 +2168,11 @@ mark_used_regs (needed, live, x, final, insn)
            /* No death notes for global register variables;
               their values are live after this function exits.  */
            if (global_regs[regno])
-             return;
+             {
+               if (final)
+                 reg_next_use[regno] = insn;
+               return;
+             }
 
            n = HARD_REGNO_NREGS (regno, GET_MODE (x));
            while (--n > 0)
@@ -2311,7 +2316,9 @@ mark_used_regs (needed, live, x, final, insn)
 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
            && ! (regno == ARG_POINTER_REGNUM && fixed_regs[regno])
 #endif
-           && ! (regno < FIRST_PSEUDO_REGISTER && global_regs[regno]))
+           )
+         /* We used to exclude global_regs here, but that seems wrong.
+            Storing in them is like storing in mem.  */
          {
            mark_used_regs (needed, live, SET_SRC (x), final, insn);
            if (mark_dest)