RFR: 8280799: С2: assert(false) failed: cyclic dependency prevents range check elimination
Tobias Hartmann
thartmann at openjdk.java.net
Wed Feb 9 07:23:07 UTC 2022
On Wed, 2 Feb 2022 10:38:11 GMT, Roland Westrelin <roland at openjdk.org> wrote:
> The loop exit condition of the test method:
>
> if (i == stop) {
> break;
> }
>
> requires insertion of a loop limit predicate when the loop is turned
> into a counted loop. stop is a LoadI. Next:
>
> array[stop - i + j] = 0;
>
> is transformed to:
>
> array[stop - i] = 0;
>
> and the range check for that array access becomes candidate for
> predication in a subsequent loop opts pass. stop has control just
> above the loop limit check when that happens (because it is assigned
> control as late as possible). But the loop predicate for the bound
> check needs to be above the loop limit check and that causes the
> assert failure.
>
> There's already logic in PhaseIdealLoop::build_loop_late_post_work()
> to assign control to nodes above predicates so this sort of issues
> doesn't occur. But it only applies to node initially on the entry
> projection right above the loop head. The fix I propose is to remove
> that restriction.
>
> That logic was added by JDK-8203197 and looking back at this change I
> noticed I replaced some existing logic with the current logic but,
> while the 2 overlap, the current logic is not guaranteed to always
> cover some cases handled by the old logic. So I resurrected that old
> logic here.
>
> Finally, when running tests, I hit failures because Opaque nodes for
> skeleton predicates can now end up above a predicate that is split
> thru phi. That causes the Opaque nodes to be split up and breaks
> pattern matching. I'm actually not sure this issue is specific to the
> change here so I think it's best to treat it as a general issue and
> fix it by cloning the chain of nodes that lead to the Opaque node
> down.
I executed some testing and hit the following failure with the `serviceability/sa/ClhsdbCDS*` tests (`-XX:+UseParallelGC -XX:+UseNUMA`:
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x00007fc8d7407dcf, pid=18320, tid=18366
#
# JRE version: Java(TM) SE Runtime Environment (19.0) (fastdebug build 19-internal+0-2022-02-08-1034049.tobias.hartmann.jdk2)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (fastdebug 19-internal+0-2022-02-08-1034049.tobias.hartmann.jdk2, mixed mode, sharing, tiered, compressed oops, compressed class ptrs, parallel gc, linux-amd64)
# Problematic frame:
# V [libjvm.so+0x135adcf] PhaseIdealLoop::get_ctrl(Node*)+0x4f
Current CompileTask:
C2: 1131 710 4 sun.jvm.hotspot.oops.Symbol::asByteArray (34 bytes)
Stack: [0x00007fc8aacee000,0x00007fc8aadef000], sp=0x00007fc8aade8650, free space=1001k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
V [libjvm.so+0x135adcf] PhaseIdealLoop::get_ctrl(Node*)+0x4f
V [libjvm.so+0x17ed176] PhaseIdealLoop::split_up(Node*, Node*, Node*) [clone .part.0]+0x2f6
V [libjvm.so+0x17ecf4a] PhaseIdealLoop::split_up(Node*, Node*, Node*) [clone .part.0]+0xca
V [libjvm.so+0x17ecf4a] PhaseIdealLoop::split_up(Node*, Node*, Node*) [clone .part.0]+0xca
V [libjvm.so+0x17ecf4a] PhaseIdealLoop::split_up(Node*, Node*, Node*) [clone .part.0]+0xca
V [libjvm.so+0x17f26ed] PhaseIdealLoop::do_split_if(Node*, RegionNode**, RegionNode**)+0x77d
V [libjvm.so+0x13b2651] PhaseIdealLoop::split_if_with_blocks(VectorSet&, Node_Stack&)+0x201
V [libjvm.so+0x13a482b] PhaseIdealLoop::build_and_optimize(LoopOptsMode)+0x12fb
V [libjvm.so+0xa9c88a] PhaseIdealLoop::optimize(PhaseIterGVN&, LoopOptsMode)+0x28a
V [libjvm.so+0xa99055] Compile::Optimize()+0x1035
V [libjvm.so+0xa9b295] Compile::Compile(ciEnv*, ciMethod*, int, Options, DirectiveSet*)+0x1575
V [libjvm.so+0x8b1d99] C2Compiler::compile_method(ciEnv*, ciMethod*, int, bool, DirectiveSet*)+0x669
V [libjvm.so+0xaab178] CompileBroker::invoke_compiler_on_method(CompileTask*)+0xc88
V [libjvm.so+0xaabf58] CompileBroker::compiler_thread_loop()+0x668
V [libjvm.so+0x193711a] JavaThread::thread_main_inner()+0x25a
V [libjvm.so+0x193f460] Thread::call_run()+0x100
V [libjvm.so+0x1621fb4] thread_native_entry(Thread*)+0x104
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ff8c892ad8b, pid=232, tid=41068
#
# JRE version: Java(TM) SE Runtime Environment (19.0) (fastdebug build 19-internal+0-2022-02-08-1034049.tobias.hartmann.jdk2)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (fastdebug 19-internal+0-2022-02-08-1034049.tobias.hartmann.jdk2, mixed mode, tiered, compressed oops, compressed class ptrs, g1 gc, windows-amd64)
# Problematic frame:
# V [jvm.dll+0xcbad8b] PhaseIdealLoop::split_up+0x203b
Current CompileTask:
C2: 1167 562 4 sun.jvm.hotspot.debugger.DebuggerBase::readCInteger (295 bytes)
Stack: [0x000000d711500000,0x000000d711600000], sp=0x000000d7115f9f70, free space=999k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
V [jvm.dll+0xcbad8b] PhaseIdealLoop::split_up+0x203b (split_if.cpp:271)
V [jvm.dll+0xcb8ec4] PhaseIdealLoop::split_up+0x174 (split_if.cpp:77)
V [jvm.dll+0xcb8ec4] PhaseIdealLoop::split_up+0x174 (split_if.cpp:77)
V [jvm.dll+0xcb8ec4] PhaseIdealLoop::split_up+0x174 (split_if.cpp:77)
V [jvm.dll+0xcb6776] PhaseIdealLoop::do_split_if+0x346 (split_if.cpp:498)
V [jvm.dll+0xa5f851] PhaseIdealLoop::split_if_with_blocks+0x1a1 (loopopts.cpp:1812)
V [jvm.dll+0xa32ec8] PhaseIdealLoop::build_and_optimize+0xff8 (loopnode.cpp:4366)
V [jvm.dll+0x4f3d45] Compile::Optimize+0x1145 (compile.cpp:2266)
V [jvm.dll+0x4f0b87] Compile::Compile+0x14b7 (compile.cpp:810)
V [jvm.dll+0x4138a5] C2Compiler::compile_method+0x145 (c2compiler.cpp:115)
V [jvm.dll+0x50a216] CompileBroker::invoke_compiler_on_method+0x756 (compileBroker.cpp:2293)
V [jvm.dll+0x507a06] CompileBroker::compiler_thread_loop+0x276 (compileBroker.cpp:1967)
V [jvm.dll+0xd8d317] JavaThread::thread_main_inner+0x297 (thread.cpp:1296)
V [jvm.dll+0xd82e64] Thread::call_run+0x1b4 (thread.cpp:361)
V [jvm.dll+0xbcb449] thread_native_entry+0xb9 (os_windows.cpp:544)
C [ucrtbase.dll+0x1fb80] _o__realloc_base+0x60
C [KERNEL32.DLL+0x84d4] BaseThreadInitThunk+0x14
C [ntdll.dll+0x51791] RtlUserThreadStart+0x21
```
And with `tools/javac/annotations/repeatingAnnotations/combo/TargetAnnoCombo.java` on macosx-aarch64:
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGBUS (0xa) at pc=0x000000010295de98, pid=78752, tid=23555
#
# JRE version: Java(TM) SE Runtime Environment (19.0) (build 19-internal+0-2022-02-08-1034049.tobias.hartmann.jdk2)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (19-internal+0-2022-02-08-1034049.tobias.hartmann.jdk2, mixed mode, tiered, compressed oops, compressed class ptrs, g1 gc, bsd-aarch64)
# Problematic frame:
# V [libjvm.dylib+0x89de98] _ZN14PhaseIdealLoop11do_split_ifEP4NodePP10RegionNodeS4_+0x650
Current CompileTask:
C2: 104626 23310 4 java.net.URI$Parser::parseHierarchical (178 bytes)
Stack: [0x00000001709bc000,0x0000000170bbf000], sp=0x0000000170bbaad0, free space=2042k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
V [libjvm.dylib+0x89de98] _ZN14PhaseIdealLoop11do_split_ifEP4NodePP10RegionNodeS4_+0x650
V [libjvm.dylib+0x70df7c] _ZN14PhaseIdealLoop20split_if_with_blocksER9VectorSetR10Node_Stack+0x11c
V [libjvm.dylib+0x700ec0] _ZN14PhaseIdealLoop18build_and_optimizeE12LoopOptsMode+0x838
V [libjvm.dylib+0x2ca9c4] _ZN14PhaseIdealLoop8optimizeER12PhaseIterGVN12LoopOptsMode+0x108
V [libjvm.dylib+0x2cac24] _ZN7Compile14optimize_loopsER12PhaseIterGVN12LoopOptsMode+0xb0
V [libjvm.dylib+0x2c7734] _ZN7Compile8OptimizeEv+0xef4
V [libjvm.dylib+0x2c59fc] _ZN7CompileC2EP5ciEnvP8ciMethodi7OptionsP12DirectiveSet+0xaa0
V [libjvm.dylib+0x23438c] _ZN10C2Compiler14compile_methodEP5ciEnvP8ciMethodibP12DirectiveSet+0x134
V [libjvm.dylib+0x2d67e4] _ZN13CompileBroker25invoke_compiler_on_methodEP11CompileTask+0x3d4
V [libjvm.dylib+0x2d6378] _ZN13CompileBroker20compiler_thread_loopEv+0x440
V [libjvm.dylib+0x93bea8] _ZN10JavaThread17thread_main_innerEv+0xa0
V [libjvm.dylib+0x93a908] _ZN6Thread8call_runEv+0xe0
V [libjvm.dylib+0x7f19e8] _ZL19thread_native_entryP6Thread+0x158
C [libsystem_pthread.dylib+0x7240] _pthread_start+0x94
-------------
PR: https://git.openjdk.java.net/jdk/pull/7319
More information about the hotspot-compiler-dev
mailing list