When running with `-XX:+DeoptimizeNMethodBarriersALot` (done in stress jobs), 
we could occasionally take the slow path in the nmethod stub entry barrier 
which does not directly deoptimize the nmethod but just simulate the 
indirection over the stubs:
https://github.com/openjdk/valhalla/blob/a180fefdd8f427c647f3a4f3a4bc937207d1fe72/src/hotspot/share/gc/shared/barrierSetNMethod.cpp#L198-L209

In `deoptimize()`, we make sure to jump to the "handle wrong method" stub:
https://github.com/openjdk/valhalla/blob/a180fefdd8f427c647f3a4f3a4bc937207d1fe72/src/hotspot/cpu/x86/gc/shared/barrierSetNMethod_x86.cpp#L149-L152

which calls into the VM to `SharedRuntime::handle_wrong_method()`. In this 
method, we try to reresolve the call site:
https://github.com/openjdk/valhalla/blob/a180fefdd8f427c647f3a4f3a4bc937207d1fe72/src/hotspot/share/runtime/sharedRuntime.cpp#L1608-L1609

We also try to find out if the call was optimized or not by setting the 
out-parameter `is_optimized`. However, when we find that the caller is already 
deoptimized (which can happen more often when additionally running with 
`-XX:+DeoptimizeALot`), we will not set `is_optimized`:
https://github.com/openjdk/valhalla/blob/c4030c8fbc80ff691e1d129c9ad8fabe9282969c/src/hotspot/share/runtime/sharedRuntime.cpp#L1795-L1800

This is wrongly adpated from mainline where we are only concerned about 
updating the IC. There it makes sense to skip the code below when the caller is 
already deoptimized.

#### Solution
I therefore propose to change the code to set `is_optimized`, regardless 
whether the caller is deoptimized or not, when the caller is scalarized and the 
callee has a scalarized receiver. This avoids wrongly skipping a buffer 
allocation.

Additional changes:
- I also removed the `is_static_call` out-parameter of `reresolve_call_site()`- 
we can directly set that via the `callee_method` in `handle_wrong_method()`. I 
added a sanity assert in `reresolve_call_site()` that we would get the same 
result.
- Renamed `caller_is_c1` to `caller_does_not_scalarize` in the header file 
which was missed in a prior renaming.
- There are two remaining issues:
  - Issues with virtual threads (tracking issue: 
[JDK-8370177](https://bugs.openjdk.org/browse/JDK-8370177)) -> I disabled 
virtual threads in the test to reduce noise.
  - Problems on AArch64 with the framepointer (tracking issue: 
[JDK-8367151](https://bugs.openjdk.org/browse/JDK-8367151))

Thanks,
Christian

-------------

Commit messages:
 - 8367258: [lworld] Crash with -XX:+DeoptimizeNMethodBarriersALot due to 
wrongly skipping buffering of inline type receiver

Changes: https://git.openjdk.org/valhalla/pull/1735/files
  Webrev: https://webrevs.openjdk.org/?repo=valhalla&pr=1735&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8367258
  Stats: 41 lines in 3 files changed: 15 ins; 4 del; 22 mod
  Patch: https://git.openjdk.org/valhalla/pull/1735.diff
  Fetch: git fetch https://git.openjdk.org/valhalla.git pull/1735/head:pull/1735

PR: https://git.openjdk.org/valhalla/pull/1735

Reply via email to