On Mon, 2 Dec 2013 15:42:48, Richard Biener wrote:
>
> On Wed, Nov 20, 2013 at 11:48 AM, Bernd Edlinger
> <bernd.edlin...@hotmail.de> wrote:
>> Hello Richard,
>>
>> as a follow-up patch to the bit-fields patch(es), I wanted to remove the 
>> dependencies on
>> the variable flag_strict_volatile_bitfields from expand_assignment and 
>> expand_expr_real_1.
>> Additionally I want the access mode of the field to be selected in the 
>> memory context,
>> instead of the structure's mode.
>>
>> Boot-strapped and regression-tested on x86_64-linux-gnu.
>>
>> OK for trunk?
>
> Ok.
>
> Thanks,
> Richard.
>


Oops....

Sorry, tonight this patch caused an Ada regression, in pack17.adb and 
misaligned_nest.adb

So I'll have to put that on hold at the moment.

This ICE is very similar to PR59134.
It is again the recursion between store_fixed_bit_field and 
store_split_bit_field.

The trigger is a latent problem in the ada gcc_interface.

That is we have a bit-field of exactly 8 bit size, which is not byte-aligned,
but DECL_MODE=QImode, DECL_BIT_FIELD=false which looks quite strange,
and is totally different from how C structures look like. I should mention that 
there
are even some places in the target back-ends, where the attribute 
DECL_BIT_FIELD is
used for whatever.

Now, due to this hunk in the cleanup-patch we get the QImode selected in the 
memory
context:

       if (MEM_P (to_rtx))
        {
-         if (volatilep && flag_strict_volatile_bitfields> 0)
+         if (mode1 != VOIDmode)
            to_rtx = adjust_address (to_rtx, mode1, 0);

However even without that patch, I can arrange for "volatilep && 
flag_strict_volatile_bitfields> 0"
to be true in Ada (even on X86_64, or whatever platform you like):

-- { dg-do run }
-- { dg-options "-gnatp -fstrict-volatile-bitfields" }

procedure Misaligned_Volatile is

   type Byte is mod 2**8;

   type Block is record
      B : Boolean;
      V : Byte;
   end record;
   pragma Volatile (Block);
   pragma Pack (Block);
   for Block'Alignment use 1;

   type Pair is array (1 .. 2) of Block;

   P : Pair;
begin
   for K in P'Range loop
      P(K).V := 237;
   end loop;
   for K in P'Range loop
      if P(K).V /= 237 then
         raise Program_error;
      end if;
   end loop;
end;


This Ada test case causes either wrong code generation or an ICE at compile 
time,
if the -fstrict-volatile-bitfields option is either given by the user,
or by the target-specific default as it is on ARM for instance  (which is 
completely
pointless on Ada, I know!)...

Now I am preparing a new bitfields-update-patch which fixes this above test 
case and the
latent recursion problem.


Thanks  ...  for you patience :-(
Bernd.                                    

Reply via email to