RFR: 8333334: C2: Make result of `Node::dominates` more precise to enhance scalar replacement [v8]

Qizheng Xing qxing at openjdk.org
Thu Aug 22 09:02:47 UTC 2024


> This patch changes the algorithm of `Node::dominates` to make the result more precise, and allows the iterators of `ConcurrentHashMap` to be scalar replaced.
> 
> The previous algorithm will return a conservative result when encountering a dead control flow, and only try the first two input paths of a multi-input Region node, which may prevent the scalar replacement in some cases.
> 
> For example, with G1 GC enabled, C2 generates GC barriers for `ConcurrentHashMap` iteration operations at some early phases, and then eliminates them in a later IGVN, but `LoadNode` is also idealized in the same IGVN. This causes `LoadNode::Ideal` to see some dead barrier control flows, and refuse to split some instance field loads through Phi due to the conservative result of `Node::dominates`, and thus the scalar replacement can not be applied to iterators in the later macro elimination phase.
> 
> This patch allows `Node::dominates` to try other paths of the last multi-input Region node when the first path is dead, and makes `ConcurrentHashMap` iteration ~30% faster:
> 
> 
> Benchmark                            (nkeys)  Mode  Cnt        Score       Error  Units
> Maps.testConcurrentHashMapIterators    10000  avgt   15   414099.085 ± 33230.945  ns/op   # baseline
> Maps.testConcurrentHashMapIterators    10000  avgt   15   315490.281 ±  3037.056  ns/op   # patch
> 
> 
> Testing: tier1-4.

Qizheng Xing has updated the pull request incrementally with four additional commits since the last revision:

 - Add wrapper method for checking `DomResult` of `all_controls_dominate`.
 - Remove redundant `applyIf` and fix style for IR test.
 - Fix style.
 - Add brackets around modified if/else branches.

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

Changes:
  - all: https://git.openjdk.org/jdk/pull/19496/files
  - new: https://git.openjdk.org/jdk/pull/19496/files/35e7a0d8..8ee38498

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jdk&pr=19496&range=07
 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=19496&range=06-07

  Stats: 62 lines in 4 files changed: 28 ins; 1 del; 33 mod
  Patch: https://git.openjdk.org/jdk/pull/19496.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/19496/head:pull/19496

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


More information about the hotspot-compiler-dev mailing list