sh.c (sh_expand_prologue): Add a REG_FRAME_RELATED_EXPR note to pretend a direct...
authorKaz Kojima <kkojima@gcc.gnu.org>
Mon, 20 Sep 2004 23:10:00 +0000 (23:10 +0000)
committerKaz Kojima <kkojima@gcc.gnu.org>
Mon, 20 Sep 2004 23:10:00 +0000 (23:10 +0000)
* config/sh/sh.c (sh_expand_prologue): Add a REG_FRAME_RELATED_EXPR
note to pretend a direct save from the original register when an
intermediate register is used for the save.

From-SVN: r87778

gcc/ChangeLog
gcc/config/sh/sh.c

index 919059442c840ddce531829b38798828314141a3..135da237ed1b36a9791a8d1ae0d696741c196ea2 100644 (file)
@@ -1,3 +1,9 @@
+2004-09-20  Kaz Kojima  <kkojima@gcc.gnu.org>
+
+       * config/sh/sh.c (sh_expand_prologue): Add a REG_FRAME_RELATED_EXPR
+       note to pretend a direct save from the original register when an
+       intermediate register is used for the save.
+
 2004-09-20  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
        * tsystem.h (alloca): Provide a default definition.
index c7d158cfeb65aad084d0e0587375815d3eb3703f..0e98ee3ef45ae71a0956e4bbb7555bff8ffa7c20 100644 (file)
@@ -5558,6 +5558,7 @@ sh_expand_prologue (void)
          enum machine_mode mode = entry->mode;
          int reg = entry->reg;
          rtx reg_rtx, mem_rtx, pre_dec = NULL_RTX;
+         rtx orig_reg_rtx;
 
          offset = entry->offset;
 
@@ -5647,6 +5648,7 @@ sh_expand_prologue (void)
            abort ();
 
        addr_ok:
+         orig_reg_rtx = reg_rtx;
          if (TARGET_REGISTER_P (reg)
              || ((reg == PR_REG || SPECIAL_REGISTER_P (reg))
                  && mem_rtx != pre_dec))
@@ -5674,6 +5676,22 @@ sh_expand_prologue (void)
            /* Mark as interesting for dwarf cfi generator */
            insn = emit_move_insn (mem_rtx, reg_rtx);
            RTX_FRAME_RELATED_P (insn) = 1;
+           /* If we use an intermediate register for the save, we can't
+              describe this exactly in cfi as a copy of the to-be-saved
+              register into the temporary register and then the temporary
+              register on the stack, because the temporary register can
+              have a different natural size than the to-be-saved register.
+              Thus, we gloss over the intermediate copy and pretend we do
+              a direct save from the to-be-saved register.  */
+           if (REGNO (reg_rtx) != reg)
+             {
+               rtx set, note_rtx;
+
+               set = gen_rtx_SET (VOIDmode, mem_rtx, orig_reg_rtx);
+               note_rtx = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR, set,
+                                             REG_NOTES (insn));
+               REG_NOTES (insn) = note_rtx;
+             }
 
            if (TARGET_SHCOMPACT && (offset_in_r0 != -1))
              {