RFR: 8336906: C2: assert(bb->is_reachable()) failed: getting result from unreachable basicblock

Manuel Hässig duke at openjdk.org
Thu May 8 13:30:42 UTC 2025


# Issue Summary

This PR addresses an `assert(bb->is_reachable())` that is triggered in the code for `-XX:+VerifyStack` after a deoptimization with reason `null_assert_or_unreached0` at a `getstatic` bytecode. Following the `getstatic` is an `areturn` and then an unreachable bytecode. When the code for `VerifyStack` tries to compute an oop map for the basic block of the unreachable bytecode, the assert triggers:

getstatic Field A.val:"LB"; // if class B is not loaded, C2 deopts with reason "null_assert_or_unreached0"
areturn;
// The following is unreachable
iconst_0;


This is a similar problem to [JDK-8271055](https://bugs.openjdk.org/browse/JDK-8271055) (#7331), but this particular deopt with reason `null_assert_or_unreached0` at `getstatic` of a field containing an object reference [deopts at the next bytecode](https://github.com/openjdk/jdk/blob/ad07426fab3396caefd7c08d924e085c1f6f61ba/src/hotspot/share/opto/parse3.cpp#L176-L199). The aforementioned issue introduced a check to skip stack verification of the next bytecode in the code if the execution after the deopted bytecode does not continue at the next bytecode in the code, i.e. falls through to the next bytecode.  Unfortunately, this check did not include `areturn` as a bytecode that does not fall-through:
https://github.com/openjdk/jdk/blob/ad07426fab3396caefd7c08d924e085c1f6f61ba/src/hotspot/share/runtime/deoptimization.cpp#L845-L856

# Change Summary

To fix the immediate issue described above, this PR adds `areturn` to the list of bytecodes that does not fall through. However, all return bytecodes exhibit the same behavior and might be susceptible to a similar issue. Even though I was not able to reproduce the same crash with `{d,f,i,l}return` because I could not get those or the preceding bytecode to deopt, I also added them to the `falls_through()` function. For the remaining bytecodes in `falls_through()` with the exception of `athrow` I wrote a regression test.

# Testing

- [x] [Github Actions](https://github.com/mhaessig/jdk/actions/runs/14595928439)
- [ ] tier1 through tier3 on Oracle supported platforms and OSs plus Oracle internal testing

# Acknowledgements
Special thanks to @eme64 for his hard work on reducing a reproducer that works on all platforms.

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

Commit messages:
 - Mark more bytecodes as non-fallthrough
 - Add regression tests for non-fallthrough bytecodes

Changes: https://git.openjdk.org/jdk/pull/25118/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=25118&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8336906
  Stats: 232 lines in 5 files changed: 227 ins; 2 del; 3 mod
  Patch: https://git.openjdk.org/jdk/pull/25118.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/25118/head:pull/25118

PR: https://git.openjdk.org/jdk/pull/25118


More information about the hotspot-dev mailing list