On Tue, May 01, 2007 at 11:45:57PM +0200, Rask Ingemann Lambertsen wrote:
> 
> $ ./xgcc -B./ ~/cvssrc/gcc/gcc/testsuite/gcc.dg/20020210-1.c \
> -O2 -sim=linuxvm86 -o /tmp/20020210-1-fp -fno-omit-frame-pointer
> $ /tmp/20020210-1-fp; echo $?
> 0
> 
> $ ./xgcc -B./ ~/cvssrc/gcc/gcc/testsuite/gcc.dg/20020210-1.c \
> -O2 -sim=linuxvm86 -o /tmp/20020210-1-nofp -fomit-frame-pointer
> $ /tmp/20020210-1-nofp; echo $?
> 1

   It looks like I have a fix:

$ ./xgcc -B./ ~/cvssrc/gcc/gcc/testsuite/gcc.dg/20020210-1.c \ 
-O2 -sim=linuxvm86 -o /tmp/20020210-1-nofp-ny -fomit-frame-pointer
$ /tmp/20020210-1-nofp-ny; echo $?
0

--- 20020210-1-nofp.s   2007-05-01 19:16:23.000000000 +0200
+++ 20020210-1-nofp-ny.s        2007-05-06 02:10:04.000000000 +0200
@@ -24,9 +24,13 @@
        subw    $10,    %sp
        movw    %sp,    %bp
        pushw   22(%bp)
+       movw    %sp,    %bp
        pushw   22(%bp)
+       movw    %sp,    %bp
        pushw   22(%bp)
+       movw    %sp,    %bp
        pushw   22(%bp)
+       movw    %sp,    %bp
        pushw   22(%bp)
        call    bar
        addw    $20,    %sp


Index: reload1.c
===================================================================
--- reload1.c   (revision 124334)
+++ reload1.c   (working copy)
@@ -2709,6 +2722,20 @@ eliminate_regs (rtx x, enum machine_mode
   return eliminate_regs_1 (x, mem_mode, insn, false);
 }
 
+/* Disable inheritance of past reloads from hard reg REG.  Helper function
+   for elimination_effects().  */
+static void
+break_reload_inheritance (unsigned int reg)
+{
+  unsigned int r;
+
+  for (r = 0; r < FIRST_PSEUDO_REGISTER; r++)
+    {
+      if (reg_reloaded_contents[r] == reg)
+       CLEAR_HARD_REG_BIT (reg_reloaded_valid, r);
+    }
+}
+
 /* Scan rtx X for modifications of elimination target registers.  Update
    the table of eliminables to reflect the changed state.  MEM_MODE is
    the mode of an enclosing MEM rtx, or VOIDmode if not within a MEM.  */
@@ -2798,6 +2825,8 @@ elimination_effects (rtx x, enum machine
                else
                  ep->can_eliminate = 0;
              }
+           /* The offset changed, past reloads can't be inherited.  */
+           break_reload_inheritance (ep->to);
          }
 
       /* These two aren't unary operators.  */
@@ -2882,7 +2911,11 @@ elimination_effects (rtx x, enum machine
                if (GET_CODE (src) == PLUS
                    && XEXP (src, 0) == SET_DEST (x)
                    && GET_CODE (XEXP (src, 1)) == CONST_INT)
-                 ep->offset -= INTVAL (XEXP (src, 1));
+                  {
+                   ep->offset -= INTVAL (XEXP (src, 1));
+                   /* The offset changed, past reloads can't be inherited.  */
+                   break_reload_inheritance (ep->to);
+                 }
                else
                  ep->can_eliminate = 0;
              }

(Heading for bed.)

-- 
Rask Ingemann Lambertsen

Reply via email to