RFR: 8260355: AArch64: deoptimization stub should save vector registers [v2]
Nick Gasson
ngasson at openjdk.java.net
Mon Feb 1 08:10:10 UTC 2021
> This is an AArch64 port of the fix for JDK-8256056 "Deoptimization stub
> doesn't save vector registers on x86". The problem is that a vector
> produced by the Vector API may be stored in a register when the deopt
> blob is called. Because the deopt blob only stores the lower half of
> vector registers, the full vector object cannot be rematerialized during
> deoptimization. So the following will crash on AArch64 with current JDK:
>
> make test TEST="jdk/incubator/vector" \
> JTREG="VM_OPTIONS=-XX:+DeoptimizeALot -XX:DeoptimizeALotInterval=0"
>
> The fix is to store the full vector registers by passing
> save_vectors=true to save_live_registers() in the deopt blob. Because
> save_live_registers() places the integer registers above the floating
> registers in the stack frame, RegisterSaver::r0_offset_in_bytes() needs
> to calculate the SP offset based on whether full vectors were saved, and
> whether those vectors were NEON or SVE, rather than using a static
> offset as it does currently.
>
> The change to VectorSupport::allocate_vector_payload_helper() is
> required because we only store the lowest VMReg slot in the oop map.
> However unlike x86 the vector registers are always saved in a contiguous
> region of memory, so we can calculate the address of each vector element
> as an offset from the address of the first slot. X86 handles this in
> RegisterMap::pd_location() but that won't work on AArch64 because with
> SVE there isn't a unique VMReg corresponding to each four-byte physical
> slot in the vector (there are always exactly eight logical VMRegs
> regardless of the actual vector length).
>
> Tested hotspot_all_no_apps and jdk_core.
Nick Gasson has updated the pull request incrementally with one additional commit since the last revision:
Move SVE slot handling to RegisterMap::pd_location
-------------
Changes:
- all: https://git.openjdk.java.net/jdk/pull/2279/files
- new: https://git.openjdk.java.net/jdk/pull/2279/files/83d07c58..2364f3dd
Webrevs:
- full: https://webrevs.openjdk.java.net/?repo=jdk&pr=2279&range=01
- incr: https://webrevs.openjdk.java.net/?repo=jdk&pr=2279&range=00-01
Stats: 222 lines in 20 files changed: 136 ins; 13 del; 73 mod
Patch: https://git.openjdk.java.net/jdk/pull/2279.diff
Fetch: git fetch https://git.openjdk.java.net/jdk pull/2279/head:pull/2279
PR: https://git.openjdk.java.net/jdk/pull/2279
More information about the hotspot-dev
mailing list