Dave Korn writes:
 > 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!)

Yeah it was, and there was a decision:

http://gcc.gnu.org/ml/gcc/2005-07/msg00731.html

So no, we don't have to revisit it.

Paolo Bonzini has come up with a simple fix.

Andrew.

Reply via email to