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