RFR (S): 8153751: Windows Atomic and OrderAccess are not emitting explicit compiler barriers
Erik Österlund
erik.osterlund at oracle.com
Fri Apr 8 09:00:18 UTC 2016
Hi,
Bug: https://bugs.openjdk.java.net/browse/JDK-8153751
Webrev: http://cr.openjdk.java.net/~eosterlund/8153751/webrev.00/
It turns out that on Windows, compiler barriers are not used for
Atomic:: code and some code in OrderAccess. It is assumed that the
non-volatile accesses will not be reordered across __asm statements, as
the current memory model should prevent. But I have not found any
guarantees that this is the case for __asm.
The closest source I could find is the documentation for the
MemoryBarrier macro that uses an __asm statement to produce a hardware
membar. The documentation says the following: "Creates a hardware memory
barrier (fence) that prevents the CPU from re-ordering read and write
operations. It may also prevent the compiler from re-ordering read and
write operations."
Note the "MAY" prevent compiler reordering. (*facepalm*) This sounds to
me like __asm really does not guarantee compiler reordering across __asm
at all.
A suspected victim of this reordering is here:
https://bugs.openjdk.java.net/browse/JDK-8033545
To make the use of these classes more safe, I propose to simply add
explicit compiler barriers in this windows code. It should not make any
difference, as I am only enforcing compiler reordering rules that should
already hold.
This small patch fixes this. The only thing to note is that the __asm
statements that put things in %eax and avoid returning anything.
Testing: JPRT
Thanks,
/Erik
More information about the hotspot-runtime-dev
mailing list