Commit 63d94e58 by Eric Botcazou Committed by Eric Botcazou

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
parent 4f60e9d3
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):
......
......@@ -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;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment