RFR: 8347365: C2: Fix the handling of depends_only_on_test

Manuel Hässig mhaessig at openjdk.org
Fri Jan 16 14:47:19 UTC 2026


On Fri, 16 Jan 2026 12:38:56 GMT, Manuel Hässig <mhaessig at openjdk.org> wrote:

>> Hi,
>> 
>> This PR fixes the handling of `depends_only_on_test` when the control graph is transformed. It has to do with the theoretical idea of `depends_only_on_test`, copy from the JBS issue description:
>> 
>> To start with, what is `depends_only_on_test`? Given a node `n` with the control input `c`, if `c` can be deduced from `c'` and `n->depends_only_on_test() == true`, then we can rewire the control input of `n` to `c'`. This means that `depends_only_on_test` does not mean that the node depends on a test, it means that the node depends on the test that is its control input.
>> 
>> For example:
>> 
>>     if (y != 0) {
>>         if (x > 0) {
>>             if (y != 0) {
>>                 x / y;
>>             }
>>         }
>>     }
>> 
>> Then `x/y` `depends_only_on_test` because its control input is the test `y != 0`. Then, we can rewire the control input of the division to the outer `y != 0`, resulting in:
>> 
>>     if (y != 0) {
>>         x / y;
>>         if (x > 0) {
>>         }
>>     }
>> 
>> On the other hand, consider this case:
>> 
>>     if (x > 0) {
>>         if (y != 0) {
>>             if (x > 0) {
>>                 x / y;
>>             }
>>         }
>>     }
>> 
>> Then `x/y` does not `depends_only_on_test` because its control input is the test `x > 0` which is unrelated, we can see that if we rewire the division to the outer `x > 0` test, the division floats above the actual test `y != 0`. This means that `depends_only_on_test` is a dynamic property of a node, and not a static property of the division operation. It can change when we transform the graph and it can be different for different nodes of the same kind.
>> 
>> More details can be found in the description of `Node::depends_only_on_test` and `Node::pin_node_under_control` in this change.
>> 
>> Please take a look and leave your reviews, thanks a lot.
>
> src/hotspot/share/opto/loopopts.cpp line 1724:
> 
>> 1722:         if (!would_sink_below_pre_loop_exit(loop_ctrl, outside_ctrl)) {
>> 1723:           if (n->depends_only_on_test()) {
>> 1724:             // If this node depends_only_on_test, it will be rewire to a control input that is not the correct test
> 
> Suggestion:
> 
>             // If this node depends_only_on_test, it will be rewired to a control input that is not the correct test
> 
> The same applies to the other changes in this file.

Also, "[...] it will be rewired to a control that is dominated by the test it depends on to prevent it later floating above that test." or something along that line might be a bit more informative.

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

PR Review Comment: https://git.openjdk.org/jdk/pull/29158#discussion_r2698411124


More information about the hotspot-compiler-dev mailing list