RFR: 8369735: [Leyden] AOT compiled methods have lower peak performance
    Aleksey Shipilev 
    shade at openjdk.org
       
    Thu Oct 16 12:59:53 UTC 2025
    
    
  
On Thu, 16 Oct 2025 12:50:35 GMT, Aleksey Shipilev <shade at openjdk.org> wrote:
> This should get us back on track with peak performance.
> 
> Recently, I fixed the recent regression in compilation times: https://github.com/openjdk/leyden/commit/b8cfee49c6cb60225b13cbe3dc57a37975125385 -- caused by https://github.com/openjdk/leyden/commit/7b7648a4c9f67be509c6fccbcbc0502648388fdc. In doing so, I dropped the `is_initialized()` check from `notice_jit_observation()`, because I noticed it filtered out too many dependencies. So the net result was that our dependencies are now _overly conservative_, which means our JIT compilation times are great, but we are stuck in AP4 code without switching to A4. I instantiated the check back.
> 
> _That_ gets us back to original regression I have been fixing (https://github.com/openjdk/leyden/commit/7b7648a4c9f67be509c6fccbcbc0502648388fdc), so I took another look what goes wrong there. And I think I figured it out: most of the uncommon traps are from `invokedynamic` call-sites that get uncommon-trapped (at `Parse::can_not_compile_call_site`) in A4 code, I believe because LF invokers (like `j.l.invoke.Invokers$Holder`) are _not fully initialized_ in assembly phase! Oops. So I added the code that reports core JLI classes as fully initialized for A4 code, which I believe they are in production run. This seems to stop premature AP4 -> A4 switch in all workloads I tried.
> 
> Plus, I took Vladimir's patch to replace AP4 -> A4 code even when there are no clinit barriers. We reasoned it is a right thing to do, because AP4 is compiled without uncommon traps and other speculations. This whole ordeal shows that AP4 is indeed significantly slower than A4.
> 
> Additional testing:
>  - [ ] Benchmarks, see comments
>  - [x] Linux x86_64 server fastdebug, `runtime/cds`
Ioi's original reproducer (JavacBench2) shows recovery:
# ======= Before
# --- No AOT
Compiled 100 files 50 times in 12031 ms
...
 47 = 19.609 ms  5.100 files per ms
 48 = 19.576 ms  5.108 files per ms
 49 = 19.429 ms  5.147 files per ms
# --- AOT
Compiled 100 files 50 times in 13705 ms
...
 47 = 26.709 ms  3.744 files per ms
 48 = 26.801 ms  3.731 files per ms
 49 = 26.336 ms  3.797 files per ms
# ======= After
# --- No AOT
Compiled 100 files 50 times in 11606 ms
...
 47 = 18.895 ms  5.292 files per ms
 48 = 18.882 ms  5.296 files per ms
 49 = 19.193 ms  5.210 files per ms
# --- AOT
Compiled 100 files 50 times in 10976 ms
...
 47 = 21.640 ms  4.621 files per ms
 48 = 20.937 ms  4.776 files per ms
 49 = 21.238 ms  4.708 files per ms
-------------
PR Comment: https://git.openjdk.org/leyden/pull/103#issuecomment-3410770635
    
    
More information about the leyden-dev
mailing list