https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65409

--- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
I've so far came up with:
--- gcc/expr.c.jj    2015-01-19 09:31:15.000000000 +0100
+++ gcc/expr.c    2015-03-13 11:30:25.699805379 +0100
@@ -6656,14 +6656,18 @@ store_field (rtx target, HOST_WIDE_INT b
           && (bitpos % BITS_PER_UNIT) == 0
           && (bitsize % BITS_PER_UNIT) == 0)))
     {
-      gcc_assert (MEM_P (target) && MEM_P (temp)
+      gcc_assert (MEM_P (target)
+              && (MEM_P (temp) || GET_CODE (temp) == PARALLEL)
               && (bitpos % BITS_PER_UNIT) == 0);

       target = adjust_address (target, VOIDmode, bitpos / BITS_PER_UNIT);
-      emit_block_move (target, temp,
-               GEN_INT ((bitsize + BITS_PER_UNIT - 1)
-                    / BITS_PER_UNIT),
-               BLOCK_OP_NORMAL);
+      HOST_WIDE_INT bytesize
+        = (bitsize + BITS_PER_UNIT - 1) / BITS_PER_UNIT;
+      if (GET_CODE (temp) == PARALLEL)
+        emit_group_store (target, temp, TREE_TYPE (exp), bytesize);
+      else
+        emit_block_move (target, temp, GEN_INT (bytesize),
+                 BLOCK_OP_NORMAL);

       return const0_rtx;
     }
which seems to DTRT in this case.

Reply via email to