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.