reload1.c (choose_reload_regs): Don't inherit a reload that crosses multiple register...
authorGeoffrey Keating <geoffk@redhat.com>
Thu, 19 Jul 2001 19:45:24 +0000 (19:45 +0000)
committerGeoffrey Keating <geoffk@gcc.gnu.org>
Thu, 19 Jul 2001 19:45:24 +0000 (19:45 +0000)
* reload1.c (choose_reload_regs): Don't inherit a reload
that crosses multiple registers if registers past the first
don't fit in the desired class.

From-SVN: r44160

gcc/ChangeLog
gcc/reload1.c

index e643a7609771cb0fb2546802a7b160853c282e8b..f8f9e2fb57b95370f3f09e27587219966275d4bb 100644 (file)
@@ -1,5 +1,9 @@
 2001-07-19  Geoffrey Keating  <geoffk@redhat.com>
 
+       * reload1.c (choose_reload_regs): Don't inherit a reload
+       that crosses multiple registers if registers past the first
+       don't fit in the desired class.
+
        * ifcvt.c (noce_try_store_flag_constants): Use trunc_int_for_mode
        when negating constants.
 
index c494990e1f57a6ba12fa42850a5ab24215331467..94eccfe1974a5d3e94102381d2e0376104cdd49c 100644 (file)
@@ -5508,10 +5508,16 @@ choose_reload_regs (chain)
                      if (k == nr)
                        {
                          int i1;
+                         int bad_for_class;
 
                          last_reg = (GET_MODE (last_reg) == mode
                                      ? last_reg : gen_rtx_REG (mode, i));
 
+                         bad_for_class = 0;
+                         for (k = 0; k < nr; k++)
+                           bad_for_class |= ! TEST_HARD_REG_BIT (reg_class_contents[(int) rld[r].class],
+                                                                 i+k);
+
                          /* We found a register that contains the
                             value we need.  If this register is the
                             same as an `earlyclobber' operand of the
@@ -5541,8 +5547,7 @@ choose_reload_regs (chain)
                                 if we need it wider than we've got it.  */
                              || (GET_MODE_SIZE (rld[r].mode)
                                  > GET_MODE_SIZE (mode))
-                             || ! TEST_HARD_REG_BIT (reg_class_contents[(int) rld[r].class],
-                                                     i)
+                             || bad_for_class
 
                              /* If find_reloads chose reload_out as reload
                                 register, stay with it - that leaves the