`IS_DEST_UNINITIALIZED ` is ment to signal to the GC that you cannot read the 
contents of the field as it is uninitialized. This is used by the compiler 
which have strict control over its safepoints.

The MemAllocator in the runtime has no such guarantees, and will clear all oop 
fields before handing the allocated object. These objects can have been seen by 
the GC and even tenured before the call  
`HeapAccess<IS_DEST_UNINITIALIZED>::value_copy`. This is unsound. ZGC for 
example could miss young to old edges if the destination object had been 
tenured.

I propose we remove these and always use `HeapAccess<>::value_copy`. The 
behaviour will be the same for value objects which do not contain oops, and 
correct of values which contains oops. There is the potential in the future to 
add something along the lines of `IS_DEST_NULL` to provide more static 
information to the GC to optimise the barriers on. However the gain here is 
probably negligible.

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

Commit messages:
 - 8377243: [lworld] HeapAccess<IS_DEST_UNINITIALIZED>::value_copy uses in the 
runtime are unsound

Changes: https://git.openjdk.org/valhalla/pull/2048/files
  Webrev: https://webrevs.openjdk.org/?repo=valhalla&pr=2048&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8377243
  Stats: 23 lines in 5 files changed: 0 ins; 12 del; 11 mod
  Patch: https://git.openjdk.org/valhalla/pull/2048.diff
  Fetch: git fetch https://git.openjdk.org/valhalla.git pull/2048/head:pull/2048

PR: https://git.openjdk.org/valhalla/pull/2048

Reply via email to