> 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!

Maurizio Cimadamore has updated the pull request incrementally with one 
additional commit since the last revision:

  Fix javadoc

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

Changes:
  - all: https://git.openjdk.java.net/jdk16/pull/19/files
  - new: https://git.openjdk.java.net/jdk16/pull/19/files/324d5b92..81472e6d

Webrevs:
 - full: https://webrevs.openjdk.java.net/?repo=jdk16&pr=19&range=01
 - incr: https://webrevs.openjdk.java.net/?repo=jdk16&pr=19&range=00-01

  Stats: 1 line in 1 file changed: 0 ins; 0 del; 1 mod
  Patch: https://git.openjdk.java.net/jdk16/pull/19.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk16 pull/19/head:pull/19

PR: https://git.openjdk.java.net/jdk16/pull/19

Reply via email to