* Samuel Tardieu:

> On 27/10, Florian Weimer wrote:
>
> | (I can't reproduce the conditional store with my GCC 4.2 installation,
> | though.)
>
> You need "-O -fno-inline" to trigger it on this particular example
> (you don't need "-fno-inline" if you put "Lock" in a separate package).

Ah, thanks.  I see it now.

If not for Ada, we need to fix it for Java.  The following snippet shows
the same problem:

class C {
    static volatile boolean flag;
    static int shared;
    public void maybe_increment() {
        if (flag)
            ++shared;
    }
}

_ZN1C15maybe_incrementEJvv:
.LFB3:
        movzbl  _ZN1C4flagE(%rip), %eax
        cmpb    $1, %al
        movl    _ZN1C6sharedE(%rip), %eax
        sbbl    $-1, %eax
        movl    %eax, _ZN1C6sharedE(%rip)
        ret

And the 1.5 memory model should really, really prevent that (if not,
it's broken).

Reply via email to