RFR: 8254317: C2: Resource consumption of ConvI2LNode::Ideal() grows exponentially [v2]

eric.1iu github.com+10482586+erik1iu at openjdk.java.net
Thu Oct 22 03:35:12 UTC 2020


On Wed, 21 Oct 2020 17:56:04 GMT, Vladimir Kozlov <kvn at openjdk.org> wrote:

>> 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.
>
> test/hotspot/jtreg/compiler/conversions/TestMoveConvI2LThroughAddIs.java line 38:
> 
>> 36:  *          the short specified timeout.
>> 37:  * @library /test/lib /
>> 38:  * @run main/othervm -Xcomp -XX:-TieredCompilation -XX:-Inline
> 
> For future tests writing.
> In general we should avoid using -Xcomp because it does not provide profiling information to C2 and it may generate unexpected code because branches frequencies are not known.
> Preferable way is warm up test method by calling it in a loop enough times to make sure it is compiled and then verify results outside test method.
> Then you don't need -XX:CompileOnly command.

Without -Xcomp, the final code would not the same as expected, lots of branches have been optimized with profiling data which we **do** normally used. 

I wonder whether it's feasible to create such a test case that grows exponentially with profiling data. I think that may decriable the issue more realistic.

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

PR: https://git.openjdk.java.net/jdk/pull/727


More information about the hotspot-compiler-dev mailing list