-
Notifications
You must be signed in to change notification settings - Fork 127
8371199: [lworld] Flattening of nullable elements of classes similar to j.l.Long #1720
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: lworld
Are you sure you want to change the base?
Conversation
|
👋 Welcome back qamai! A progress list of the required criteria for merging this PR into |
|
@merykitty This change is no longer ready for integration - check the PR body for details. |
Webrevs
|
|
Hello, Also I suppose that at some point this patch (or a following one) will change the VarHandle implementation (or Unsafe ?), because currently the read/write through a VarHandle will not have the required the memory barriers. |
|
@forax Suppose a value class like this For your second point, |
I don't know how this is currently implemented in the GC, but wouldn't it make sense for the GC to check whether the value is marked as null first, and ignore the rest of the value in that case? Especially for ZGC flattening currently doesn't happen even for That said, restricting to payloads without oops makes this change easier to reason about, so - assuming it makes sense - extending to payloads with oops as a follow-up might be better. |
|
FYI, we explored some ideas along these lines a couple of years ago. Ended up concluding that it was a dead end—I'd suggest discussing on [email protected] if you'd like to understand what the concerns were. |
yes, i get that.
Okay, so i suppose it means that because this considered as non-atomic on the VarHandle side, something like a CAS operation is not supported. |
|
@forax That line is in the
Yes, I don't think we support CAS operations for flat elements in general. |
FTR, @forax provided an example here: https://mail.openjdk.org/pipermail/valhalla-dev/2025-November/016074.html The issue of resurrecting an old value generally prevents us from flattening 64 bit + null marker, unfortunately. |
|
@SirYwell @forax I think there's some confusion around the GC related code here. First of all, this is not specific to @merykitty's changes. This is not new, he just moved existing code. That particular code is needed to support 64-bit flat accesses with one or two 32-bit compressed oops. Currently, two oops are only possible if the field/array is null-free. Different GCs need different barriers, so we need to emit different code depending on which GC is used. |
Hi,
Currently, the layout of a nullable
j.l.Long, if flattened, must be at least 65 bits. This exceeds the maximum size a GPR can generally hold, as well as the default object alignment of Hotspot. As a result, accessing such elements atomically require 128-bit atomic accesses, as well as mechanism from the GC to allocate overaligned objects. And even then, we will encounter the same issue, just with larger objects.We can observe that, a nullable element does not really have an additional bit of information, it just has an additional state (e.g. a nullable
j.l.Longhas2^64 + 1states, not2^65), and it is just unfortunate that we need a whole bit to be able to represent such an element. However, we can rely on the fact that all payload bits are irrelevant when the null marker is 0 to make a sequence of more than 1 memory access instructions look atomic.C1 has not been implemented yet, we will bailout the compilation when encountering such an access. I will implement this functionality later.
Please take a look and leave your reviews, thanks a lot.
Progress
Issue
Reviewing
Using
gitCheckout this PR locally:
$ git fetch https://git.openjdk.org/valhalla.git pull/1720/head:pull/1720$ git checkout pull/1720Update a local copy of the PR:
$ git checkout pull/1720$ git pull https://git.openjdk.org/valhalla.git pull/1720/headUsing Skara CLI tools
Checkout this PR locally:
$ git pr checkout 1720View PR using the GUI difftool:
$ git pr show -t 1720Using diff file
Download this PR as a diff file:
https://git.openjdk.org/valhalla/pull/1720.diff
Using Webrev
Link to Webrev Comment