gcc.dg/20020312-2.c starts to fail after the revision 144964 on sh.
sh.c:calc_live_regs always saves the regs ever live, even they
are global.  After 144964, we get more correct live information
for global regs and it reveals the issue.  Another tiny test case
is

register void *reg __asm__("r10");

void
f (void)
{
  reg = 0;
}

which was compiled to

f:
        mov.l   r14,@-r15
        mov     #0,r10
        mov     r15,r14
        mov     r14,r15
        rts
        mov.l   @r15+,r14

before 144964, and now is compiled to

f:
        mov.l   r10,@-r15
        mov.l   r14,@-r15
        mov     r15,r14
        mov     r14,r15
        mov.l   @r15+,r14
        rts
        mov.l   @r15+,r10

I'm testing the patch below.

diff -up ORIG/trunk/gcc/config/sh/sh.c trunk/gcc/config/sh/sh.c
--- ORIG/trunk/gcc/config/sh/sh.c       2008-10-31 19:18:54.000000000 +0900
+++ trunk/gcc/config/sh/sh.c    2009-03-22 06:45:12.000000000 +0900
@@ -5966,7 +5966,9 @@ calc_live_regs (HARD_REG_SET *live_regs_
              && crtl->args.info.call_cookie
              && reg == PIC_OFFSET_TABLE_REGNUM)
             || (df_regs_ever_live_p (reg)
-                && (!call_really_used_regs[reg]
+                && ((!call_really_used_regs[reg]
+                     && !(reg != PIC_OFFSET_TABLE_REGNUM
+                          && fixed_regs[reg] && call_used_regs[reg]))
                     || (trapa_handler && reg == FPSCR_REG && TARGET_FPU_ANY)))
             || (crtl->calls_eh_return
                 && (reg == EH_RETURN_DATA_REGNO (0)


-- 
           Summary: [4.4 Regression] SH: global registers are wrongly saved
           Product: gcc
           Version: 4.4.0
            Status: UNCONFIRMED
          Keywords: wrong-code
          Severity: normal
          Priority: P3
         Component: target
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: kkojima at gcc dot gnu dot org
GCC target triplet: sh4-unknown-linux-gnu


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39523

Reply via email to