This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Fix PR/13938 and PR/13893 (Was: Share clobbers of hard registers...)


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;
  


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]