diff options
author | dj <dj@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-01-26 01:15:05 +0000 |
---|---|---|
committer | dj <dj@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-01-26 01:15:05 +0000 |
commit | f82c9309b58e52344feb2159db842c8c78b6f562 (patch) | |
tree | e94bef205fa07071eecbd388e4cc4f6dec008a79 /gcc/reload1.c | |
parent | 8b05ee0d4d590350b6553ac0d48927441639ebf0 (diff) | |
download | gcc-f82c9309b58e52344feb2159db842c8c78b6f562.tar.gz |
* reload1.c (choose_reload_regs): Check for invalid subregs before
computing their locations, not after.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@121198 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/reload1.c')
-rw-r--r-- | gcc/reload1.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/gcc/reload1.c b/gcc/reload1.c index 8f7c703c415..5598b7afdba 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) |