On Fri, 29 May 2026 05:59:35 GMT, Christian Hagedorn <[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 exception handler in the 
> current method. Therefore...

Looks reasonable to me.

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

Marked as reviewed by qamai (Committer).

PR Review: 
https://git.openjdk.org/valhalla/pull/2486#pullrequestreview-4387119734

Reply via email to