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