On Tue, 20 Jan 2026 20:25:55 GMT, Coleen Phillimore <[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
>
> 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?

I am working on trying to create something for representing an InlineKlass 
payload in the runtime code. It achives exactly this. Current work in progress: 
https://github.com/openjdk/valhalla/commit/5df331779cbb6e83493260d41dcdcd97a67ab495

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

PR Review Comment: 
https://git.openjdk.org/valhalla/pull/1936#discussion_r2711197739

Reply via email to