Fix sparc builtin_memcpy miscompilation.
authorJim Wilson <wilson@cygnus.com>
Wed, 21 Oct 1998 19:27:19 +0000 (19:27 +0000)
committerJim Wilson <wilson@gcc.gnu.org>
Wed, 21 Oct 1998 19:27:19 +0000 (12:27 -0700)
* expmed.c (store_bit_field): If need to add a SUBREG, then remove
existing SUBREG if we can, otherwise abort.

From-SVN: r23215

gcc/ChangeLog
gcc/expmed.c

index 9799e65f9c2e0935ab189d192156d4344d6ab20b..8f715712d7c0954b7713f87520ffd494563cde78 100644 (file)
@@ -1,3 +1,8 @@
+Wed Oct 21 19:23:59 1998  Jim Wilson  <wilson@cygnus.com>
+
+       * expmed.c (store_bit_field): If need to add a SUBREG, then remove
+       existing SUBREG if we can, otherwise abort.
+
 Wed Oct 21 09:58:51 1998  Mark Mitchell  <mark@markmitchell.com>
 
        * c-common.c (c_apply_type_quals_to_decl): Don't crash when
index 1c9fcf578299bafb5845e4b691a35ec5c60ef73a..2836c4cdf6d50db03b8f348aa90f3eebcfa72ef8 100644 (file)
@@ -423,7 +423,18 @@ store_bit_field (str_rtx, bitsize, bitnum, fieldmode, value, align, total_size)
          || GET_MODE_SIZE (GET_MODE (op0)) > UNITS_PER_WORD)
        {
          if (GET_CODE (op0) != REG)
-           op0 = copy_to_reg (op0);
+           {
+             /* Since this is a destination (lvalue), we can't copy it to a
+                pseudo.  We can trivially remove a SUBREG that does not
+                change the size of the operand.  Such a SUBREG may have been
+                added above.  Otherwise, abort.  */
+             if (GET_CODE (op0) == SUBREG
+                 && (GET_MODE_SIZE (GET_MODE (op0))
+                     == GET_MODE_SIZE (GET_MODE (SUBREG_REG (op0)))))
+               op0 = SUBREG_REG (op0);
+             else
+               abort ();
+           }
          op0 = gen_rtx_SUBREG (mode_for_size (BITS_PER_WORD, MODE_INT, 0),
                                op0, offset);
        }