RFR: 8257882: Implement linkToNative intrinsic on AArch64 [v3]
Nick Gasson
ngasson at openjdk.java.net
Fri Dec 11 07:42:19 UTC 2020
> This is more-or-less a straight port of the x86 code to AArch64.
> GraphKit::make_native_call() calls SharedRuntime::make_native_invoker()
> to generate a blob that jumps to the native function entry point. This
> simply switches the thread state from Java to native and handles the
> safepoint poll on return from native code.
>
> AArch64 suffers the same problem as x86 in JDK-8251047 where R29 (frame
> pointer) may hold a live oop over the MachCallNative node. Normally this
> would be saved by RegisterSaver::save_live_registers() but the native
> invoker blob is not a "proper" stub routine so doesn't have an oop map.
> I copied the x86 solution to this where the frame pointer register is
> saved to the stack and a pointer to that is stored in the frame anchor.
> This is then read back and added to the register map when walking the
> stack. I saw in the PR comments [1] that this might be a temporary fix,
> but I'm not sure if there's any plan to change that now?
>
> Another potential fix might be to change the C2 register definition of
> R29 and R29_H to be save-on-call as below. This works for the
> TestStackWalk.java test case but I don't know whether it has other
> unintended side-effects.
>
> reg_def R29 ( SOC, NS, Op_RegI, 29, r29->as_VMReg() ); // fp
> reg_def R29_H ( SOC, NS, Op_RegI, 29, r29->as_VMReg()->next());
>
> JMH results from jdk/incubator/foreign/CallOverhead.java to show it's
> working:
>
> -Djdk.internal.foreign.ProgrammableInvoker.USE_INTRINSICS=false:
>
> Benchmark Mode Cnt Score Error Units
> CallOverhead.jni_blank avgt 30 51.450 ? 0.363 ns/op
> CallOverhead.jni_identity avgt 30 54.145 ? 0.627 ns/op
> CallOverhead.panama_args10 avgt 30 1914.431 ? 73.771 ns/op
> CallOverhead.panama_args5 avgt 30 1394.274 ? 49.369 ns/op
> CallOverhead.panama_blank avgt 30 872.878 ? 20.716 ns/op
> CallOverhead.panama_blank_trivial avgt 30 873.852 ? 21.350 ns/op
> CallOverhead.panama_identity avgt 30 1058.729 ? 20.229 ns/op
> CallOverhead.panama_identity_memory_address avgt 30 1041.648 ? 22.930 ns/op
> CallOverhead.panama_identity_struct avgt 30 3212.483 ? 151.627 ns/op
> CallOverhead.panama_identity_trivial avgt 30 1056.398 ? 18.779 ns/op
>
> -Djdk.internal.foreign.ProgrammableInvoker.USE_INTRINSICS=true:
>
> Benchmark Mode Cnt Score Error Units
> CallOverhead.jni_blank avgt 30 51.519 ? 0.345 ns/op
> CallOverhead.jni_identity avgt 30 54.689 ? 0.687 ns/op
> CallOverhead.panama_args10 avgt 30 42.856 ? 0.760 ns/op
> CallOverhead.panama_args5 avgt 30 42.192 ? 0.712 ns/op
> CallOverhead.panama_blank avgt 30 41.934 ? 0.349 ns/op
> CallOverhead.panama_blank_trivial avgt 30 2.806 ? 0.545 ns/op
> CallOverhead.panama_identity avgt 30 44.043 ? 0.398 ns/op
> CallOverhead.panama_identity_memory_address avgt 30 45.021 ? 0.409 ns/op
> CallOverhead.panama_identity_struct avgt 30 3206.829 ? 175.750 ns/op
> CallOverhead.panama_identity_trivial avgt 30 7.849 ? 1.651 ns/op
>
> [1] https://github.com/openjdk/panama-foreign/pull/279#issuecomment-679172326
Nick Gasson has updated the pull request with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains four additional commits since the last revision:
- Separate RegSet and FloatRegSet
- Merge branch 'master' into 8257882
- Review comments
- 8257882: Implement linkToNative intrinsic on AArch64
This is more-or-less a straight port of the x86 code to AArch64.
GraphKit::make_native_call() calls SharedRuntime::make_native_invoker()
to generate a blob that jumps to the native function entry point. This
simply switches the thread state from Java to native and handles the
safepoint poll on return from native code.
AArch64 suffers the same problem as x86 in JDK-8251047 where R29 (frame
pointer) may hold a live oop over the MachCallNative node. Normally this
would be saved by RegisterSaver::save_live_registers() but the native
invoker blob is not a "proper" stub routine so doesn't have an oop map.
I copied the x86 solution to this where the frame pointer register is
saved to the stack and a pointer to that is stored in the frame anchor.
This is then read back and added to the register map when walking the
stack. I saw in the PR comments [1] that this might be a temporary fix,
but I'm not sure if there's any plan to change that now?
Another potential fix might be to change the C2 register definition of
R29 and R29_H to be save-on-call as below. This works for the
TestStackWalk.java test case but I don't know whether it has other
unintended side-effects.
reg_def R29 ( SOC, NS, Op_RegI, 29, r29->as_VMReg() ); // fp
reg_def R29_H ( SOC, NS, Op_RegI, 29, r29->as_VMReg()->next());
JMH results from jdk/incubator/foreign/CallOverhead.java to show it's
working:
-Djdk.internal.foreign.ProgrammableInvoker.USE_INTRINSICS=false:
Benchmark Mode Cnt Score Error Units
CallOverhead.jni_blank avgt 30 51.450 ? 0.363 ns/op
CallOverhead.jni_identity avgt 30 54.145 ? 0.627 ns/op
CallOverhead.panama_args10 avgt 30 1914.431 ? 73.771 ns/op
CallOverhead.panama_args5 avgt 30 1394.274 ? 49.369 ns/op
CallOverhead.panama_blank avgt 30 872.878 ? 20.716 ns/op
CallOverhead.panama_blank_trivial avgt 30 873.852 ? 21.350 ns/op
CallOverhead.panama_identity avgt 30 1058.729 ? 20.229 ns/op
CallOverhead.panama_identity_memory_address avgt 30 1041.648 ? 22.930 ns/op
CallOverhead.panama_identity_struct avgt 30 3212.483 ? 151.627 ns/op
CallOverhead.panama_identity_trivial avgt 30 1056.398 ? 18.779 ns/op
-Djdk.internal.foreign.ProgrammableInvoker.USE_INTRINSICS=true:
Benchmark Mode Cnt Score Error Units
CallOverhead.jni_blank avgt 30 51.519 ? 0.345 ns/op
CallOverhead.jni_identity avgt 30 54.689 ? 0.687 ns/op
CallOverhead.panama_args10 avgt 30 42.856 ? 0.760 ns/op
CallOverhead.panama_args5 avgt 30 42.192 ? 0.712 ns/op
CallOverhead.panama_blank avgt 30 41.934 ? 0.349 ns/op
CallOverhead.panama_blank_trivial avgt 30 2.806 ? 0.545 ns/op
CallOverhead.panama_identity avgt 30 44.043 ? 0.398 ns/op
CallOverhead.panama_identity_memory_address avgt 30 45.021 ? 0.409 ns/op
CallOverhead.panama_identity_struct avgt 30 3206.829 ? 175.750 ns/op
CallOverhead.panama_identity_trivial avgt 30 7.849 ? 1.651 ns/op
[1] https://github.com/openjdk/panama-foreign/pull/279#issuecomment-679172326
-------------
Changes:
- all: https://git.openjdk.java.net/jdk/pull/1711/files
- new: https://git.openjdk.java.net/jdk/pull/1711/files/99390b92..d7915ff7
Webrevs:
- full: https://webrevs.openjdk.java.net/?repo=jdk&pr=1711&range=02
- incr: https://webrevs.openjdk.java.net/?repo=jdk&pr=1711&range=01-02
Stats: 16236 lines in 388 files changed: 13679 ins; 1669 del; 888 mod
Patch: https://git.openjdk.java.net/jdk/pull/1711.diff
Fetch: git fetch https://git.openjdk.java.net/jdk pull/1711/head:pull/1711
PR: https://git.openjdk.java.net/jdk/pull/1711
More information about the core-libs-dev
mailing list