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]

[PATCH] improve index register recognition


Hi,

As the previous patch recognizes a few more address patterns, regalloc, 
reload and regrename need a change to correctly recognize the index 
register. Especially this pattern is now recognized:

(plus (sign_extract ((mult (reg %d0) 2)) 17 15) (reg %a0))

which corresponds to (%a0,%d0.w*2).

Tested on linux-m68k and linux-i585.

2004-08-10  Roman Zippel  <zippel@linux-m68k.org>

	* regclass.c (record_address_regs): correctly recognize index register.
	* regrename.c (scan_rtx_address): ditto.
	* reload.c (find_reloads_address_1): ditto.

Index: regclass.c
===================================================================
RCS file: /home/roman/src/gcc-cvs/gcc/gcc/regclass.c,v
retrieving revision 1.192
diff -u -p -c -r1.192 regclass.c
*** regclass.c	3 Aug 2004 23:37:33 -0000	1.192
--- regclass.c	9 Aug 2004 09:56:37 -0000
*************** record_address_regs (rtx x, enum reg_cla
*** 2022,2034 ****
  	   is a MULT.  */
  
  	else if ((code0 == REG && REG_POINTER (arg0))
! 		 || code1 == MULT)
  	  {
  	    record_address_regs (arg0, MODE_BASE_REG_CLASS (VOIDmode), scale);
  	    record_address_regs (arg1, INDEX_REG_CLASS, scale);
  	  }
  	else if ((code1 == REG && REG_POINTER (arg1))
! 		 || code0 == MULT)
  	  {
  	    record_address_regs (arg0, INDEX_REG_CLASS, scale);
  	    record_address_regs (arg1, MODE_BASE_REG_CLASS (VOIDmode), scale);
--- 2022,2034 ----
  	   is a MULT.  */
  
  	else if ((code0 == REG && REG_POINTER (arg0))
! 		 || code1 == MULT || code1 == SIGN_EXTEND || code1 == SIGN_EXTRACT)
  	  {
  	    record_address_regs (arg0, MODE_BASE_REG_CLASS (VOIDmode), scale);
  	    record_address_regs (arg1, INDEX_REG_CLASS, scale);
  	  }
  	else if ((code1 == REG && REG_POINTER (arg1))
! 		 || code0 == MULT || code0 == SIGN_EXTEND || code0 == SIGN_EXTRACT)
  	  {
  	    record_address_regs (arg0, INDEX_REG_CLASS, scale);
  	    record_address_regs (arg1, MODE_BASE_REG_CLASS (VOIDmode), scale);
Index: regrename.c
===================================================================
RCS file: /home/roman/src/gcc-cvs/gcc/gcc/regrename.c,v
retrieving revision 1.83
diff -u -p -c -r1.83 regrename.c
*** regrename.c	25 Jul 2004 17:57:23 -0000	1.83
--- regrename.c	9 Aug 2004 09:56:37 -0000
*************** scan_rtx_address (rtx insn, rtx *loc, en
*** 543,555 ****
  	  }
  
  	if (code0 == MULT || code0 == SIGN_EXTEND || code0 == TRUNCATE
! 	    || code0 == ZERO_EXTEND || code1 == MEM)
  	  {
  	    locI = &XEXP (x, 0);
  	    locB = &XEXP (x, 1);
  	  }
  	else if (code1 == MULT || code1 == SIGN_EXTEND || code1 == TRUNCATE
! 		 || code1 == ZERO_EXTEND || code0 == MEM)
  	  {
  	    locI = &XEXP (x, 1);
  	    locB = &XEXP (x, 0);
--- 543,555 ----
  	  }
  
  	if (code0 == MULT || code0 == SIGN_EXTEND || code0 == TRUNCATE
! 	    || code0 == ZERO_EXTEND || code0 == SIGN_EXTRACT || code1 == MEM)
  	  {
  	    locI = &XEXP (x, 0);
  	    locB = &XEXP (x, 1);
  	  }
  	else if (code1 == MULT || code1 == SIGN_EXTEND || code1 == TRUNCATE
! 		 || code1 == ZERO_EXTEND || code1 == SIGN_EXTRACT || code0 == MEM)
  	  {
  	    locI = &XEXP (x, 1);
  	    locB = &XEXP (x, 0);
*************** replace_oldest_value_addr (rtx *loc, enu
*** 1419,1431 ****
  	  }
  
  	if (code0 == MULT || code0 == SIGN_EXTEND || code0 == TRUNCATE
! 	    || code0 == ZERO_EXTEND || code1 == MEM)
  	  {
  	    locI = &XEXP (x, 0);
  	    locB = &XEXP (x, 1);
  	  }
  	else if (code1 == MULT || code1 == SIGN_EXTEND || code1 == TRUNCATE
! 		 || code1 == ZERO_EXTEND || code0 == MEM)
  	  {
  	    locI = &XEXP (x, 1);
  	    locB = &XEXP (x, 0);
--- 1419,1431 ----
  	  }
  
  	if (code0 == MULT || code0 == SIGN_EXTEND || code0 == TRUNCATE
! 	    || code0 == ZERO_EXTEND || code0 == SIGN_EXTRACT || code1 == MEM)
  	  {
  	    locI = &XEXP (x, 0);
  	    locB = &XEXP (x, 1);
  	  }
  	else if (code1 == MULT || code1 == SIGN_EXTEND || code1 == TRUNCATE
! 		 || code1 == ZERO_EXTEND || code1 == SIGN_EXTRACT || code0 == MEM)
  	  {
  	    locI = &XEXP (x, 1);
  	    locB = &XEXP (x, 0);
Index: reload.c
===================================================================
RCS file: /home/roman/src/gcc-cvs/gcc/gcc/reload.c,v
retrieving revision 1.247
diff -u -p -c -r1.247 reload.c
*** reload.c	3 Aug 2004 23:37:33 -0000	1.247
--- reload.c	9 Aug 2004 09:56:37 -0000
*************** find_reloads_address_1 (enum machine_mod
*** 5291,5297 ****
  	  }
  
  	if (code0 == MULT || code0 == SIGN_EXTEND || code0 == TRUNCATE
! 	    || code0 == ZERO_EXTEND || code1 == MEM)
  	  {
  	    find_reloads_address_1 (mode, orig_op0, 1, &XEXP (x, 0), opnum,
  				    type, ind_levels, insn);
--- 5291,5297 ----
  	  }
  
  	if (code0 == MULT || code0 == SIGN_EXTEND || code0 == TRUNCATE
! 	    || code0 == ZERO_EXTEND || code0 == SIGN_EXTRACT || code1 == MEM)
  	  {
  	    find_reloads_address_1 (mode, orig_op0, 1, &XEXP (x, 0), opnum,
  				    type, ind_levels, insn);
*************** find_reloads_address_1 (enum machine_mod
*** 5300,5306 ****
  	  }
  
  	else if (code1 == MULT || code1 == SIGN_EXTEND || code1 == TRUNCATE
! 		 || code1 == ZERO_EXTEND || code0 == MEM)
  	  {
  	    find_reloads_address_1 (mode, orig_op0, 0, &XEXP (x, 0), opnum,
  				    type, ind_levels, insn);
--- 5300,5306 ----
  	  }
  
  	else if (code1 == MULT || code1 == SIGN_EXTEND || code1 == TRUNCATE
! 		 || code1 == ZERO_EXTEND || code1 == SIGN_EXTRACT || code0 == MEM)
  	  {
  	    find_reloads_address_1 (mode, orig_op0, 0, &XEXP (x, 0), opnum,
  				    type, ind_levels, insn);


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