RFR: 8335708: C2: assert(!dead_nodes) failed: using nodes must be reachable from root

Emanuel Peter epeter at openjdk.org
Mon Mar 17 06:52:54 UTC 2025


On Mon, 17 Mar 2025 06:45:13 GMT, Emanuel Peter <epeter at openjdk.org> wrote:

>> In CCP, we transform the nodes going up (toward inputs) starting from root and safepoints because infinite loops can be reachable from the root, but not co-reachable from the root, that is one can follow def-use from root to the loop, but not the use-def from root to loop. For more details, see:
>> https://github.com/openjdk/jdk/blob/4cf63160ad575d49dbe70f128cd36aba22b8f2ff/src/hotspot/share/opto/phaseX.cpp#L2063-L2070
>> 
>> Since we are specifically marking nodes as useful if they are above a safepoint, the check that no dead nodes must be there anymore must also consider nodes above a safepoint as alive: the same criterion must apply. We should nevertheless not start from a safepoint killed by CCP.
>> 
>> About the test, I use this trick found in `TestInfiniteLoopCCP` because I indeed need a really infinite loop, but I want a terminating test. The crash is not deterministic, as it needs StressIGVN, so I did a bit of stats. Using a little helper script, on 100 runs, 69 runs fail as in the JBS ticket and 31 are successful (so 0 fail in another way). After the fix, I find 100 successes.
>> 
>> And thanks to @eme64  who extracted such a concise reproducer.
>
> src/hotspot/share/opto/compile.cpp line 4206:
> 
>> 4204:   uint stack_size = live_nodes() >> 4;
>> 4205:   Node_List nstack(MAX2(stack_size, (uint) OptoNodeListSize));
>> 4206:   if (root_and_safepoints != nullptr) {
> 
> Can you say in which cases we don't have `root_and_safepoints`? Why is it ok not to also start at SafePoint in those cases?

I think you should also say that we start the traversal from Root and Safepoints, just like during CCP.

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

PR Review Comment: https://git.openjdk.org/jdk/pull/23977#discussion_r1998043895


More information about the hotspot-compiler-dev mailing list