From: Jeffrey A Law Date: Thu, 17 Jun 1999 13:29:11 +0000 (+0000) Subject: loop.c (move_movables): Note issues with replacing REGs with SUBREGs. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=51f0646f8a46b03d0fd01c79daf82a9ae5a2fceb;p=gcc.git loop.c (move_movables): Note issues with replacing REGs with SUBREGs. � * loop.c (move_movables): Note issues with replacing REGs with SUBREGs. * mips.h (GO_IF_LEGITIMATE_ADDRESS): Handle SUBREGs properly. From-SVN: r27573 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e09ddfe7014..dabee24bdee 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +Thu Jun 17 14:25:08 1999 Jeffrey A Law (law@cygnus.com) + + * loop.c (move_movables): Note issues with replacing REGs with + SUBREGs. + * mips.h (GO_IF_LEGITIMATE_ADDRESS): Handle SUBREGs properly. + Thu Jun 17 13:28:30 1999 David O'Brien * i386/freebsd-elf.h (LINK_SPEC): Fix typo. diff --git a/gcc/config/mips/mips.h b/gcc/config/mips/mips.h index 3c104a59fe7..ed900962c4e 100644 --- a/gcc/config/mips/mips.h +++ b/gcc/config/mips/mips.h @@ -2858,6 +2858,9 @@ typedef struct mips_args { GO_DEBUG_RTX (xinsn); \ } \ \ + while (GET_CODE (xinsn) == SUBREG) \ + xinsn = SUBREG_REG (xinsn); \ + \ /* The mips16 can only use the stack pointer as a base register when \ loading SImode or DImode values. */ \ if (GET_CODE (xinsn) == REG && REG_MODE_OK_FOR_BASE_P (xinsn, MODE)) \ @@ -2873,6 +2876,8 @@ typedef struct mips_args { register rtx xlow0 = XEXP (xinsn, 0); \ register rtx xlow1 = XEXP (xinsn, 1); \ \ + while (GET_CODE (xlow0) == SUBREG) \ + xlow0 = SUBREG_REG (xlow0); \ if (GET_CODE (xlow0) == REG \ && REG_MODE_OK_FOR_BASE_P (xlow0, MODE) \ && mips_check_split (xlow1, MODE)) \ @@ -2883,8 +2888,16 @@ typedef struct mips_args { { \ register rtx xplus0 = XEXP (xinsn, 0); \ register rtx xplus1 = XEXP (xinsn, 1); \ - register enum rtx_code code0 = GET_CODE (xplus0); \ - register enum rtx_code code1 = GET_CODE (xplus1); \ + register enum rtx_code code0; \ + register enum rtx_code code1; \ + \ + while (GET_CODE (xplus0) == SUBREG) \ + xplus0 = SUBREG_REG (xplus0); \ + code0 = GET_CODE (xplus0); \ + \ + while (GET_CODE (xplus1) == SUBREG) \ + xplus1 = SUBREG_REG (xplus1); \ + code1 = GET_CODE (xplus1); \ \ /* The mips16 can only use the stack pointer as a base register \ when loading SImode or DImode values. */ \ diff --git a/gcc/loop.c b/gcc/loop.c index 6f0637fcf20..dcddba681b4 100644 --- a/gcc/loop.c +++ b/gcc/loop.c @@ -2170,7 +2170,14 @@ move_movables (movables, threshold, insn_count, loop_start, end, nregs) /* Schedule the reg loaded by M1 for replacement so that shares the reg of M. If the modes differ (only possible in restricted - circumstances, make a SUBREG. */ + circumstances, make a SUBREG. + + Note this assumes that the target dependent files + treat REG and SUBREG equally, including within + GO_IF_LEGITIMATE_ADDRESS and in all the + predicates since we never verify that replacing the + original register with a SUBREG results in a + recognizable insn. */ if (GET_MODE (m->set_dest) == GET_MODE (m1->set_dest)) reg_map[m1->regno] = m->set_dest; else