On Wed, 8 May 2024 16:39:16 GMT, Maurizio Cimadamore <mcimadam...@openjdk.org> 
wrote:

>> This PR fixes an issue that has crept into the FFM API implementation.
>> 
>> From very early stages, the FFM API used to disable the alignment check on 
>> nested layout elements, in favor of an alignment check against the memory 
>> segment base address. The rationale was that the JIT had issue with 
>> eliminating redundant alignment checks, and accessing nested elements could 
>> never result in alignment issues, since the alignment of the container is 
>> provably bigger than that of the contained element. This means that, when 
>> creating a var handle for a nested layout element, we set the nested layout 
>> alignment to 1 (unaligned), derive its var handle, and then decorate the var 
>> handle with an alignment check for the container.
>> 
>> At some point in 22, we tweaked the API to throw 
>> `UnsupportedOperationException` when using an access mode incompatible with 
>> the alignment constraint of the accessed layout. That is, a volatile read on 
>> an `int` is only possible if the access occurs at an address that is at 
>> least 4-byte aligned. Otherwise an `UOE` is thrown.
>> 
>> Unfortunately this change broke the aforementioned optimization: creating a 
>> var handle for an unaligned layout works, but the resulting layout will 
>> *not* support any of the atomic access modes.
>> 
>> Since this optimization is not really required anymore (proper C2 support to 
>> hoist/eliminate alignment checks has been added since then), it is better to 
>> disable this implementation quirk, and leave optimizations to C2.
>> 
>> (If we really really wanted to optimize things a bit, we could remove the 
>> container alignment check in the case the accessed value is the first layout 
>> element nested in the container, but this PR doesn't go that far).
>> 
>> I've run relevant benchmarks before/after and found no differences. In part 
>> this is because `arrayElementVarHandle` is unaffected. But, even after 
>> tweaking the `LoopOverNonConstant` benchmark to add explicit tests for the 
>> code path affected, no significant difference was found, sign that C2 is 
>> indeed able to spot (and remove) the redundant alignment check. Note: if we 
>> know that `aligned_to_N(base)` holds, then it's easy to prove that 
>> `aligned_to_M(base + offset + index * scale)` holds, when `N >= M` and with 
>> `offset` and `scale` known (the latter a power of two).
>
> Maurizio Cimadamore has updated the pull request incrementally with one 
> additional commit since the last revision:
> 
>   Add benchmark anno

I've decided to integrate this for now, as the fix in this PR restores 
correctness of the implementation.
I will investigate follow up improvements and enhancements separately:
https://bugs.openjdk.org/browse/JDK-8331865

-------------

PR Comment: https://git.openjdk.org/jdk/pull/19124#issuecomment-2104879150

Reply via email to