diff options
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/reload.c | 12 |
2 files changed, 16 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9d3429f..deea69f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2003-05-01 DJ Delorie <dj@redhat.com> + + * reload.c (find_reloads): Also check that all of a multi-reg + value is in the class. + 2003-05-01 Nathan Sidwell <nathan@codesourcery.com> * scan.h (lineno): Revert the rename here. diff --git a/gcc/reload.c b/gcc/reload.c index bc3c177..5a82d99 100644 --- a/gcc/reload.c +++ b/gcc/reload.c @@ -4346,7 +4346,17 @@ find_reloads (insn, replace, ind_levels, live_known, reload_reg_p) if (regno < FIRST_PSEUDO_REGISTER && TEST_HARD_REG_BIT (reg_class_contents[rld[i].class], regno) && HARD_REGNO_MODE_OK (regno, rld[i].mode)) - rld[i].reg_rtx = dest; + { + int nr = HARD_REGNO_NREGS (regno, rld[i].mode); + int ok = 1, nri; + + for (nri = 1; nri < nr; nri ++) + if (! TEST_HARD_REG_BIT (reg_class_contents[rld[i].class], regno + nri)) + ok = 0; + + if (ok) + rld[i].reg_rtx = dest; + } } return retval; |