RFR: 8334060: Implementation of Late Barrier Expansion for G1 [v12]

Roberto Castañeda Lozano rcastanedalo at openjdk.org
Mon Sep 2 06:38:07 UTC 2024


> This changeset implements JEP 475 (Late Barrier Expansion for G1), including support for the x64 and aarch64 platforms. See the [JEP description](https://openjdk.org/jeps/475) for further detail.
> 
> We aim to integrate this work in JDK 24. The purpose of this pull request is double-fold:
> 
> - to allow maintainers of the arm (32-bit), ppc, riscv, s390, and x86 (32-bit) ports to contribute a port of these platforms in time for JDK 24; and
> - to allow reviewers to review the platform-independent, x64 and aarch64, and test changes in parallel with the porting work.
> 
> ## Summary of the Changes
> 
> ### Platform-Independent Changes (`src/hotspot/share`)
> 
> These consist mainly of:
> 
> - a complete rewrite of `G1BarrierSetC2`, to instruct C2 to expand G1 barriers late instead of early;
> - a few minor changes to C2 itself, to support removal of redundant decompression operations and to address an OopMap construction issue triggered by this JEP's increased usage of ADL `TEMP` operands; and
> - temporary support for porting the JEP to the remaining platforms.
> 
> The temporary support code (guarded by the pre-processor flag `G1_LATE_BARRIER_MIGRATION_SUPPORT`) will **not** be part of the final pull request, and hence does not need to be reviewed.
> 
> ### Platform-Dependent Changes (`src/hotspot/cpu`)
> 
> These include changes to the ADL instruction definitions and the `G1BarrierSetAssembler` class of the x64 and aarch64 platforms.
> 
> #### ADL Changes
> 
> The changeset uses ADL predicates to force C2 to implement memory accesses tagged with barrier information using G1-specific, barrier-aware instruction versions (e.g. `g1StoreP` instead of the GC-agnostic `storeP`). These new instruction versions generate machine code accordingly to the corresponding tagged barrier information, relying on the G1 barrier implementations provided by the `G1BarrierSetAssembler` class. In the aarch64 platform, the bulk of the ADL code is generated from a higher-level version using m4, to reduce redundancy.
> 
> #### `G1BarrierSetAssembler` Changes
> 
> Both platforms basically reuse the barrier implementation for the bytecode interpreter, with the different barrier tests and operations refactored into dedicated functions. Besides this, `G1BarrierSetAssembler` is extended with assembly-stub routines that implement the out-of-line, slow path of the barriers. These routines include calls from the barrier into the JVM, which require support for saving and restoring live registers, provided by the `SaveLiveRegisters` class. This c...

Roberto Castañeda Lozano has updated the pull request with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains 18 additional commits since the last revision:

 - Merge jdk-24+13
 - Add test to motivate compile-time null checks in 'refine_barrier_by_new_val_type'
 - Remark relation between compiler optimization and barrier filter
 - Make 'refine_barrier_by_new_val_type' static and its input argument 'const'
 - Replace 'the null' with 'null' in comment
 - Remove redundant redefinitions of '__'
 - Replace 'already dirty' with 'young' in post-barrier fast path comment
 - Rename g1XChgX to g1GetAndSetX for consistency with Ideal operation names
 - Pass oldval to the pre-barrier in g1CompareAndExchange/SwapP
 - Assert that no implicit null checks are generated for memory accesses with barriers
 - ... and 8 more: https://git.openjdk.org/jdk/compare/52ffcda1...4ee450ad

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

Changes:
  - all: https://git.openjdk.org/jdk/pull/19746/files
  - new: https://git.openjdk.org/jdk/pull/19746/files/57adcfb0..4ee450ad

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jdk&pr=19746&range=11
 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=19746&range=10-11

  Stats: 30577 lines in 938 files changed: 18592 ins; 8033 del; 3952 mod
  Patch: https://git.openjdk.org/jdk/pull/19746.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/19746/head:pull/19746

PR: https://git.openjdk.org/jdk/pull/19746


More information about the hotspot-gc-dev mailing list