reload.c (find_reloads): Always force (subreg (mem)) to be reloaded if WORD_REGISTER_...
authorRichard Henderson <rth@cygnus.com>
Thu, 5 Mar 1998 02:42:22 +0000 (18:42 -0800)
committerRichard Henderson <rth@gcc.gnu.org>
Thu, 5 Mar 1998 02:42:22 +0000 (18:42 -0800)
* reload.c (find_reloads): Always force (subreg (mem)) to be
reloaded if WORD_REGISTER_OPERATIONS.

From-SVN: r18416

gcc/ChangeLog
gcc/reload.c

index c99b2d2a00cec79b4cd1ca2ac027f7d37b1a3d6f..f5bb3fc1e3a129e784f0f441f7e6e9b752e6eb00 100644 (file)
@@ -1,3 +1,8 @@
+Thu Mar  5 02:41:27 1998  Richard Henderson  <rth@cygnus.com>
+
+       * reload.c (find_reloads): Always force (subreg (mem)) to be
+       reloaded if WORD_REGISTER_OPERATIONS.
+
 Thu Mar  5 02:14:44 1998  Richard Henderson  <rth@cygnus.com>
 
        * haifa-sched.c (free_list): Rename from free_pnd_lst.
index bd22bbeddb8e57de34496b033526eb2eacfd68c7..4187b120775fb1f913259ba8038d496a6aefdb75 100644 (file)
@@ -2753,10 +2753,20 @@ find_reloads (insn, replace, ind_levels, live_known, reload_reg_p)
                     register access.  If the data is, in fact, in memory we
                     must always load using the size assumed to be in the
                     register and let the insn do the different-sized 
-                    accesses.  */
+                    accesses.
+
+                    This is doubly true if WORD_REGISTER_OPERATIONS.  In 
+                    this case eliminate_regs has left non-paradoxical
+                    subregs for push_reloads to see.  Make sure it does
+                    by forcing the reload.
+
+                    ??? When is it right at this stage to have a subreg
+                    of a mem that is _not_ to be handled specialy?  IMO
+                    those should have been reduced to just a mem.  */
                  || ((GET_CODE (operand) == MEM
                       || (GET_CODE (operand)== REG
                           && REGNO (operand) >= FIRST_PSEUDO_REGISTER))
+#ifndef WORD_REGISTER_OPERATIONS
                      && (((GET_MODE_BITSIZE (GET_MODE (operand))
                            < BIGGEST_ALIGNMENT)
                           && (GET_MODE_SIZE (operand_mode[i])
@@ -2771,7 +2781,9 @@ find_reloads (insn, replace, ind_levels, live_known, reload_reg_p)
                              && INTEGRAL_MODE_P (GET_MODE (operand))
                              && LOAD_EXTEND_OP (GET_MODE (operand)) != NIL)
 #endif
-                         ))
+                         )
+#endif
+                     )
                  /* Subreg of a hard reg which can't handle the subreg's mode
                     or which would handle that mode in the wrong number of
                     registers for subregging to work.  */