[lworld] RFR: 8357474: [lworld] Consolidate load/store flat inline types [v5]
Quan Anh Mai
qamai at openjdk.org
Thu May 22 19:04:10 UTC 2025
On Thu, 22 May 2025 18:49:23 GMT, Quan Anh Mai <qamai at openjdk.org> wrote:
>> Hi,
>>
>> This patch consolidates loading and storing of flat inline types. This makes it so that `make_from_flat` and `store_flat` will take a pointer to the target location. `make_from_flat_array` and `store_flat_array` are split out into their own methods which receive an `idx` parameter. This also fixes some issues I theorycrafted:
>>
>> - Improper loading/storing of atomic elements in a non-atomic container. This is not supported at the moment but it would be great to prepare for it.
>> - `is_naturally_atomic` checks `nof_declared_nonstatic_fields`, which is incorrect if the sole field has multiple fields. I refactored it into `ciInlineKlass`, the decision to do atomic loads/stores is also delegated to the callee, the caller only needs to know whether the operations act as if they are atomic, not whether they are actually executed atomically.
>> - `null_free` of an oop can only be trusted if the container itself is null-free. For example this case:
>>
>> value class StringHolder {
>> @NullRestricted
>> String s;
>> }
>>
>> value class StringHolderHolder {
>> // flatten
>> StringHolder v;
>> }
>>
>> Then `v.s` cannot be trusted to be non-null because `v` can be null.
>>
>> This also allows straightforward implementation of https://bugs.openjdk.org/browse/JDK-8349110.
>>
>> Please let me know what you think. Thanks very much.
>
> Quan Anh Mai has updated the pull request incrementally with one additional commit since the last revision:
>
> fix array of nullable empty type
The failure is due to complications computing the field offset of an array access. When finding the field corresponding to a field offset, we cannot find the null marker because it is not a field inside the element type. There is still one strange case, though, consider this class:
@LooselyConsistentValue
static value class EmptyContainer {
@Strict
@NullRestricted
MyValueEmpty empty = new MyValueEmpty();
}
Then, the null marker of `EmptyContainer` is at offset 1 inside the payload. I checked for that case and made it a mismatched access now.
-------------
PR Comment: https://git.openjdk.org/valhalla/pull/1470#issuecomment-2902266754
More information about the valhalla-dev
mailing list