RFR: 8345067: C2: enable implicit null checks for ZGC reads
Roberto Castañeda Lozano
rcastanedalo at openjdk.org
Tue May 6 16:42:31 UTC 2025
Currently, C2 cannot exploit late-expanded GC memory accesses as implicit null checks because of their use of temporary operands (`MachTemp`), which prevents `PhaseCFG::implicit_null_check` from [hoisting the memory accesses to the test basic block](https://github.com/openjdk/jdk/blob/f88c1c6ff86b8f29a71647e46136b6432bb67619/src/hotspot/share/opto/lcm.cpp#L319-L335).
This changeset extends the scope of the implicit null check optimization so that it can exploit ZGC object loads. It introduces a platform-dependent predicate (`MachNode::is_late_expanded_null_check_candidate`) to mark late-expanded instructions that emit a suitable memory access as a first instruction as candidates, and extends the optimization to recognize and hoist candidate memory accesses that use temporary operands:

ZGC object loads are marked as late-expanded null-check candidates unconditionally on all ZGC-supported platforms except on aarch64, where only loads that do not require an initial `lea` instruction (due to [address legitimization](https://github.com/openjdk/jdk/blob/ddd07b107e814ec846579a66d4f2005b7db9bb2f/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp#L132-L144)) are marked as candidates. Fortunately, most aarch64 loads seen in practice use small offsets and can be marked as candidates.
Exploiting ZGC loads increases the effectiveness of the implicit null check optimization (percent of explicit null checks turned into implicit ones at compile time) by around 10% in the DaCapo23 benchmarks. This results in slight performance improvements (in the 1-2% range) in a few DaCapo and SPECjvm2008 benchmarks and an overall slight improvement across Renaissance benchmarks.
#### Testing
- tier1-5, compiler stress test (linux-x64, macosx-x64, windows-x64, linux-aarch64, macosx-aarch64; release and debug mode).
-------------
Commit messages:
- Format
- Remove extra line
- Further clarify zLoadP candidate predicate and no-preceding-lea assertion
- Rename machine node property to ins_is_late_expanded_null_check_candidate for clarity, and make it a total function
- Update copyright year
- Revert unnecessary changes
- Move check to original location
- Enable zLoadP as implicit null check candidates on riscv and ppc
- Refactor assertion
- Simplify test
- ... and 15 more: https://git.openjdk.org/jdk/compare/e2ae50d8...dc5aa4fc
Changes: https://git.openjdk.org/jdk/pull/25066/files
Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=25066&range=00
Issue: https://bugs.openjdk.org/browse/JDK-8345067
Stats: 385 lines in 15 files changed: 338 ins; 37 del; 10 mod
Patch: https://git.openjdk.org/jdk/pull/25066.diff
Fetch: git fetch https://git.openjdk.org/jdk.git pull/25066/head:pull/25066
PR: https://git.openjdk.org/jdk/pull/25066
More information about the hotspot-gc-dev
mailing list