> # 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 happens only when strength-reducing to a direct ca...

Damon Fenacci has updated the pull request with a new target base due to a 
merge or a rebase. The pull request now contains 16 commits:

 - Merge branch 'lworld' into JDK-8369045
 - 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 <[email protected]>
 - 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
 - ... and 6 more: https://git.openjdk.org/valhalla/compare/6886e815...ab535b4d

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

Changes: https://git.openjdk.org/valhalla/pull/1768/files
  Webrev: https://webrevs.openjdk.org/?repo=valhalla&pr=1768&range=07
  Stats: 70 lines in 5 files changed: 27 ins; 8 del; 35 mod
  Patch: https://git.openjdk.org/valhalla/pull/1768.diff
  Fetch: git fetch https://git.openjdk.org/valhalla.git pull/1768/head:pull/1768

PR: https://git.openjdk.org/valhalla/pull/1768

Reply via email to