> 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 test/micro/org/openjdk/bench/java/lang/foreign/LoopOverNonConstantAsType.java Co-authored-by: Jorn Vernee <jornver...@users.noreply.github.com> ------------- Changes: - all: https://git.openjdk.org/jdk/pull/21283/files - new: https://git.openjdk.org/jdk/pull/21283/files/f644d52d..4fee4d28 Webrevs: - full: https://webrevs.openjdk.org/?repo=jdk&pr=21283&range=02 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=21283&range=01-02 Stats: 1 line in 1 file changed: 0 ins; 1 del; 0 mod Patch: https://git.openjdk.org/jdk/pull/21283.diff Fetch: git fetch https://git.openjdk.org/jdk.git pull/21283/head:pull/21283 PR: https://git.openjdk.org/jdk/pull/21283