This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Fix PR/13938 and PR/13893 (Was: Share clobbers of hard registers...)
- From: Josef Zlomek <zlomekj at suse dot cz>
- To: gcc-patches at gcc dot gnu dot org
- Cc: Jan Hubicka <jh at suse dot cz>
- Date: Thu, 5 Feb 2004 11:42:14 +0100
- Subject: Fix PR/13938 and PR/13893 (Was: Share clobbers of hard registers...)
- References: <20040119204859.GX7878@kam.mff.cuni.cz> <20040205101811.GA2838@artax.karlin.mff.cuni.cz>
This patch fixes PR/13938 and PR/13893.
The problem is that clobber in
(insn 57 17 59 1 (parallel [
(set (mem:DI (plus:SI (reg/f:SI 6 bp)
(const_int -16 [0xfffffff0])) [0 S8 A8])
(fix:DI (reg/v:DF 9 st(1) [orig:59 x ] [59])))
(use (mem:HI (plus:SI (reg/f:SI 6 bp)
(const_int -2 [0xfffffffe])) [0 S2 A8]))
(use (mem:HI (plus:SI (reg/f:SI 6 bp)
(const_int -4 [0xfffffffc])) [0 S2 A8]))
(clobber (reg:DF 9 st(1)))
]) 146 {fix_truncdi_memory} (insn_list 17 (insn_list 48 (insn_list 51 (nil))))
(expr_list:REG_DEAD (reg/v:DF 9 st(1) [orig:59 x ] [59])
(expr_list:REG_UNUSED (reg/v:DF 9 st(1) [orig:59 x ] [59])
(nil))))
is shared with
(insn 89 23 90 3 (parallel [
(set (mem:DI (plus:SI (reg/f:SI 6 bp)
(const_int -16 [0xfffffff0])) [0 S8 A8])
(fix:DI (reg:DF 8 st)))
(use (mem:HI (plus:SI (reg/f:SI 6 bp)
(const_int -2 [0xfffffffe])) [0 S2 A8]))
(use (mem:HI (plus:SI (reg/f:SI 6 bp)
(const_int -4 [0xfffffffc])) [0 S2 A8]))
(clobber (reg:DF 9 st(1)))
]) 146 {fix_truncdi_memory} (insn_list 23 (insn_list 85 (insn_list 88 (nil))))
(expr_list:REG_DEAD (reg:DF 8 st)
(nil)))
but in the first insn there should be
(clobber (reg/v:DF 9 st(1)))
instead of
(clobber (reg:DF 9 st(1)))
This patch makes GCC to share only flag registers.
OK if it passes bootstrapping/regtesting?
Josef
2004-02-05 Josef Zlomek <zlomekj@suse.cz>
* emit-rtl.c (verify_rtx_sharing): Share only flag registers
in clobber.
(copy_rtx_if_shared_1): Likewise.
(copy_insn_1): Likewise.
(gen_hard_reg_clobber): Likewise.
* rtl.c (copy_rtx): Likewise.
Index: emit-rtl.c
===================================================================
RCS file: /cvs/gcc-cvs/gcc/gcc/emit-rtl.c,v
retrieving revision 1.375
diff -c -p -c -3 -p -r1.375 emit-rtl.c
*** emit-rtl.c 4 Feb 2004 06:12:50 -0000 1.375
--- emit-rtl.c 5 Feb 2004 10:29:54 -0000
*************** verify_rtx_sharing (rtx orig, rtx insn)
*** 2154,2160 ****
return;
/* SCRATCH must be shared because they represent distinct values. */
case CLOBBER:
! if (REG_P (XEXP (x, 0)) && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER)
return;
break;
--- 2154,2161 ----
return;
/* SCRATCH must be shared because they represent distinct values. */
case CLOBBER:
! if (REG_P (XEXP (x, 0)) && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER
! && GET_MODE_CLASS (GET_MODE (XEXP (x, 0))) == MODE_CC)
return;
break;
*************** repeat:
*** 2452,2458 ****
/* SCRATCH must be shared because they represent distinct values. */
return;
case CLOBBER:
! if (REG_P (XEXP (x, 0)) && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER)
return;
break;
--- 2453,2460 ----
/* SCRATCH must be shared because they represent distinct values. */
return;
case CLOBBER:
! if (REG_P (XEXP (x, 0)) && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER
! && GET_MODE_CLASS (GET_MODE (XEXP (x, 0))) == MODE_CC)
return;
break;
*************** copy_insn_1 (rtx orig)
*** 4949,4955 ****
case ADDRESSOF:
return orig;
case CLOBBER:
! if (REG_P (XEXP (orig, 0)) && REGNO (XEXP (orig, 0)) < FIRST_PSEUDO_REGISTER)
return orig;
break;
--- 4951,4959 ----
case ADDRESSOF:
return orig;
case CLOBBER:
! if (REG_P (XEXP (orig, 0))
! && REGNO (XEXP (orig, 0)) < FIRST_PSEUDO_REGISTER
! && GET_MODE_CLASS (GET_MODE (XEXP (orig, 0))) == MODE_CC)
return orig;
break;
*************** static GTY((deletable(""))) rtx hard_reg
*** 5472,5478 ****
rtx
gen_hard_reg_clobber (enum machine_mode mode, unsigned int regno)
{
! if (hard_reg_clobbers[mode][regno])
return hard_reg_clobbers[mode][regno];
else
return (hard_reg_clobbers[mode][regno] =
--- 5476,5482 ----
rtx
gen_hard_reg_clobber (enum machine_mode mode, unsigned int regno)
{
! if (GET_MODE_CLASS (mode) == MODE_CC && hard_reg_clobbers[mode][regno])
return hard_reg_clobbers[mode][regno];
else
return (hard_reg_clobbers[mode][regno] =
Index: rtl.c
===================================================================
RCS file: /cvs/gcc-cvs/gcc/gcc/rtl.c,v
retrieving revision 1.132
diff -c -p -c -3 -p -r1.132 rtl.c
*** rtl.c 21 Jan 2004 20:40:04 -0000 1.132
--- rtl.c 5 Feb 2004 10:30:48 -0000
*************** copy_rtx (rtx orig)
*** 225,231 ****
case ADDRESSOF:
return orig;
case CLOBBER:
! if (REG_P (XEXP (orig, 0)) && REGNO (XEXP (orig, 0)) < FIRST_PSEUDO_REGISTER)
return orig;
break;
--- 225,233 ----
case ADDRESSOF:
return orig;
case CLOBBER:
! if (REG_P (XEXP (orig, 0))
! && REGNO (XEXP (orig, 0)) < FIRST_PSEUDO_REGISTER
! && GET_MODE_CLASS (GET_MODE (XEXP (orig, 0))) == MODE_CC)
return orig;
break;