In MinLNode::add_ring() we wrongly take the MIN2() of the _widen instead of MAX2() which leads to an endless compilation with the attached Java Fuzzer test because we never reach a fixed point in CCP.
We eventually hit the MemLimit of 1GB and crash with a debug build because we keep creating new types.
To reproduce:
$ java -XX:CompileCommand=compileonly,*Test*::* -Xcomp Test.java
$ -XX:CompileCommand=compileonly,*Reduced*::* -Xcomp Reduced.java
For quicker crash, set memlimit to a lower value like 1m:
$ -XX:CompileCommand=compileonly,*Reduced*::* -Xcomp -XX:CompileCommand=memlimit,*.*,1m~crash Reduced.java
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  Internal Error (/opt/mach5/mesos/work_dir/slaves/82441f27-1222-4bbe-ad17-e607ee550c54-S61/frameworks/1735e8a2-a1db-478c-8104-60c8b0af87dd-0196/executors/20dd5f16-3048-4958-b70d-13ddc6ef4b86/runs/c1649dc7-2974-4ac7-a57f-1a5d0a465d29/workspace/open/src/hotspot/share/compiler/compilationMemoryStatistic.cpp:568), pid=3119046, tid=3119064
#  fatal error: c2 Test::mainTest(([Ljava/lang/String;)V): Hit MemLimit (limit: 1073741824 now: 1073746024)
#
# JRE version: Java(TM) SE Runtime Environment (24.0) (fastdebug build 24-internal-2024-11-09-0602259.alan.bateman.jdk)
............
Command Line: -Xmx1G -XX:+IgnoreUnrecognizedVMOptions -XX:CompileCommand=quiet -XX:CompileCommand=compileonly,*Test*::* -Xcomp -XX:MaxRAMPercentage=4.16667 -Dtest.boot.jdk=/opt/mach5/mesos/work_dir/jib-master/install/jdk/23/37/bundles/linux-x64/jdk-23_linux-x64_bin.tar.gz/jdk-23 -Djava.io.tmpdir=/opt/mach5/mesos/work_dir/slaves/ccd15758-3c17-44a6-a32a-40698b0633d8-S4684/frameworks/1735e8a2-a1db-478c-8104-60c8b0af87dd-0196/executors/6f8a6b69-712b-4c46-8022-383d049cbc08/runs/ada53426-be6b-4cb8-bf7e-519713cb3ef5/testoutput/test-support/jtreg_closed_test_hotspot_jtreg_applications_javafuzzer_BigTest_java/tmp Test
...........
Current CompileTask:
C2:19646   43    b  4       Test::mainTest (804 bytes)
Stack: [0x00007f3e09677000,0x00007f3e09777000],  sp=0x00007f3e097713b0,  free space=1000k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
V  [libjvm.so+0x1937fa8]  VMError::report_and_die(int, char const*, char const*, __va_list_tag*, Thread*, unsigned char*, void*, void*, char const*, int, unsigned long)+0x488  (compilationMemoryStatistic.cpp:568)
V  [libjvm.so+0xafba15]  report_fatal(VMErrorType, char const*, int, char const*, ...)+0x105  (debug.cpp:214)
V  [libjvm.so+0xa18453]  CompilationMemoryStatistic::on_arena_change(long, Arena const*)+0x3e3  (compilationMemoryStatistic.cpp:568)
V  [libjvm.so+0x60c2ac]  Arena::grow(unsigned long, AllocFailStrategy::AllocFailEnum)+0x10c  (arena.cpp:308)
V  [libjvm.so+0x60c51b]  Arena::Arealloc(void*, unsigned long, unsigned long, AllocFailStrategy::AllocFailEnum)+0x1bb  (arena.hpp:134)
V  [libjvm.so+0xbc321f]  Dict::Insert(void*, void*, bool)+0x12f  (dict.cpp:173)
V  [libjvm.so+0x1874ac4]  Type::hashcons()+0x164  (type.cpp:763)
V  [libjvm.so+0x15b65f2]  PhaseCCP::analyze()+0x2d2  (phaseX.cpp:1818)
V  [libjvm.so+0xa3ea84]  Compile::Optimize()+0x794  (compile.cpp:2408)
V  [libjvm.so+0xa42d4f]  Compile::Compile(ciEnv*, ciMethod*, int, Options, DirectiveSet*)+0x1b6f  (compile.cpp:852)
V  [libjvm.so+0x88ba85]  C2Compiler::compile_method(ciEnv*, ciMethod*, int, bool, DirectiveSet*)+0x1d5  (c2compiler.cpp:142)
V  [libjvm.so+0xa4edd8]  CompileBroker::invoke_compiler_on_method(CompileTask*)+0x928  (compileBroker.cpp:2319)
V  [libjvm.so+0xa4fb18]  CompileBroker::compiler_thread_loop()+0x528  (compileBroker.cpp:1977)
V  [libjvm.so+0xf102bc]  JavaThread::thread_main_inner()+0xcc  (javaThread.cpp:772)
V  [libjvm.so+0x1851826]  Thread::call_run()+0xb6  (thread.cpp:232)
V  [libjvm.so+0x1531f88]  thread_native_entry(Thread*)+0x128  (os_linux.cpp:858)