RFR: 8374513: AArch64: Improve receiver type profiling reliability
Andrew Haley
aph at openjdk.org
Mon Jan 19 21:10:13 UTC 2026
On Sat, 17 Jan 2026 01:28:40 GMT, Chad Rakoczy <duke at openjdk.org> wrote:
> [JDK-8374513](https://bugs.openjdk.org/browse/JDK-8374513) is the AArch64 port of [JDK-8357258](https://bugs.openjdk.org/browse/JDK-8357258). See the bug report for more detailed information.
>
> This PR executes the plan outlined in the bug:
> - Common the receiver type profiling code in interpreter and C1
> - Rewrite receiver type profiling code to only do atomic receiver slot installations
> - Trim C1OptimizeVirtualCallProfiling to only claim slots when receiver is installed
>
> This PR does not do atomic counter updates themselves, as it may have much wider performance implications, including regressions. This PR should be at least performance neutral.
>
> Functional Testing: Linux AArch64 fastdebug Tier1-4
>
> Performance Testing (to show there is no performance regression):
>
> # Baseline
> Benchmark (randomized) Mode Cnt Score Error Units
> InterfaceCalls.test1stInt2Types false avgt 12 1.940 ± 0.002 ns/op
> InterfaceCalls.test1stInt2Types true avgt 12 7.714 ± 0.011 ns/op
> InterfaceCalls.test1stInt3Types false avgt 12 6.747 ± 0.066 ns/op
> InterfaceCalls.test1stInt3Types true avgt 12 18.733 ± 0.175 ns/op
> InterfaceCalls.test1stInt5Types false avgt 12 6.690 ± 0.083 ns/op
> InterfaceCalls.test1stInt5Types true avgt 12 21.299 ± 0.016 ns/op
> InterfaceCalls.test2ndInt2Types false avgt 12 1.997 ± 0.004 ns/op
> InterfaceCalls.test2ndInt2Types true avgt 12 8.027 ± 0.016 ns/op
> InterfaceCalls.test2ndInt3Types false avgt 12 7.915 ± 0.114 ns/op
> InterfaceCalls.test2ndInt3Types true avgt 12 16.988 ± 0.065 ns/op
> InterfaceCalls.test2ndInt5Types false avgt 12 9.422 ± 0.017 ns/op
> InterfaceCalls.test2ndInt5Types true avgt 12 22.736 ± 0.022 ns/op
> InterfaceCalls.testIfaceCall false avgt 12 5.860 ± 0.046 ns/op
> InterfaceCalls.testIfaceCall true avgt 12 5.794 ± 0.026 ns/op
> InterfaceCalls.testIfaceExtCall false avgt 12 6.310 ± 0.067 ns/op
> InterfaceCalls.testIfaceExtCall true avgt 12 6.239 ± 0.017 ns/op
> InterfaceCalls.testMonomorphic false avgt 12 1.146 ± 0.034 ns/op
> InterfaceCalls.testMonomorphic true avgt 12 1.131 ± 0.012 ns/op
>
> # With PR
> Benchmark (randomized) Mode Cnt Score Error Units
> InterfaceCalls.test1stInt2Types false avgt 12 1.941 ± 0.004 ns/op
> InterfaceCalls.test1stIn...
src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp line 2232:
> 2230: mov(rscratch2, end_receiver_offset);
> 2231: cmp(offset, rscratch2);
> 2232: br(Assembler::NE, L_loop_search_receiver);
Suggestion:
sub(rscratch2, offset, end_receiver_offset);
cbz(rscratch2, L_loop_search_receiver);
src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp line 2239:
> 2237: ldr(rscratch2, Address(mdp, offset));
> 2238: cmp(rscratch2, (u1)NULL_WORD);
> 2239: br(Assembler::EQ, L_found_empty);
Suggestion:
cbz(rscratch2, L_found_empty);
src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp line 2256:
> 2254: lea(rscratch2, Address(mdp, offset));
> 2255: cmpxchg(/*addr*/ rscratch2, /*expected*/ zr, /*new*/ recv, Assembler::xword,
> 2256: /*acquire*/ true, /*release*/ false, /*weak*/ false, noreg);
/*acquire*/ true, /*release*/ false, /*weak*/ false, noreg);
I'm curious about the acquire. For it to make sense here, I would have thought it must be linked with an earlier release in another thread.
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/29283#discussion_r2701847302
PR Review Comment: https://git.openjdk.org/jdk/pull/29283#discussion_r2701800282
PR Review Comment: https://git.openjdk.org/jdk/pull/29283#discussion_r2701839882
More information about the hotspot-dev
mailing list