[lworld] RFR: 8369045: [lworld] valhalla/valuetypes/WeakReferenceTest.java has an unschedulable graph [v7]

Tobias Hartmann thartmann at openjdk.org
Fri Dec 19 10:13:52 UTC 2025


On Wed, 17 Dec 2025 15:12:47 GMT, Damon Fenacci <dfenacci at openjdk.org> wrote:

>> # Issue
>> A few test failed intermittently with -Xcomp on Mac due to an unschedulable graph in C2:
>> - valhalla/valuetypes/WeakReferenceTest.java
>> - valhalla/valuetypes/ProxyTest.java
>> - valhalla/valuetypes/ObjectNewInstance.java
>> - valhalla/valuetypes/ObjectMethodsViaCondy.java
>> 
>> # Causes
>> 
>> The origin of the issue seems to be coming from strength reduction (`process_late_inline_calls_no_inline`) where we replace virtual and MH calls with direct calls. 
>> https://github.com/dafedafe/valhalla/blob/75e2dd95df5d847d7d6e35a23016d22705681cf4/src/hotspot/share/opto/compile.cpp#L3072
>> If the return type of the methods are not loaded, we add a call to runtime's `store_inline_type_fields_to_buf` right after the actual method call, to save the scalarized return into a oop. This happens first for the caller at parse time and then for the callee when strength-reducing the virtual call to a direct one. The return projections of the inline fields of the call are added to `store_inline_type_fields_to_buf` and its oop projection is then added as input to the other `store_inline_type_fields_to_buf` which fundamentally leaves the graph around it in an awkward state.
>> 
>> If this happens in combination with loop unswitching it can lead to a graph not being schedulable, which is what happens in the failure of this issue, where we have:
>> * a virtual call with a following `store_inline_type_fields_to_buf` (1) in a loop.
>> * the loop undergoes unswitching, which creates 2 copies of the body (including a copy of the virtual call). All outputs of the new virtual call are phi-d with the one of the other path as input of the `store_inline_type_fields_to_buf`.
>> * the new copy of the virtual call is later replaced with a direct call: the creation of the new direct call adds a `store_inline_type_fields_to_buf` (2) right after the direct call. All the inline type return values of the call being inlined are removed, so the phis now only have one input and are removed by a later GVN pass.
>> <img width="600" alt="Screenshot 2025-11-26 at 10 33 51" src="https://github.com/user-attachments/assets/35e947c2-350e-414f-9d44-72559d480a88" />
>> 
>> * this creates an issue later during GCM since the `store_inline_type_fields_to_buf` (1) call is logically not dominated by any of the 2 sides of the unswitched loop and lands in a separate dominance path of the arguments whose phis have been removed (which are still dominated by the original virtual call).
>> 
>> # Solution
>> 
>> The issue ha...
>
> Damon Fenacci has updated the pull request with a new target base due to a merge or a rebase. The pull request now contains 15 commits:
> 
>  - Merge branch 'lworld' into JDK-8369045
>  - JDK-8369045 remove another test from problemlist
>  - JDK-8369045 remove tests from problemlist
>  - Merge branch 'lworld' into JDK-8369045
>  - Merge branch 'JDK-8369045' of https://github.com/dafedafe/valhalla into JDK-8369045
>  - Update src/hotspot/share/opto/graphKit.cpp
>    
>    Co-authored-by: Tobias Hartmann <tobias.hartmann at oracle.com>
>  - JDK-8369045: don't re-add condition if stress-reducing
>  - Revert "JDK-8369045: remove strength reduction flag"
>    
>    This reverts commit ccf58125b13655bb6c15af747345efbd6791f93d.
>  - JDK-8369045: remove strength reduction flag
>  - JDK-8369045: remove new line
>  - ... and 5 more: https://git.openjdk.org/valhalla/compare/d586e57d...b2c399f4

Looks good to me!

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

Marked as reviewed by thartmann (Committer).

PR Review: https://git.openjdk.org/valhalla/pull/1768#pullrequestreview-3597935279


More information about the valhalla-dev mailing list