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
