Invalid code generated by C2 compiler in OpenJDK 21

Antoine DESSAIGNE antoine.dessaigne at
Fri Dec 15 10:12:15 UTC 2023

Hello everyone,

I've found an issue while migrating to OpenJDK 21. A valued local variable
(effectively final) has its value removed and it throws a
NullPointerException. Unfortunately, I cannot provide the source code and
the data to reproduce the issue, and I couldn't create a smaller code
snippet to show the issue. That said, I'll happily show the code and
perform many tests during calls.

Here's what I did so far to diagnose the issue.

I bisected the repository to find where the regression comes from. I found
this commit 3696711efa5 [1] but it's a merge so I bisected the branch and
found 10737e168c9 [2]. Looking at this commit, I have no idea how it could
introduce this kind of regression.

Then, thanks to the guidance from Aleksey Shipilëv, I tested many things
* Issue does *not* happen with the following
flags: -Xint, -XX:-TieredCompilation, -XX:TieredStopAtLevel=1,
-XX:TieredStopAtLevel=2, -XX:TieredStopAtLevel=3
* Issue also happens with fastdebug builds of OpenJDK, without crashing due
to assertions
* Issue still happens in the latest version of the code (commit b31454e3623)
* Issue happens no matter which GC is used, I tried SerialGC, ParallelGC,
G1GC, and ShenandoahGC

The tests were performed in Docker containers running on 4 different hosts.

Therefore it looks like C2 is generating an invalid assembly code.
Unfortunately, I'm not great with assembly and the generated assembly is
quite big (main code is around 20k).

Do you have an idea of why this is happening? Do you know what test I can
run? If one of you is available, we can schedule calls for me to show you
the code and my tests. Thank you very much for your assistance.

Have a nice day,


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <>

More information about the compiler-dev mailing list