> 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.
MaxXing has updated the pull request incrementally with one additional commit since the last revision: Revert last commit, and push the `LoadNode` back to the worklist to wait for the dead code to be removed. ------------- Changes: - all: https://git.openjdk.org/jdk/pull/19496/files - new: https://git.openjdk.org/jdk/pull/19496/files/e3330ece..b5db38dc Webrevs: - full: https://webrevs.openjdk.org/?repo=jdk&pr=19496&range=01 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=19496&range=00-01 Stats: 107 lines in 4 files changed: 39 ins; 34 del; 34 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