On Tue, 20 Jan 2026 17:56:00 GMT, Joel Sikström <[email protected]> wrote:
> Hello,
>
> Today much of the reading of flattened values in the interpreter is
> implemented both in the platform-specific templateTable_XX.cpp files, and
> also in the runtime via InterpreterRuntime::read_flat_field. The reason we
> have both is becuase the interpreterlet implements a fast-path for null-free
> types, which attempts to allocate the buffered object inside the thread's
> TLAB, before moving on to copy the src payload to the buffered objected. The
> copying is done in the VM via a call_VM_leaf call, which notably does not
> safepoint-poll (nor allow anything that might GC for example).
>
> The slow-path in the interpreterlet calls into the VM via a call_VM, which
> notably safepoint-point polls upon exit. The slow-path is taken when 1) the
> src payload is nullable or 2) the fast-path TLAB allocation fails.
>
> I propose we redesign the dance around when and how to enter the VM by having
> the logic of reading a flat field exclusively inside the runtime and thus
> always entering the VM. This approach allows us to have one canonical way to
> read flat fields, without having effectively duplicate code in
> interpreterlets (for all supported platforms) and inside the runtime. A
> benefit from this is that it becomes easier for porters to port the Valhalla
> changes to their platform(s) and later on maintain that port, which is a plus.
>
> Since all objects are NULLABLE in JEP 401 (disregarding F&F interface), all
> reads of flat fields are already entering the VM via the "slow-path". This
> means that this change only has a practical effect on
> null-free/null-restricted fields. I think we should consider if having a
> fast-path is worth it or not when that time comes, although I anticipate that
> it doesn't make much difference since the copy is always done in the VM
> anyway.
>
> As a small optimization, I've added a check for nullable and marked-as-null
> before entering the VM.
>
> Testing:
> * hotspot_valhalla, jdk_valhalla and Oracle's tier1-4 on linux-x64-debug and
> linux-aarch64-debug
I have a small request, but otherwise this looks great. Thank you for doing
this!
src/hotspot/share/interpreter/interpreterRuntime.cpp line 246:
> 244: // If the field is nullable and is marked null, return early.
> 245: if (LayoutKindHelper::is_nullable_flat(lk) &&
> 246: field_klass->is_payload_marked_as_null(cast_from_oop<address>(obj)
> + offset)) {
I wonder if there's a way to ask this and have the address calculation be
hidden in InstanceKlass, like find_field_from_offset ? So we don't have to
know here if the offset includes the header or not? Or even just add a
is_payload_marked_as_null(oop, offset) to hide the calculation inside of
inlineKlass.inline.hpp?
-------------
Marked as reviewed by coleenp (Committer).
PR Review:
https://git.openjdk.org/valhalla/pull/1936#pullrequestreview-3684143613
PR Review Comment:
https://git.openjdk.org/valhalla/pull/1936#discussion_r2709956745