aboutsummaryrefslogtreecommitdiff
path: root/gcc/reload1.c
diff options
context:
space:
mode:
authorDJ Delorie <dj@redhat.com>2007-01-25 20:15:05 -0500
committerDJ Delorie <dj@gcc.gnu.org>2007-01-25 20:15:05 -0500
commit21f14ff9556fb50f0280bcb570d87cd08d367774 (patch)
treee94bef205fa07071eecbd388e4cc4f6dec008a79 /gcc/reload1.c
parente8589103525d84febbc25064828b36734a643100 (diff)
downloadgcc-21f14ff9556fb50f0280bcb570d87cd08d367774.zip
gcc-21f14ff9556fb50f0280bcb570d87cd08d367774.tar.gz
gcc-21f14ff9556fb50f0280bcb570d87cd08d367774.tar.bz2
reload1.c (choose_reload_regs): Check for invalid subregs before computing their locations, not after.
* reload1.c (choose_reload_regs): Check for invalid subregs before computing their locations, not after. From-SVN: r121198
Diffstat (limited to 'gcc/reload1.c')
-rw-r--r--gcc/reload1.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/gcc/reload1.c b/gcc/reload1.c
index 8f7c703..5598b7a 100644
--- a/gcc/reload1.c
+++ b/gcc/reload1.c
@@ -5653,7 +5653,16 @@ choose_reload_regs (struct insn_chain *chain)
regno = subreg_regno (rld[r].in);
#endif
- if (regno >= 0 && reg_last_reload_reg[regno] != 0)
+ if (regno >= 0
+ && reg_last_reload_reg[regno] != 0
+#ifdef CANNOT_CHANGE_MODE_CLASS
+ /* Verify that the register it's in can be used in
+ mode MODE. */
+ && !REG_CANNOT_CHANGE_MODE_P (REGNO (reg_last_reload_reg[regno]),
+ GET_MODE (reg_last_reload_reg[regno]),
+ mode)
+#endif
+ )
{
enum reg_class class = rld[r].class, last_class;
rtx last_reg = reg_last_reload_reg[regno];
@@ -5673,13 +5682,6 @@ choose_reload_regs (struct insn_chain *chain)
if ((GET_MODE_SIZE (GET_MODE (last_reg))
>= GET_MODE_SIZE (need_mode))
-#ifdef CANNOT_CHANGE_MODE_CLASS
- /* Verify that the register in "i" can be obtained
- from LAST_REG. */
- && !REG_CANNOT_CHANGE_MODE_P (REGNO (last_reg),
- GET_MODE (last_reg),
- mode)
-#endif
&& reg_reloaded_contents[i] == regno
&& TEST_HARD_REG_BIT (reg_reloaded_valid, i)
&& HARD_REGNO_MODE_OK (i, rld[r].mode)