Hi all,

This patch fixes some performance issues with AArch64's `NMethodEntryBarrier`.

The purpose of a method entrypoint is to act as a barrier for potential GC 
work. Entrypoints can be "armed", such that when the method is called, a 
slow-path is triggered. This slow-path then does any necessary fixups. 

With the introduction of scalarized calling conventions in Valhalla, methods 
have multiple entrypoints, depending on the calling conventions that are used. 
This is due to the fact that `nmethod`s cannot be multiplexed when scalarized. 
There can be up to three entrypoints for a given method. The locations of these 
entrypoints is tracked via relocations. 

The problem lies within the usage of `RelocIterator`. When `static void 
set_value` is called (such as when arming entrypoints), it creates a 
`NativeNMethodBarrier` for each entrypoint. However, the `RelocIterator` only 
finds the first relocation, meaning each embodiment of `NativeNMethodBarrier` 
sees the same `_guard_addr`. Consequently, executions entering through the 
other entrypoints will not see the up-to-date armed value, and be unnecessarily 
slow-pathed. 

This patch introduces several improvements:
1. Makes `NativeNMethodBarrier` use the `ldr` instructions to determine the 
`_guard_addr`s, as opposed to relocations (contributed by @TobiHartmann). This 
gets the correct addresses for each of the guards, and avoids having to iterate 
through the `nmethod`'s relocations, which is expensive for large methods. 
2. Consolidates all the entrypoints as first-class citizens of 
`NativeNMethodBarrier`, instead of having an `NativeNMethodBarrier` per 
entrypoint. This reduces object allocation, and makes the code much easier to 
read for free! 
3. Stricter assertions. All entrypoints `ldr` instructions are verified (as 
opposed to just the scalarized ones previously). All guard addresses are 
verified to be within the `nmethod`'s instructions/stubs.

Testing: tiers 1-4 and some adhoc testing with `--enable-preview`. 

---------
- [x] I confirm that I make this contribution in accordance with the [OpenJDK 
Interim AI Policy](https://openjdk.org/legal/ai).

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

Commit messages:
 - Documentation and renaming.
 - Fix JVMCI assert.
 - Remove relocation.
 - Tobias' patch productized.

Changes: https://git.openjdk.org/valhalla/pull/2389/files
  Webrev: https://webrevs.openjdk.org/?repo=valhalla&pr=2389&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8383565
  Stats: 191 lines in 2 files changed: 100 ins; 51 del; 40 mod
  Patch: https://git.openjdk.org/valhalla/pull/2389.diff
  Fetch: git fetch https://git.openjdk.org/valhalla.git pull/2389/head:pull/2389

PR: https://git.openjdk.org/valhalla/pull/2389

Reply via email to