[9] RFR (L): 8072008: Emit direct call instead of linkTo* for recursive indy/MH.invoke* calls
Dean Long
dean.long at oracle.com
Fri Oct 30 19:46:11 UTC 2015
Do you need *_call_Relocation::method_value() to be scanned in any new places,
like nmethod::metadata_do?
dl
On 10/29/2015 2:36 PM, Vladimir Ivanov wrote:
> http://cr.openjdk.java.net/~vlivanov/8072008/webrev.01/
> https://bugs.openjdk.java.net/browse/JDK-8072008
>
> NB! It touches aarch64 & ppc code, so I'd like to hear from the
> maintainers whether the changes are fine.
>
> To simplify review process, the changes can be split in 2 parts.
>
> http://cr.openjdk.java.net/~vlivanov/8072008/webrev.01/hotspot.reloc/
>
> Platform-dependent changes in macro assembler to switch from
> relocation types to relocation instances, and attach pre-resolved
> method to call sites in generated code.
>
> http://cr.openjdk.java.net/~vlivanov/8072008/webrev.01/hotspot.attach/
> High-level adjustments in C2 and test cases.
>
> Overview
>
> There's a performance problem with inlining through
> MH.linkTo*/invokeBasic linkers. When MemberName/receiver is constant
> and VM sees the target method during compilation, but decides not to
> inline (e.g. recursive inlining), a call to linker is generated, but
> more optimal code shape is to call target method directly.
>
> The problem with substituting a linker call by a direct/virtual call
> is that call site resolution logic relies on bytecode info (see
> SharedRuntime::resolve_{static,opt_virtual,virtual}_call_C and
> SharedRuntime::find_callee_info_helper). But on bytecode level
> symbolic reference points to the linker method, which doesn't tell
> anything about target method.
>
> The fix is to attach additional metadata (Method*) to the call site,
> so VM can use it instead of inspecting bytecode when linking the call
> site. The Method* is placed in relocation table (for static_call,
> opt_virtual_call, and virtual_call relocation types) and contains a
> Method* the call site is resolved to by JIT compiler (_method from a
> call IR node).
>
> It is used only in C2 generated code.
>
> Example:
>
> MemberName mn = ... <<T.f1>> ... ; // compile-time constant
> MethodHandle.linkToStatic(..., mn)
>
> compiles to:
>
> callq 0x0000000109cb1900 ; OopMap{off=28}
> ; *invokestatic linkToStatic
> ; - Test::invokeStatic at 3 (line 108)
> ; {static_call T.f1}
>
> It's a call to MethodHandle.linkToStatic on bytecode level, but in
> generated code it's a direct call to T.f1.
>
> For testing purposes, 2 new WhiteBox methods are introduced:
> - clearInlineCaches
> - deoptimize
>
> They are used in unit tests (test/compiler/jsr292/NonInlinedCall/*)
> which stresses new code shapes.
>
> WhiteBox changes require some adjustments in build scripts, since
> @HotSpotIntrinsicCandidate isn't part of JDK8. But it will be fixed
> separately (the idea is to start building wb.jar with JDK9).
>
> Testing: JPRT, java/lang/invoke, nashorn, octane
>
> Thanks!
>
> Best regards,
> Vladimir Ivanov
More information about the hotspot-compiler-dev
mailing list