This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] improve index register recognition
- From: Roman Zippel <zippel at linux-m68k dot org>
- To: gcc-patches at gcc dot gnu dot org
- Date: Tue, 10 Aug 2004 01:19:35 +0200 (CEST)
- Subject: [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);