RFR: 8254317: C2: Resource consumption of ConvI2LNode::Ideal() grows exponentially [v4]
Roberto Castañeda Lozano
rcastanedalo at openjdk.java.net
Tue Nov 10 08:30:08 UTC 2020
> Prevent exponential number of calls to `ConvI2LNode::Ideal()` when AddIs are used multiple times by other AddIs in the optimization ConvI2L(AddI(x, y)) -> AddL(ConvI2L(x), ConvI2L(y)). 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 [8217359](https://github.com/openjdk/jdk/commit/cf554816d1952f722143e9d03ec669e80f955adf), since this is subsumed by (2). Use `phase->is_IterGVN()` rather than `can_reshape` to check if `ConvI2LNode::Ideal()` is called within iterative GVN, for clarity. Add regression tests that cover different shapes and sizes of AddI subgraphs, implicitly checking (by not timing out) that there is no combinatorial explosion.
Roberto Castañeda Lozano has updated the pull request with a new target base due to a merge or a rebase. The pull request now contains seven commits:
- Use 'hash_find_insert' to look for existing ConvI2L nodes
- Merge master
- Update tests
Simplify JVM arguments and run each test case 100000 times to still trigger
C2. Use randomization to avoid constant propagation in C2. Increase the load of
the stress tests and their timeout to 30s to further reduce the risk of false
positives.
- 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: https://git.openjdk.java.net/jdk/pull/727/files
Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=727&range=03
Stats: 190 lines in 2 files changed: 180 ins; 4 del; 6 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