[Bug middle-end/65409] [4.8/4.9/5 Regression] ICE in store_field
jakub at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Fri Mar 13 10:37:00 GMT 2015
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.
More information about the Gcc-bugs
mailing list