On Tue, 1 Oct 2024 10:18:15 GMT, Maurizio Cimadamore <mcimadam...@openjdk.org> wrote:
>> The fix for JDK-8331865 introduced an accidental performance regression. >> The main issue is that now *all* memory segment var handles go through some >> round of adaptation. >> Adapting a var handle results in a so called *indirect* var handle. >> When an indirect var handle is called through a *var handle guard*, an extra >> `MethodHandle::asType` call is triggered. >> In some cases, if `asType` has already been compiled into a big method, it >> cannot be inlined into the caller, which then results in a failure to inline >> through the var handle call, resulting in a big performance regression. >> >> The solution is to make sure that the compiled size of >> `MethodHandle::asType` stays small: this is done by making sure that the >> slowpath (the one which populates the cache used by `asType`) is not inlined >> by the JVM. This is done by consolidating the slow path into a separate >> method, which is annotated with the internal `@DontInline` annotation. >> >> This problem was originally reported here: >> https://mail.openjdk.org/pipermail/panama-dev/2024-September/020643.html >> >> While we did not test this fix directly, we have made sure that running the >> problematic benchmark with the flags: >> >> >> -XX:CompileCommand=dontinline,java/lang/invoke/MethodHandle.setAsTypeCache >> -XX:CompileCommand=dontinline,java/lang/invoke/MethodHandle.asTypeUncached >> >> >> Solves the performance regression. The fix in this PR is just a programmatic >> way to achieve the same results w/o the need of command line flags. > > Maurizio Cimadamore has updated the pull request incrementally with one > additional commit since the last revision: > > Update copyright Benchmark results Before: Benchmark (asTypeCompiled) Mode Cnt Score Error Units LoopOverNonConstantAsType.segment_loop false avgt 30 0.232 ± 0.003 ms/op LoopOverNonConstantAsType.segment_loop true avgt 30 6.943 ± 0.100 ms/op LoopOverNonConstantAsType.unsafe_loop false avgt 30 0.223 ± 0.002 ms/op LoopOverNonConstantAsType.unsafe_loop true avgt 30 0.227 ± 0.002 ms/op After: Benchmark (asTypeCompiled) Mode Cnt Score Error Units LoopOverNonConstantAsType.segment_loop false avgt 30 0.237 ± 0.002 ms/op LoopOverNonConstantAsType.segment_loop true avgt 30 0.233 ± 0.003 ms/op LoopOverNonConstantAsType.unsafe_loop false avgt 30 0.233 ± 0.002 ms/op LoopOverNonConstantAsType.unsafe_loop true avgt 30 0.234 ± 0.002 ms/op ------------- PR Comment: https://git.openjdk.org/jdk/pull/21283#issuecomment-2385406811