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