RFR: 8295486: Inconsistent constant field values observed during compilation
Tobias Hartmann
thartmann at openjdk.org
Thu Jan 5 13:33:41 UTC 2023
We hit a "not monotonic" assert because the new type of a load from a stable final field is more narrow than the old type which contradicts the assumption that types should only go from TOP to BOTTOM during CCP:
old: `narrowoop: java/lang/Integer:BotPTR:exact *`
new: `narrowoop: java/lang/Integer java.lang.Integer {0x000000062c41e548} ...`
or
old: `narrowoop: java/lang/Integer java.lang.Integer {0x000000062c41e538} ...`
new: `narrowoop: java/lang/Integer java.lang.Integer {0x000000062c41e548} ...`
The problem is that a stable field can be (re-)initialized during compilation and since the value is not cached, contradicting types can be observed. In `LoadNode::Value`, we re-read the field value each time:
https://github.com/openjdk/jdk/blob/872384707e89d03ede655aad16f360dc94f10152/src/hotspot/share/opto/memnode.cpp#L1994-L1997
https://github.com/openjdk/jdk/blob/872384707e89d03ede655aad16f360dc94f10152/src/hotspot/share/opto/type.cpp#L332-L337
The same problem exists for loads from stable arrays:
https://github.com/openjdk/jdk/blob/872384707e89d03ede655aad16f360dc94f10152/src/hotspot/share/opto/memnode.cpp#L1923
Caching the field value is not feasible as it would require a cache per ciInstance for all the fields and per ciArray for all the elements. Alternatively, we could keep track of the lookup and only do it once but that would also be lots of additional complexity for a benign issue.
Instead, I propose to skip verification during CCP when folding loads from stable fields. Non-stable, constant fields are not affected as `null` is a valid value for them and they would already be folded before CCP.
Thanks,
Tobias
-------------
Commit messages:
- Updated copyright
- 8295486: Inconsistent constant field values observed during compilation
Changes: https://git.openjdk.org/jdk/pull/11861/files
Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=11861&range=00
Issue: https://bugs.openjdk.org/browse/JDK-8295486
Stats: 168 lines in 4 files changed: 150 ins; 3 del; 15 mod
Patch: https://git.openjdk.org/jdk/pull/11861.diff
Fetch: git fetch https://git.openjdk.org/jdk pull/11861/head:pull/11861
PR: https://git.openjdk.org/jdk/pull/11861
More information about the hotspot-compiler-dev
mailing list