re PR middle-end/54617 (ICE on gcc.c-torture/compile/pr42025-2.c with -m64 and -O1)

PR middle-end/54617
	* expr.c (store_field): Handle a PARALLEL in more cases.

From-SVN: r191451
This commit is contained in:
Eric Botcazou 2012-09-18 22:42:18 +00:00 committed by Eric Botcazou
parent 4f60e9d38f
commit 63d94e58b1
2 changed files with 32 additions and 10 deletions

View File

@ -1,3 +1,8 @@
2012-09-18 Eric Botcazou <ebotcazou@adacore.com>
PR middle-end/54617
* expr.c (store_field): Handle a PARALLEL in more cases.
2012-09-18 Segher Boessenkool <segher@kernel.crashing.org>
* config/rs6000/rs6000.md (sminsi3, smaxsi3, uminsi3, umaxsi3):

View File

@ -6452,16 +6452,33 @@ store_field (rtx target, HOST_WIDE_INT bitsize, HOST_WIDE_INT bitpos,
/* Handle calls that return values in multiple non-contiguous locations.
The Irix 6 ABI has examples of this. */
if (bitpos == 0
&& bitsize == GET_MODE_BITSIZE (mode)
&& GET_CODE (temp) == PARALLEL)
emit_group_store (target, temp, TREE_TYPE (exp),
int_size_in_bytes (TREE_TYPE (exp)));
else
/* Store the value in the bitfield. */
store_bit_field (target, bitsize, bitpos,
bitregion_start, bitregion_end,
mode, temp);
if (GET_CODE (temp) == PARALLEL)
{
rtx temp_target;
/* We are not supposed to have a true bitfield in this case. */
gcc_assert (bitsize == GET_MODE_BITSIZE (mode));
/* If we don't store at bit 0, we need an intermediate pseudo
since emit_group_store only stores at bit 0. */
if (bitpos != 0)
temp_target = gen_reg_rtx (mode);
else
temp_target = target;
emit_group_store (temp_target, temp, TREE_TYPE (exp),
int_size_in_bytes (TREE_TYPE (exp)));
if (temp_target == target)
return const0_rtx;
temp = temp_target;
}
/* Store the value in the bitfield. */
store_bit_field (target, bitsize, bitpos,
bitregion_start, bitregion_end,
mode, temp);
return const0_rtx;
}