On Fri, 29 May 2026 06:22:19 GMT, Quan Anh Mai <[email protected]> wrote:
>> ### Mismatching Stack Sizes During Late Inlining >> The re-enabled assert and some tests in `TestNullableInlineTypes` fail with >> a stack mismatch assert when trying to combine exception states when >> replacing the non-static `CallStaticJava` node in `GraphKit::replace_call()` >> for a just late inlined call with the actual result . In `test84()`, for >> example, we have one exception state with the JVM expression stack pointer >> (later referred to as just "stack pointer") set to 1 and the other set to 0. >> This means that we throw from two different paths with unequal stack sizes >> which is a problem. >> >> ### Reason for Stack Size Mismatch >> At the time of the assertion failure, we compare two states from two >> exception safepoints: >> 1. `builtin_throw()` from a null check from an ordinary field access in the >> callee (currently being late inlined): >> https://github.com/openjdk/valhalla/blob/4c23f0ed5d6a89cd1e7ab8550b367bca296a9f30/src/hotspot/share/opto/graphKit.cpp#L1543-L1544 >> We clear the stack due to not having an exception handler: >> https://github.com/openjdk/valhalla/blob/931493bdedd35731569225e1a5c644fbeeea6372/src/hotspot/share/opto/graphKit.cpp#L614-L619 >> 2. `builtin_throw()` from the receiver null check before the non-static call >> to the callee (i.e. still in the caller). We have an exception handler and >> thus do not clear the stack as for `1.`. We have all the arguments on the >> stack: >> https://github.com/openjdk/valhalla/blob/4c23f0ed5d6a89cd1e7ab8550b367bca296a9f30/src/hotspot/share/opto/graphKit.hpp#L692-L694 >> >> This explains the different stack sizes. >> >> When we have an exception handler in the callee, we would already handle the >> exception states in `Parse::do_exceptions()` and do not need to combine them >> in the caller after the callee was late inlined. >> >> ### Why Is this not Causing more Problems? >> This seems to be quite a common case to have different stack size, so why >> don't we hit more problems? First, we notice that when we normally add a new >> exception state, we combine states only when stack sizes are equal: >> https://github.com/openjdk/valhalla/blob/931493bdedd35731569225e1a5c644fbeeea6372/src/hotspot/share/opto/graphKit.cpp#L304-L308 >> >> We only combine exception states with different stack sizes when calling >> `combine_exception_states()` from `combine_and_pop_all_exception_states()`. >> This happens at two places: >> - `Compile::rethrow_exceptions()`: When we still have exceptions states when >> calling this method, it means that there is no except... > > Looks reasonable to me. Thanks @merykitty for your review! ------------- PR Comment: https://git.openjdk.org/valhalla/pull/2486#issuecomment-4571524078
