]> gcc.gnu.org Git - gcc.git/commitdiff
Fix powerpc/rs6000 (subreg:SF (mem:SI ...)) reload problem.
authorJim Wilson <wilson@cygnus.com>
Thu, 22 Jan 1998 14:48:58 +0000 (14:48 +0000)
committerJim Wilson <wilson@gcc.gnu.org>
Thu, 22 Jan 1998 14:48:58 +0000 (06:48 -0800)
* reload.c (push_reload): In WORD_REGISTER_OPERATIONS code, add test
to require the SUBREG mode to be smaller than the SUBREG_REG mode.
* reload1.c (eliminate_regs): Likewise.

From-SVN: r17444

gcc/ChangeLog
gcc/reload.c
gcc/reload1.c

index 26999e7e1a3feb31aba31a31b0bdf9416afcf778..833b3285e6cc2fad107d7b07833d6927984fd22d 100644 (file)
@@ -1,3 +1,9 @@
+Thu Jan 22 14:47:31 1998  Jim Wilson  <wilson@cygnus.com>
+
+       * reload.c (push_reload): In WORD_REGISTER_OPERATIONS code, add test
+       to require the SUBREG mode to be smaller than the SUBREG_REG mode.
+       * reload1.c (eliminate_regs): Likewise.
+
 Thu Jan 22 14:49:14 1998  Jeffrey A Law  (law@cygnus.com)
 
        * regmove.c (find_matches): Initialize matches->earlyclobber too.
index 983060a865a9a5c3ff73a5e70a702d1ad79ee2a4..2fcdd5a6aea942503416f4ed6e5b591537312f9d 100644 (file)
@@ -987,9 +987,11 @@ push_reload (in, out, inloc, outloc, class,
              && ((GET_MODE_SIZE (outmode)
                   > GET_MODE_SIZE (GET_MODE (SUBREG_REG (out))))
 #ifdef WORD_REGISTER_OPERATIONS
-                 || ((GET_MODE_SIZE (outmode) - 1) / UNITS_PER_WORD ==
-                     ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (out))) - 1)
-                      / UNITS_PER_WORD))
+                 || ((GET_MODE_SIZE (outmode)
+                      < GET_MODE_SIZE (GET_MODE (SUBREG_REG (out))))
+                     && ((GET_MODE_SIZE (outmode) - 1) / UNITS_PER_WORD ==
+                         ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (out))) - 1)
+                          / UNITS_PER_WORD)))
 #endif
                  ))
          || (GET_CODE (SUBREG_REG (out)) == REG
index 6de93b9b44b02693fd5e16661f3a9574e37f356e..01263c8e4523ddd694f8c6f13d96ac8a446f057c 100644 (file)
@@ -3122,17 +3122,19 @@ eliminate_regs (x, mem_mode, insn)
          int new_size = GET_MODE_SIZE (GET_MODE (new));
 
          if (GET_CODE (new) == MEM
-             && x_size <= new_size
+             && ((x_size < new_size
 #ifdef WORD_REGISTER_OPERATIONS
-             /* On these machines, combine can create rtl of the form
-                  (set (subreg:m1 (reg:m2 R) 0) ...)
-                where m1 < m2, and expects something interesting to 
-                happen to the entire word.  Moreover, it will use the
-                (reg:m2 R) later, expecting all bits to be preserved.
-                So if the number of words is the same, preserve the 
-                subreg so that push_reloads can see it.  */
-             && ! ((x_size-1)/UNITS_PER_WORD == (new_size-1)/UNITS_PER_WORD)
+                  /* On these machines, combine can create rtl of the form
+                     (set (subreg:m1 (reg:m2 R) 0) ...)
+                     where m1 < m2, and expects something interesting to 
+                     happen to the entire word.  Moreover, it will use the
+                     (reg:m2 R) later, expecting all bits to be preserved.
+                     So if the number of words is the same, preserve the 
+                     subreg so that push_reloads can see it.  */
+                  && ! ((x_size-1)/UNITS_PER_WORD == (new_size-1)/UNITS_PER_WORD)
 #endif
+                  )
+                 || (x_size == new_size))
 #ifdef LOAD_EXTEND_OP
              /* On these machines we will be reloading what is
                 inside the SUBREG if it originally was a pseudo and
This page took 0.09535 seconds and 5 git commands to generate.