RFR #2 (M) 8148146: Integrate new internal Unsafe entry points, and basic intrinsic support for VarHandles
David Holmes
david.holmes at oracle.com
Mon Jul 4 21:09:09 UTC 2016
On 5/07/2016 1:16 AM, Andrew Haley wrote:
> [CORRECTED. Please igfnore previous version.]
>
> I'm writing the AArch64 intrinsics for the weak entry points, and
> the generated code for volatile compare&swap looks wrong to me.
>
> I'm seeing this:
>
> membar_release
> cmpxchg
> membar_acquire
>
> ... but this is not enough for volatile. It is enough for
> AcquireRelease, but for Volatile It needs a trailing membar_volatile
> to make the store visible to observers in other threads.
Surely cmpxchg already ensures the store (if it happens) is visible in
other threads - else the cmpxchg would not even operate correctly.
David
-----
Looking at
> LibraryCallKit::inline_unsafe_access, it seems to me that the same
> code is generated for both Release and Volatile:
>
> // Add the trailing membar surrounding the access
> insert_mem_bar(Op_MemBarCPUOrder);
>
> switch (access_kind) {
> case Relaxed:
> case Release:
> break; // do nothing
> case Acquire:
> case Volatile:
> insert_mem_bar(Op_MemBarAcquire);
> // !support_IRIW_for_not_multiple_copy_atomic_cpu handled in platform code
> break;
> default:
> ShouldNotReachHere();
> }
>
> But it really shouldn't be: a volatile store should be followed by
> MemBarVolatile, like so:
>
> switch (access_kind) {
> case Relaxed:
> case Release:
> break; // do nothing
> case Acquire:
> insert_mem_bar(Op_MemBarAcquire);
> break;
> case Volatile:
> insert_mem_bar(Op_MemBarVolatile);
> break;
> default:
> ShouldNotReachHere();
> }
>
> ... and this does indeed generate the correct code.
>
> There is a problem, though: this is going to generate suboptimal code
> for x86:
>
> lock cmpxchg
> lock addl $0x0,-0x40(%rsp)
>
> So I suppose we're going to have to kludge around this in the AArch64
> back end.
>
> Andrew.
>
More information about the hotspot-dev
mailing list