On Mon, 2005-11-28 at 14:10 +0100, Paolo Bonzini wrote: > Then, I don't know if it would be legal to optimize > > struct r { > unsigned int x : 7; > volatile unsigned int y : 1; > }; > > struct r my_reg; > > So that my_reg.x is accessed with a non-volatile mem, and my_reg.y is > accessed with a volatile one. Would such an optimization be possible > within the Ada compile-time rules?
procedure P is type T7 is mod 2**7; type T1 is mod 2; pragma Volatile (T1); type R is record X : T7; Y : T1; end record; for R'Size use 8; for R'Alignment use 1; for R use record X at 0 range 0 .. 6; Y at 0 range 7 .. 7; end record; Z : R; A : T7; B : T1; begin Z.X := 127; Z.Y := 1; A := Z.X; B := Z.Y; end P; trunk gcc -O2 -S p.adb on x86-linux gives: _ada_p: pushl %ebp movl %esp, %ebp subl $16, %esp movb $1, -1(%ebp) leave ret My understanding is that B := Z.Y implied memory read should not be optimized away since it is a volatile read and thus an external effect, so this looks like a bug to me. (If this is not supported, GNAT should fail at compile time.) Z.X write and read are correctly optimized away: non volatile read and write have no external effects here. Laurent