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