RFR: 8254317: C2: Resource consumption of ConvI2LNode::Ideal() grows exponentially [v2]
Roberto Castañeda Lozano
rcastanedalo at openjdk.java.net
Wed Oct 21 10:04:14 UTC 2020
> In the optimization ConvI2L(AddI(x, y)) -> AddL(ConvI2L(x), ConvI2L(y)) within `ConvI2LNode::Ideal()`, handle the special case x = y by feeding both inputs of AddL from a single ConvI2L node rather than creating two semantically equivalent ConvI2L nodes. This avoids an exponential number of calls to `ConvI2LNode::Ideal()` when dealing with long chains of AddI nodes. Disable the optimization for the pattern ConvI2L(SubI(x, x)), which is simplified to zero during parsing anyway. Add a set of regression tests for the transformation that cover different shapes of AddI subgraphs. Also add a microbenchmark that exercises the special case, for performance regression testing.
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 four additional commits since the last revision:
- Merge master
- Generalize the fix to handle any input where AddIs are used multiple times by
other AddIs, which could also lead to an exponential number of calls to
ConvI2LNode::Ideal(). This is achieved by (1) reusing existing ConvI2Ls if
possible rather than eagerly creating new ones and (2) postponing the
optimization of newly created ConvI2Ls. Remove "hook" node solution introduced
in JDK-8217359 since this is subsumed by (2). Test that ConvI2LNode::Ideal() is
called within iterative GVN using phase->is_IterGVN() rather than can_reshape,
for clarity.
Merge all tests into a single class. Reimplement the microbenchmark as a test
case that should time out in case of a combinatorial explosion. Add a second
similar microbenchmark that demonstrates the need for this generalization.
- Merge master
- 8254317: C2: Resource consumption of ConvI2LNode::Ideal() grows exponentially
In the optimization ConvI2L(AddI(x, y)) -> AddL(ConvI2L(x), ConvI2L(y)) within
ConvI2LNode::Ideal(), handle the special case x = y by feeding both inputs of
AddL from a single ConvI2L node rather than creating two semantically equivalent
ConvI2L nodes. This avoids an exponential number of calls to
ConvI2LNode::Ideal() when dealing with long chains of AddI nodes. Disable the
optimization for the pattern ConvI2L(SubI(x, x)), which is simplified to zero
during parsing anyway. Add a set of regression tests for the transformation that
cover different shapes of AddI subgraphs. Also add a microbenchmark that
exercises the special case, for performance regression testing.
-------------
Changes:
- all: https://git.openjdk.java.net/jdk/pull/727/files
- new: https://git.openjdk.java.net/jdk/pull/727/files/60eaec25..b5cf7aab
Webrevs:
- full: https://webrevs.openjdk.java.net/?repo=jdk&pr=727&range=01
- incr: https://webrevs.openjdk.java.net/?repo=jdk&pr=727&range=00-01
Stats: 37628 lines in 545 files changed: 25644 ins; 9509 del; 2475 mod
Patch: https://git.openjdk.java.net/jdk/pull/727.diff
Fetch: git fetch https://git.openjdk.java.net/jdk pull/727/head:pull/727
PR: https://git.openjdk.java.net/jdk/pull/727
More information about the hotspot-compiler-dev
mailing list