On 03/11/2013 12:06 PM, Jan Hubicka wrote:
Hi,
in the testcase we die in post-reload cprop because updating one insn clobber
actually affect other insn clobber.  I actually introduced clobber sharing back
in 2005 to save memory for (clobber cc0).  This broke with introduction of 
post-reload
code copying that is now done by shrink wrapping.

Fixed by unsharing those clobbers that originate from pseudos.
Bootstrapped/regtested x86_64-linux, OK?

        PR middle-end/56571
        * valtrack.c (cleanup_auto_inc_dec): Unshare clobbers originating
        from pseudos.
        * emit-rtl.c (verify_rtx_sharing): Likewise.
        (copy_insn_1): Likewise.
        * rtl.c (copy_rtx): Likewise.

        * gcc.c-torture/compile/pr56571.c: New testcase.

Index: valtrack.c
===================================================================
*** valtrack.c  (revision 196596)
--- valtrack.c  (working copy)
*************** cleanup_auto_inc_dec (rtx src, enum mach
*** 71,77 ****
         /* SCRATCH must be shared because they represent distinct values.  */
         return x;
       case CLOBBER:
!       if (REG_P (XEXP (x, 0)) && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER)
        return x;
         break;

--- 71,78 ----
         /* SCRATCH must be shared because they represent distinct values.  */
         return x;
       case CLOBBER:
!       if (REG_P (XEXP (x, 0)) && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER
!         && ORIGINAL_REGNO (XEXP (x, 0)) == REGNO (XEXP (x, 0)))
        return x;
         break;
Comment? Otherwise one would have to know to look in verify_rtx_sharing to know why clobbers originating from pseudos aren't shared.


*************** copy_insn_1 (rtx orig)
*** 5303,5309 ****
       case SIMPLE_RETURN:
         return orig;
       case CLOBBER:
!       if (REG_P (XEXP (orig, 0)) && REGNO (XEXP (orig, 0)) < 
FIRST_PSEUDO_REGISTER)
        return orig;
         break;

--- 5311,5318 ----
       case SIMPLE_RETURN:
         return orig;
       case CLOBBER:
!       if (REG_P (XEXP (orig, 0)) && REGNO (XEXP (orig, 0)) < 
FIRST_PSEUDO_REGISTER
!         && ORIGINAL_REGNO (XEXP (orig, 0)) == REGNO (XEXP (orig, 0)))
        return orig;
         break;
Similarly.


OK  with those changes.

jeff

Reply via email to