RFR: 8260355: AArch64: deoptimization stub should save vector registers

Nick Gasson ngasson at openjdk.java.net
Thu Jan 28 08:31:46 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.

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

Commit messages:
 - 8260355: AArch64: deoptimization stub should save vector registers

Changes: https://git.openjdk.java.net/jdk/pull/2279/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=2279&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8260355
  Stats: 88 lines in 2 files changed: 42 ins; 23 del; 23 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