RFR: 8377225: RISC-V: Improve receiver type profiling reliability

Aleksey Shipilev shade at openjdk.org
Thu Feb 5 11:32:09 UTC 2026


On Tue, 20 Jan 2026 08:03:47 GMT, Anjian Wen <wenanjian at openjdk.org> wrote:

> Same as JDK-8357258, this patch try to improve the receiver type profile reliability in riscv.
> 
> Functional Testing: tier1 Passed
> Performance Testing: no regression
> 
> 
> # Baseline
> Benchmark                        (randomized)  Mode  Cnt   Score   Error  Units
> InterfaceCalls.test1stInt2Types         false  avgt   12   9.371 ± 0.007  ns/op
> InterfaceCalls.test1stInt2Types          true  avgt   12  14.168 ± 0.025  ns/op
> InterfaceCalls.test1stInt3Types         false  avgt   12  38.390 ± 0.261  ns/op
> InterfaceCalls.test1stInt3Types          true  avgt   12  39.634 ± 0.122  ns/op
> InterfaceCalls.test1stInt5Types         false  avgt   12  40.960 ± 1.909  ns/op
> InterfaceCalls.test1stInt5Types          true  avgt   12  41.235 ± 0.126  ns/op
> InterfaceCalls.test2ndInt2Types         false  avgt   12  10.227 ± 0.333  ns/op
> InterfaceCalls.test2ndInt2Types          true  avgt   12  14.657 ± 0.049  ns/op
> InterfaceCalls.test2ndInt3Types         false  avgt   12  42.756 ± 0.563  ns/op
> InterfaceCalls.test2ndInt3Types          true  avgt   12  50.112 ± 0.302  ns/op
> InterfaceCalls.test2ndInt5Types         false  avgt   12  59.637 ± 1.900  ns/op
> InterfaceCalls.test2ndInt5Types          true  avgt   12  56.992 ± 0.162  ns/op
> InterfaceCalls.testIfaceCall            false  avgt   12  38.731 ± 0.749  ns/op
> InterfaceCalls.testIfaceCall             true  avgt   12  38.218 ± 0.283  ns/op
> InterfaceCalls.testIfaceExtCall         false  avgt   12  41.505 ± 3.659  ns/op
> InterfaceCalls.testIfaceExtCall          true  avgt   12  39.611 ± 0.483  ns/op
> InterfaceCalls.testMonomorphic          false  avgt   12   8.476 ± 0.011  ns/op
> InterfaceCalls.testMonomorphic           true  avgt   12   8.475 ± 0.007  ns/op
> 
> # With Patch
> Benchmark                        (randomized)  Mode  Cnt   Score   Error  Units
> InterfaceCalls.test1stInt2Types         false  avgt   12   9.804 ± 0.401  ns/op
> InterfaceCalls.test1stInt2Types          true  avgt   12  14.171 ± 0.029  ns/op
> InterfaceCalls.test1stInt3Types         false  avgt   12  38.793 ± 0.677  ns/op
> InterfaceCalls.test1stInt3Types          true  avgt   12  39.498 ± 0.351  ns/op
> InterfaceCalls.test1stInt5Types         false  avgt   12  40.916 ± 0.771  ns/op
> InterfaceCalls.test1stInt5Types          true  avgt   12  41.705 ± 1.356  ns/op
> InterfaceCalls.test2ndInt2Types         false  avgt   12  10.222 ± 0.340  ns/op
> InterfaceCalls.test2ndInt2Types          true  avgt   12  14.659 ± 0.033  ns/op
> InterfaceCalls.test2ndInt3Types         false  avgt   12  42.375 ± 0....

RISC-V maintainers should take a look at this, but a few drive-by comments:

src/hotspot/cpu/riscv/macroAssembler_riscv.cpp line 570:

> 568:   poly_count_offset    += mdp_offset;
> 569: 
> 570:   // Scale down to optimize encoding. Slots are pointer-sized.

I told this to Chad who did AArch64 port (https://github.com/openjdk/jdk/pull/29283): we do this trick in x86 code because with variable instruction sizes you would want to stay within 8-bit offsets if you can. I doubt it makes a difference for AArch64 or RISC-V. So you can simplify this part.

src/hotspot/cpu/riscv/macroAssembler_riscv.cpp line 641:

> 639:   add(addr_reg, mdp, t0);
> 640:   cmpxchg(/*addr*/ addr_reg, /*expected*/ x0, /*new*/ recv, Assembler::int64,
> 641:           /*acquire*/ Assembler::aq, /*release*/ Assembler::rl, /*result*/ recv);

As we discussed in AArch64 port of this, it is irrelevant for CAS to have a memory semantics here. You can do CAS without acquire/release here.

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

PR Review: https://git.openjdk.org/jdk/pull/29310#pullrequestreview-3681238908
PR Review Comment: https://git.openjdk.org/jdk/pull/29310#discussion_r2707534811
PR Review Comment: https://git.openjdk.org/jdk/pull/29310#discussion_r2707537349


More information about the hotspot-dev mailing list