This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH, RFC] PR 55403 + 55391
Richard Henderson <rth@redhat.com> writes:
> On 11/20/2012 08:55 AM, Richard Sandiford wrote:
>> but what kind of bitfield memory were we trying to
>> create in the ICE case? The idea was that "adjust_object" is only ever
>> true for bitfield adjustments. We should then either be using an
>> integer or field mode whose size is picked up by:
>>
>> if (defattrs->size_known_p)
>> size = defattrs->size;
>>
>> or a BLKmode whose value is passed in via adjust_bitfield_address_size.
>> It sounds like I missed a case where the latter was needed.
>
> A TFmode field of an unaligned TCmode original. We do wind up with
> a BLKmode extraction, without the _size passed in.
Gah. How about this patch, currently bootstrapping on x86_64-linux-gnu
as a sanity check? The last instance seems glaringly obvious in
hindsight :-(
Richard
gcc/
* expmed.c (store_bit_field_1): Use adjust_bitfield_address_size
rather than adjust_bitfield_address to change the mode of a reference.
(extract_bit_field_1): Likewise.
Index: gcc/expmed.c
===================================================================
--- gcc/expmed.c 2012-11-20 09:55:26.000000000 +0000
+++ gcc/expmed.c 2012-11-20 17:24:09.722871322 +0000
@@ -645,7 +645,7 @@ store_bit_field_1 (rtx str_rtx, unsigned
if (imode != GET_MODE (op0))
{
if (MEM_P (op0))
- op0 = adjust_bitfield_address (op0, imode, 0);
+ op0 = adjust_bitfield_address_size (op0, imode, 0, MEM_SIZE (op0));
else
{
gcc_assert (imode != BLKmode);
@@ -1380,7 +1380,7 @@ extract_bit_field_1 (rtx str_rtx, unsign
if (imode != GET_MODE (op0))
{
if (MEM_P (op0))
- op0 = adjust_bitfield_address (op0, imode, 0);
+ op0 = adjust_bitfield_address_size (op0, imode, 0, MEM_SIZE (op0));
else if (imode != BLKmode)
{
op0 = gen_lowpart (imode, op0);
@@ -1403,10 +1403,10 @@ extract_bit_field_1 (rtx str_rtx, unsign
}
else
{
- rtx mem = assign_stack_temp (GET_MODE (op0),
- GET_MODE_SIZE (GET_MODE (op0)));
+ HOST_WIDE_INT size = GET_MODE_SIZE (GET_MODE (op0));
+ rtx mem = assign_stack_temp (GET_MODE (op0), size);
emit_move_insn (mem, op0);
- op0 = adjust_bitfield_address (mem, BLKmode, 0);
+ op0 = adjust_bitfield_address_size (mem, BLKmode, 0, size);
}
}
}