support BLKmode inputs for store_bit_field
authorAlexandre Oliva <aoliva@redhat.com>
Tue, 13 Oct 2015 16:34:29 +0000 (16:34 +0000)
committerAlexandre Oliva <aoliva@gcc.gnu.org>
Tue, 13 Oct 2015 16:34:29 +0000 (16:34 +0000)
Revision 228586 changed useless_type_conversion_p and added mode
changes for MEM:BLKmode inputs in store_expr_with_bounds, but it
missed store_bit_field.  This caused ada/rts/s-regpat.ads to fail
compilation on x86_64-linux-gnu.

for  gcc/ChangeLog

PR middle-end/67912
* expmed.c (store_bit_field_1): Adjust mode of BLKmode inputs.

From-SVN: r228774

gcc/ChangeLog
gcc/expmed.c

index e50e3732a0aeb82574cba9dceee1c30a720d5ec2..3ddc4a95e3db2eb573ddd95d44c6b3d8484bcfd4 100644 (file)
@@ -1,3 +1,8 @@
+2015-10-13  Alexandre Oliva <aoliva@redhat.com>
+
+       PR middle-end/67912
+       * expmed.c (store_bit_field_1): Adjust mode of BLKmode inputs.
+
 2015-10-12  Uros Bizjak  <ubizjak@gmail.com>
 
        * config/sparc/sparc.h (SPARC_STACK_ALIGN): Implement using
index 93cf50822aeffd4983384929054f496a6d53d12d..69ea511a6f6df4c94dfa3751b2fd565b41ba9d33 100644 (file)
@@ -757,6 +757,14 @@ store_bit_field_1 (rtx str_rtx, unsigned HOST_WIDE_INT bitsize,
       }
   }
 
+  /* We allow move between structures of same size but different mode.
+     If source is in memory and the mode differs, simply change the memory.  */
+  if (GET_MODE (value) == BLKmode && GET_MODE (op0) != BLKmode)
+    {
+      gcc_assert (MEM_P (value));
+      value = adjust_address_nv (value, GET_MODE (op0), 0);
+    }
+
   /* Storing an lsb-aligned field in a register
      can be done with a movstrict instruction.  */