[15] RFR(S): 8238178: CTW: C1 compilation fails with assert(sux->loop_depth() != block->loop_depth() || sux->loop_index() == block->loop_index() || loop_through_xhandler) failed: Loop index has to be same

Christian Hagedorn christian.hagedorn at oracle.com
Fri Feb 7 10:42:56 UTC 2020


Hi

Please review the following patch:
https://bugs.openjdk.java.net/browse/JDK-8238178
http://cr.openjdk.java.net/~chagedorn/8238178/webrev.00/

The failing assertion is part of the verification of the IR and states 
that a successor of a block must always have either the same loop index 
(as part of the same loop) or a different loop depth when exiting the 
loop. The latter condition is usually true since an edge to an 
immediately following loop header block is split and a new block 
inserted (with loop depth 0). However, if there is a loop that is only 
executed once on the non-exceptional path but multiple times in case of 
an exception, the edge is not split and another loop header block could 
immediately follow (as in the test cases). The loop_through_xhandler 
variable [1] should cover those cases in the assertion: If a successor 
of a loop head block 'h' is also a loop head block then the backbranch 
from 'h' must come from one of its exception handlers.

The current code assumes that the block from the backbranch is either an 
exception handler from the loop head block (as in testSimple()) or is 
dominated by an exception handler of the loop head block (as in 
testDominatedByXhandler()). However, this does not cover the case with 
additional try/catch blocks in a catch block such that the backbranch 
block is not dominated by any exception handler of the loop head block. 
For example in [2] (testNestedExceptions()), B5 and B17 have different 
loop indices and the same depth but B16 is neither dominated by xhandler 
B1 nor xhandler B2, letting the assertion fail.

The fix searches through all blocks in the loop to find an exception 
handler of the loop header block.


Thank you!

Best regards,
Christian


[1] 
http://hg.openjdk.java.net/jdk/jdk/file/5e402c63694f/src/hotspot/share/c1/c1_RangeCheckElimination.cpp#l1109
[2] 
https://bugs.openjdk.java.net/secure/attachment/86667/nested_exceptions.png


More information about the hotspot-compiler-dev mailing list