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

Reply via email to