C1 crash in LinearScan::eliminate_spill_moves
Eirik Bjørsnøs
eirbjo at gmail.com
Fri Feb 5 09:51:33 UTC 2021
Hi,
While developing a Java agent which does some instrumentation, I'm
observing the following C1 compilation crash quite reliably on 11, 15 and
17:
Current CompileTask:
C1: 1468 434 ! 3 org.jaxen.saxpath.base.Verifier::isXMLLetter
(7201 bytes)
Stack: [0x000070000f92d000,0x000070000fa2d000], sp=0x000070000fa2c3e0,
free space=1020k
Native frames: (J=compiled Java code, A=aot compiled Java code,
j=interpreted, Vv=VM code, C=native code)
V [libjvm.dylib+0x1fb1d0] LinearScan::eliminate_spill_moves()+0x230
V [libjvm.dylib+0x203ae0] LinearScan::do_linear_scan()+0xc0
V [libjvm.dylib+0x197093] Compilation::emit_lir()+0x213
V [libjvm.dylib+0x197dee] Compilation::compile_java_method()+0x29e
V [libjvm.dylib+0x1980cc] Compilation::compile_method()+0x11c
V [libjvm.dylib+0x1984ee] Compilation::Compilation(AbstractCompiler*,
ciEnv*, ciMethod*, int, BufferBlob*, DirectiveSet*)+0x22e
V [libjvm.dylib+0x199bde] Compiler::compile_method(ciEnv*, ciMethod*,
int, DirectiveSet*)+0x5e
V [libjvm.dylib+0x2d8292]
CompileBroker::invoke_compiler_on_method(CompileTask*)+0x5b2
V [libjvm.dylib+0x2d7bb2] CompileBroker::compiler_thread_loop()+0x4c2
With a Java 17 fastdebug build, I observe this assertion fail:
V [libjvm.dylib+0x123e8dd] VMError::report_and_die(int, char const*, char
const*, __va_list_tag*, Thread*, unsigned char*, void*, void*, char const*,
int, unsigned long)+0x6cd
V [libjvm.dylib+0x123eefb] VMError::report_and_die(Thread*, void*, char
const*, int, char const*, char const*, __va_list_tag*)+0x3b
V [libjvm.dylib+0x62a7ad] report_vm_error(char const*, int, char const*,
char const*, ...)+0xdd
V [libjvm.dylib+0x42c132] LIR_OprFact::virtual_register(int,
BasicType)+0x132
V [libjvm.dylib+0x4692a7] MoveResolver::insert_move(Interval*,
Interval*)+0x1e7
V [libjvm.dylib+0x469800] MoveResolver::resolve_mappings()+0x250
V [libjvm.dylib+0x469f02] MoveResolver::move_insert_position(LIR_List*,
int)+0x72
V [libjvm.dylib+0x46d40b] LinearScanWalker::insert_move(int, Interval*,
Interval*)+0x26b
V [libjvm.dylib+0x470ba1] LinearScanWalker::activate_current()+0x371
V [libjvm.dylib+0x46c682] IntervalWalker::walk_to(int)+0xe2
V [libjvm.dylib+0x45963d] LinearScan::allocate_registers()+0x4ad
V [libjvm.dylib+0x46298d] LinearScan::do_linear_scan()+0x46d
V [libjvm.dylib+0x3c2630] Compilation::emit_lir()+0x150
V [libjvm.dylib+0x3c3694] Compilation::compile_java_method()+0x344
Some context:
As seen in the Java source file [1] for the class, the uninstrumented
method is quite large and has an unusual number of returns per instruction.
The agent is basically a code coverage instrumenter which inserts a local
variable per line of code in the beginning of the method, increments the
count on each line number and reports the total counts by calling methods
in a catch block.
To reduce the amount of instrumented code, the agent also replaces *RETURN
instructions with GOTOs to a common target where the count reporting
happens. The catch handler also jumps to this target.
If I limit the number of code lines which are allowed to be instrumented,
the compilation no longer crashes. So seems to be related to code size /
complexity somehow.
I can provide core files on request.
Cheers,
Eirik.
[1]
https://github.com/jenkinsci/jaxen/blob/V_1_1_6_Final/src/java/main/org/jaxen/saxpath/base/Verifier.java#L95
More information about the hotspot-compiler-dev
mailing list