This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Problem initializing volatile structures


On Thu, Jan 28, 2010 at 5:13 PM, Byron Stanoszek <bstanoszek@comtime.com> wrote:
> I've recently upgraded to GCC 4.3.2 from 4.2.2, and I noticed a strange
> change in how volatile bitmask structures are optimized.
>
> Consider the following code:
>
> /* 32-bit MMIO */
> struct hardware {
> ?int parm1:8;
> ?int :4;
> ?int parm2:4;
> ?int parm3:15;
> ?int parm4:1;
> };
>
> void f1()
> {
> ?volatile struct hardware *ptr=(void *)0x11223344;
>
> ?*ptr=(struct hardware) {
> ? ?.parm1=42,
> ? ?.parm2=13,
> ? ?.parm3=11850,
> ? ?.parm4=1,
> ?};
> }
>
> void f2()
> {
> ?volatile struct hardware *ptr=(void *)0x11223344;
>
> ?struct hardware set={
> ? ?.parm1=42,
> ? ?.parm2=13,
> ? ?.parm3=11850,
> ? ?.parm4=1,
> ?};
>
> ?*ptr=set;
> }
>
>
> In GCC 4.3.2, this produces the following assembly:
>
> f1:
> ? ? ? ?movl ? ?$0, 287454020
> ? ? ? ?movb ? ?$42, 287454020
> ? ? ? ?movl ? ?287454020, %eax
> ? ? ? ?andb ? ?$15, %ah
> ? ? ? ?orb ? ? $208, %ah
> ? ? ? ?movl ? ?%eax, 287454020
> ? ? ? ?movl ? ?287454020, %eax
> ? ? ? ?andl ? ?$-2147418113, %eax
> ? ? ? ?orl ? ? $776601600, %eax
> ? ? ? ?movl ? ?%eax, 287454020
> ? ? ? ?movl ? ?287454020, %eax
> ? ? ? ?orl ? ? $-2147483648, %eax
> ? ? ? ?movl ? ?%eax, 287454020
> ? ? ? ?ret
>
> f2:
> ? ? ? ?movl ? ?$-1370828758, 287454020
> ? ? ? ?ret
>
> Aren't both functions syntactically the same, and shouldn't they produce the
> same optimized code as in "f2" above? This used to be the case in GCC 4.2.2.
>
> The problem I'm seeing, apart from the lack of optimization, is that "f1"
> causes 5 separate writes to a single MMIO register, instead of 1. This
> particular hardware register is only expecting one write to this location,
> and
> when multiple writes are received it causes the hardware to fail.
>
> If this new behavior is intended, is there some sort of attribute I can add
> to
> the code to get the original 4.2.2 behavior back?

Please file a bugreport.

THanks
Richard.

> Thanks for your comments,
> ?-Byron
>
>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]