RFR: 8350578: Refactor useless Parse and Template Assertion Predicate elimination code by using a PredicateVisitor

Galder Zamarreño galder at openjdk.org
Thu Mar 13 18:15:09 UTC 2025


On Thu, 13 Mar 2025 06:48:26 GMT, Christian Hagedorn <chagedorn at openjdk.org> wrote:

>> This patch cleans the Parse and Template Assertion Predicate elimination code up. We now use a single `PredicateVisitor` and share code in a new `EliminateUselessPredicates` class which contains the code previously found in `PhaseIdealLoop::eliminate_useless_predicates()`.
>> 
>> ### Unified Logic to Clean Up Parse and Template Assertion Predicates
>> We now use the following algorithm:
>> https://github.com/openjdk/jdk/blob/5e4b6ca0ddafa80eee60690caacd257b74305d4e/src/hotspot/share/opto/predicates.cpp#L1174-L1179
>> 
>> This is different from the old algorithm where we used a single boolean state `_useless`. But that does no longer work because when we first mark Template Assertion Predicates useless, we are no longer visiting them when iterating through predicates:
>> 
>> https://github.com/openjdk/jdk/blob/a21fa463c4f8d067c18c09a072f3cdfa772aea5e/src/hotspot/share/opto/predicates.hpp#L704-L708
>> 
>> We therefore require a third state. Thus, I introduced a new tri-state `PredicateState` that provides a special `MaybeUseful` value which we can set each Predicate to.
>> 
>> #### Ignoring Useless Parse Predicates
>> While working on this patch, I've noticed that we are always visiting Parse Predicates - even when they useless. We should change that to align it with what we have for the other Predicates (changed in JDK-8351280). To make this work, we also replace the `_useless` state in `ParsePredicateNode` with a new `PredicateState`.
>> 
>> #### Sharing Code for Parse and Template Assertion Predicates
>> With all the mentioned changes in place, I could nicely share code for the elimination of Parse and Template Assertion Predicates in `EliminateUselessPredicates` by using templates. The following additional changes were required:
>> 
>> - Changing the template parameter of `_template_assertion_predicate_opaques` to the more specific `OpaqueTemplateAssertionPredicateNode` type.
>> - Adding accessor methods to get the Predicate lists from `Compile`.
>> - Updating `ParsePredicate::mark_useless()` to pass in `PhaseIterGVN`, as done for Assertion Predicates
>> 
>> Note that we still do not directly replace the useless Predicates but rather mark them useless as initiated by JDK-8351280.
>> 
>> ### Other Included Changes
>> - During the various refactoring steps, I somehow dropped the code to add newly cloned Template Assertion Predicate to the `_template_assertion_predicate_opaques` list. It was done directly in the old cloning methods. This is not relevant for correctness but could ...
>
> src/hotspot/share/opto/predicates.hpp line 331:
> 
>> 329:   // the ParsePredicateNode is not marked useless.
>> 330:   bool is_valid() const {
>> 331:     return _parse_predicate_node != nullptr && !_parse_predicate_node->is_useless();
> 
> Avoids visiting useless Parse Predicates during Predicate iteration.

When can `_parse_predicate_node` be null?

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

PR Review Comment: https://git.openjdk.org/jdk/pull/24013#discussion_r1994083460


More information about the hotspot-compiler-dev mailing list