RFR: 8341127: Extra call to MethodHandle::asType from memory segment var handles fails to inline [v2]

Maurizio Cimadamore mcimadamore at openjdk.org
Tue Oct 1 10:18:15 UTC 2024


> 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

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

Changes:
  - all: https://git.openjdk.org/jdk/pull/21283/files
  - new: https://git.openjdk.org/jdk/pull/21283/files/8c2f9789..f644d52d

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jdk&pr=21283&range=01
 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=21283&range=00-01

  Stats: 1 line in 1 file changed: 0 ins; 0 del; 1 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


More information about the core-libs-dev mailing list