> `Unsafe::compareAndSetFlatValue` calls > `Unsafe::compareAndSetFlatValueAsBytes` which then calls > `Unsafe::putFlatValue` on a flat array created by `Unsafe::newSpecialArray`. > > https://github.com/openjdk/valhalla/blob/858be30119bd5bc37a69d16042523f53bea71a36/src/java.base/share/classes/jdk/internal/misc/Unsafe.java#L2870-L2875 > > `putFlatValue` can be intrinsified in > > https://github.com/openjdk/valhalla/blob/858be30119bd5bc37a69d16042523f53bea71a36/src/hotspot/share/opto/library_call.cpp#L2727 > > that calls `cast_to_flat_array` > > https://github.com/openjdk/valhalla/blob/858be30119bd5bc37a69d16042523f53bea71a36/src/hotspot/share/opto/library_call.cpp#L2831 > > which fails the assert > > https://github.com/openjdk/valhalla/blob/858be30119bd5bc37a69d16042523f53bea71a36/src/hotspot/share/opto/graphKit.cpp#L1875-L1876 > > because of > > https://github.com/openjdk/valhalla/blob/858be30119bd5bc37a69d16042523f53bea71a36/src/hotspot/share/oops/inlineKlass.cpp#L287-L290 > > Of course, if array flattening is disabled, one can't have flat arrays. And > indeed, `Unsafe::newSpecialArray` will raise if called. So at runtime, the > call to `Unsafe::compareAndSetFlatValue` should simply raise. But when > compiled the assert is hit, crashing the VM, because it cannot tell that the > code is dead, but can check that if it's not the array is not flat. That > doesn't seem reasonable to me. I propose to insert a trap instead. Even in > the case where this code wouldn't be dead (like if `Unsafe::newSpecialArray` > is just undefined behavior instead of throwing), crashing the compiler > doesn't seem like a good option. > > The situation is actually more surprising than it seems: using > `Unsafe::compareAndSetFlatValue` on a flat field with > `-XX:-UseArrayFlattening` sounds reasonable, but doesn't actually work since > the implementation will (attempt to) create flat arrays under the hood. It is > not clear to me whether it's actually desirable, as > `Unsafe::compareAndSetFlatValue` introduce some coupling of field and array > flattening, but on the other hand, it's an unsafe API, so it's not that crazy > to require more constrains to use. > > Thanks, > Marc
Marc Chevalier has updated the pull request incrementally with one additional commit since the last revision: Add +UseFieldFlattening ------------- Changes: - all: https://git.openjdk.org/valhalla/pull/1549/files - new: https://git.openjdk.org/valhalla/pull/1549/files/a988452f..e6c26112 Webrevs: - full: https://webrevs.openjdk.org/?repo=valhalla&pr=1549&range=02 - incr: https://webrevs.openjdk.org/?repo=valhalla&pr=1549&range=01-02 Stats: 4 lines in 1 file changed: 2 ins; 1 del; 1 mod Patch: https://git.openjdk.org/valhalla/pull/1549.diff Fetch: git fetch https://git.openjdk.org/valhalla.git pull/1549/head:pull/1549 PR: https://git.openjdk.org/valhalla/pull/1549