RFR: 8359270: C2: alignment check should consider base offset when emitting arraycopy runtime call
Fei Yang
fyang at openjdk.org
Thu Jun 12 02:10:11 UTC 2025
Hi, please consider this change fixing alignment check when emitting arraycopy runtime call.
There are currently four callsites of `StubRoutines::select_arraycopy_function` in hotspot C2 shared code where we emit arraycopy runtime calls [1-4]. Three of them [2-4] missed base offset when calculation alignment for both source and destination array addresses. Seems they assume a base offset of 8 bytes, which is not always true. Base offset becomes 4 bytes under either `-XX:+UseCompactObjectHeaders` or `-XX:-UseCompressedClassPointers`.
And `StubRoutines::select_arraycopy_function` selects the right arraycopy runtime based on this alignment. As a result, it could see an incorrect `aligned` param about the array addresses and thus a wrong arraycopy runtime call is selected. This is causing performance regressions (like Dacapo spring) on linux-riscv64 platforms where misaligned memory access is very slow like Sifive Unmatched or Premier P550 SBCs.
Proposed change fixes this issue by taking base offset into account when checking the alignment, which is very similar to [1].
Testing:
- [x] Tier1-3 on linux-aarch64 (release & fastdebug)
- [x] Tier1-3 on linux-riscv64 (release)
- [x] Dacapo spring performance test on linux-riscv64 (w/wo `-XX:+UseCompactObjectHeaders` / `-XX:-UseCompressedClassPointers`)
[1] https://github.com/openjdk/jdk/blob/master/src/hotspot/share/opto/macroArrayCopy.cpp#L341
[2] https://github.com/openjdk/jdk/blob/master/src/hotspot/share/opto/library_call.cpp#L1584
[3] https://github.com/openjdk/jdk/blob/master/src/hotspot/share/opto/library_call.cpp#L1666
[4] https://github.com/openjdk/jdk/blob/master/src/hotspot/share/opto/stringopts.cpp#L1481
-------------
Commit messages:
- 8359270: C2: alignment check should consider base offset when emitting arraycopy runtime call
Changes: https://git.openjdk.org/jdk/pull/25765/files
Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=25765&range=00
Issue: https://bugs.openjdk.org/browse/JDK-8359270
Stats: 18 lines in 2 files changed: 10 ins; 0 del; 8 mod
Patch: https://git.openjdk.org/jdk/pull/25765.diff
Fetch: git fetch https://git.openjdk.org/jdk.git pull/25765/head:pull/25765
PR: https://git.openjdk.org/jdk/pull/25765
More information about the hotspot-compiler-dev
mailing list