RFR(S): 8244407: JVM crashes after transformation in C2 IdealLoopTree::split_fall_in
Vladimir Kozlov
vladimir.kozlov at oracle.com
Tue May 12 16:23:59 UTC 2020
Hi, Felix
Yes, the fix looks good.
Please, use {} for if() body.
Thanks,
Vladimir
On 5/11/20 1:58 AM, Tobias Hartmann wrote:
> Hi Felix,
>
> your fix looks reasonable to me but Vladimir K. (who reviewed your original fix), should also have a
> look.
>
> Best regards,
> Tobias
>
> On 06.05.20 03:32, Yangfei (Felix) wrote:
>> Hi,
>>
>> Please help review this patch fixing a C2 crash issue.
>> Bug: https://bugs.openjdk.java.net/browse/JDK-8244407
>> Webrev: http://cr.openjdk.java.net/~fyang/8244407/webrev.00
>>
>> After the fix for JDK-8240576, irreducible loop tree might be structurally changed by split_fall_in() in IdealLoopTree::beautify_loops.
>> But loop tree is not rebuilt after that. Take the reported test case for example, irreducible loop tree looks like:
>>
>> 1: Loop: N649/N644
>>
>> Loop: N649/N644 IRREDUCIBLE <-- this
>> Loop: N649/N797 sfpts={ 683 }
>>
>> With the fix for JDK-8240576,we won't do merge_many_backedges in IdealLoopTree::beautify_loops for this irreducible loop tree.
>>
>> if( _head->req() > 3 && !_irreducible) {
>> // Merge the many backedges into a single backedge but leave
>> // the hottest backedge as separate edge for the following peel.
>> merge_many_backedges( phase );
>> result = true;
>> }
>>
>> N660 N644 N797
>> | | |
>> | | |
>> | v |
>> | +---+---+ |
>> +-----> + N649 + <-----+
>> +--------+
>>
>> 649 Region === 649 660 797 644 [[ .... ]] !jvms: Test::testMethod @ bci:543
>>
>> Then we come to the children:
>>
>> // Now recursively beautify nested loops
>> if( _child ) result |= _child->beautify_loops( phase );
>>
>> 2: Loop: N649/N797
>>
>> Loop: N649/N644 IRREDUCIBLE
>> Loop: N649/N797 sfpts={ 683 } <-- this
>>
>> After spilt_fall_in(),N660 and N644 are merged.
>>
>> if( fall_in_cnt > 1 ) // Need a loop landing pad to merge fall-ins
>> split_fall_in( phase, fall_in_cnt );
>>
>> N660 N644
>> | +
>> | |
>> | |
>> | +---------+ |
>> +---->+ N946 +<-----+
>> +----+---+
>> | N797
>> | |
>> | |
>> | |
>> | +--------+ |
>> +----> + N649 + <-----+
>> +--------+
>>
>> Loop tree is now structurally changed into:
>>
>> Loop: N946/N644 IRREDUCIBLE
>> Loop: N649/N797 sfpts={ 683 }
>>
>> But local variable 'result' in IdealLoopTree::beautify_loops hasn't got a chance to be set to true since _head->req() is not bigger than 3 after split_fall_in.
>> Then C2 won't rebuild loop tree after IdealLoopTree::beautify_loops, which further leads to the crash.
>> Instead of adding extra checking for loop tree structure changes, proposed fix sets 'result' to true when we meet irreducible loop with multiple backedges.
>> This should be safer and simpler (thus good for JIT compile time).
>> Tiered 1-3 tested on x86-64 and aarch64 linux platform. Comments?
>>
>> Thanks,
>> Felix
>>
More information about the hotspot-compiler-dev
mailing list