On Mon, 14 Dec 2020 15:48:07 GMT, Claes Redestad <redes...@openjdk.org> wrote:
>> This patch fixes a problem with type profile pollution when segments of >> different kinds are used on the same memory access var handle, or on the >> same `MemoryAccess` static method. >> >> In principle, argument profiling should kick in for VarHandles and >> MethodHandles, and that should be enough at least to avoid pollution when >> using var handles directly. In reality, this is not the case; as Vlad >> discovered after relatively intense debugging session (thanks!), the >> VarHandle implementation code has to cast the incoming segment to the >> `MemorySegmentProxy` internal interface. This creates problems for C2, as >> concrete segment implementations have _two_ interface types: `MemorySegment` >> and the internal `MemorySegmentProxy` class. Side casts from one to the >> other are not supported well, and can cause loss of type profiling >> infomation. >> >> To solve this problem we realized, in hindisght, that `MemorySegmentProxy` >> didn't really needed to be an interface and that it could easily be >> converted to an abstract class. Alone this solves 50% of the issues, since >> that makes direct var handle access robust to pollution issues. The >> remaining problems (using accessors in `MemoryAccess` class) can be >> addressed the usual way, by adding argument type profiling for the methods >> in that class (similarly to what we've done for `ScopedMemoryAccess`). >> >> Here are some numbers before the patch: >> >> Benchmark Mode Cnt Score >> Error Units >> LoopOverPollutedSegments.heap_segment_floats_VH avgt 30 11.535 ? >> 0.039 ms/op >> LoopOverPollutedSegments.heap_segment_floats_static avgt 30 10.860 ? >> 0.162 ms/op >> LoopOverPollutedSegments.heap_segment_ints_VH avgt 30 11.479 ? >> 0.202 ms/op >> LoopOverPollutedSegments.heap_segment_ints_static avgt 30 10.562 ? >> 0.027 ms/op >> LoopOverPollutedSegments.heap_unsafe avgt 30 0.240 ? >> 0.003 ms/op >> LoopOverPollutedSegments.native_segment_VH avgt 30 11.603 ? >> 0.154 ms/op >> LoopOverPollutedSegments.native_segment_static avgt 30 10.613 ? >> 0.128 ms/op >> LoopOverPollutedSegments.native_unsafe avgt 30 0.243 ? >> 0.003 ms/op >> >> As you can see there is quite a big difference between unsafe access and all >> the other modes. Here are the results after the patch: >> >> Benchmark Mode Cnt Score >> Error Units >> LoopOverPollutedSegments.heap_segment_floats_VH avgt 30 0.244 ? >> 0.002 ms/op >> LoopOverPollutedSegments.heap_segment_floats_static avgt 30 0.301 ? >> 0.001 ms/op >> LoopOverPollutedSegments.heap_segment_ints_VH avgt 30 0.245 ? >> 0.003 ms/op >> LoopOverPollutedSegments.heap_segment_ints_static avgt 30 0.302 ? >> 0.004 ms/op >> LoopOverPollutedSegments.heap_unsafe avgt 30 0.242 ? >> 0.003 ms/op >> LoopOverPollutedSegments.native_segment_VH avgt 30 0.246 ? >> 0.004 ms/op >> LoopOverPollutedSegments.native_segment_static avgt 30 0.295 ? >> 0.006 ms/op >> LoopOverPollutedSegments.native_unsafe avgt 30 0.245 ? >> 0.003 ms/op >> >> That is, the situation is back to normal. Thanks to @JornVernee and >> @iwanowww for the help! > > src/java.base/share/classes/jdk/internal/access/foreign/MemorySegmentProxy.java > line 32: > >> 30: >> 31: /** >> 32: * This proxy interface is required to allow instances of the {@code >> MemorySegment} interface (which is defined inside > > "This abstract base class.."? > > I don't mind the current name, but should the class be renamed > `AbstractMemorySegmentProxy`? I'll fix the doc - since this is a transitional artifact (will disappear when API is finalized an in java.base) I'd prefer to avoid the renaming ------------- PR: https://git.openjdk.java.net/jdk16/pull/19