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
