On Thu, 16 Apr 2026 10:55:22 GMT, Christian Hagedorn <[email protected]> 
wrote:

> This patch fixes various issues found with abstract value classes where the 
> assumption was that we have a concrete value class but we actually could have 
> an abstract value class as well.
> 
> The main issue found is that a concrete value class is represented with an 
> `InlineKlass` while an abstract value class is represented with an 
> `InstanceKlass`. Therefore, we cannot cast the latter to `InlineKlass`. While 
> working on this, I checked all `is_inlinetype()` uses and found more issues. 
> I also found issues around the `Arrays.copyOf/copyOfRange` intrinsic but left 
> it as follow-up work and filed 
> [JDK-8382226](https://bugs.openjdk.org/browse/JDK-8382226) for it. 
> 
> Here is a list of fixes included in this patch, together with corresponding 
> tests:
> 1. `GraphKit::get_layout_helper()`: Wrong old assumption that nullable 
> implies not-flat.
> 2. Checking whether we have a load/store from/to a field of an empty value 
> class:
> a. C1: `GraphBuilder::access_field()`, for static and instance field.
> b. C2: `Parse::do_get_xxx()`, for loading
> c. C2: `Parse::do_set_xxx()`, for storing
> 3. `arraycopy` instrinsic: Not bailing out when src or dest is a flat 
> abstract value class array - in this case we don't know the layout. We 
> currently hit an assert due to an invalid cast, assuming concrete value 
> classes when an array is flat.
> 
> Additional changes:
> - Added some more asserts
> - Some small code cleanups
> 
> Thanks,
> Christian
> 
> ---------
> - [x] I confirm that I make this contribution in accordance with the [OpenJDK 
> Interim AI Policy](https://openjdk.org/legal/ai).

src/hotspot/share/c1/c1_GraphBuilder.cpp line 1901:

> 1899:         null_check(val);
> 1900:       }
> 1901:       if (field->is_null_free() && field->type()->is_loaded() && 
> field->type()->as_inline_klass()->is_empty() && 
> (!method()->is_class_initializer() || field->is_flat())) {

Also merged together under `is_null_free()`

src/hotspot/share/opto/inlinetypenode.cpp line 600:

> 598:       ciInlineKlass* fvk = ft->as_inline_klass();
> 599:       bool atomic = field->is_atomic();
> 600: 

Unused

src/hotspot/share/opto/macroArrayCopy.cpp line 1553:

> 1551:   RegionNode* slow_region = new RegionNode(1);
> 1552:   transform_later(slow_region);
> 1553:   const bool same_nullness = top_src->is_null_free() == 
> top_dest->is_null_free();

Just some code sharing and simplification with code below

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

PR Review Comment: 
https://git.openjdk.org/valhalla/pull/2325#discussion_r3092658690
PR Review Comment: 
https://git.openjdk.org/valhalla/pull/2325#discussion_r3092671568
PR Review Comment: 
https://git.openjdk.org/valhalla/pull/2325#discussion_r3092680429

Reply via email to