On 21 October 2007 15:55, Tomash Brechko wrote:
> Consider this piece of code:
>
> extern int v;
>
> void
> f(int set_v)
> {
> if (set_v)
> v = 1;
> }
> f:
> pushl %ebp
> movl %esp, %ebp
> cmpl $0, 8(%ebp)
> movl $1, %eax
> cmove v, %eax ; load (maybe)
> movl %eax, v ; store (always)
> popl %ebp
> ret
>
> Note the last unconditional store to v.
> So, could someone explain me why this GCC optimization is valid,
Because of the 'as-if' rule. Since the standard is neutral with regard to
threads, gcc does not have to take them into account when it decides whether
an optimisation would satisfy the 'as-if' rule.
If you really want all externally-visible accesses to v to be made exactly
as the code directs, rather than allowing gcc to optimise them in any way that
(from the program's POV) it's just the same 'as-if' they had been done
exactly, make v volatile.
cheers,
DaveK
--
Can't think of a witty .sigline today....