On 07 November 2006 16:33, Andrew Haley wrote: > Ricardo FERNANDEZ PASCUAL writes:
> > I have done some experiments to try to understand what is happening, and > > I am a bit confused by the bahavior of GCC. Consider the following C > > function: > > > > static struct { int w; } s; > > > > void wait (void) { > > int t; > > loop: > > t = *((volatile int *) &s.w); > > if (t > 0) goto loop; > > } > > > > > > The code generated by "cc1 -O3" on x86 is: > > > > wait: > > movl s, %eax > > pushl %ebp > > movl %esp, %ebp > > testl %eax, %eax > > jg .L6 > > popl %ebp > > ret > > .L3: > > .L6: > > jmp .L6 > > > > > > Which does not seem to respect the semantics of volatile. Is this the > > expected behavior or is this a bug? > > I think it's a bug. > > FWIW, the folowing function: > which looks right. A temporary shouldn't make any difference here. Can I just remind everyone we had a huge long thread with this discussion last year and it might be worth reviewing. Look for the thread titled "volatile semantics" running from Tue 03/05/2005 09:42 to Tue 26/07/2005 00:09. (We should try not to repeat too much of a three-month long debate!) cheers, DaveK -- Can't think of a witty .sigline today....