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

Roland Westrelin roland at openjdk.org
Tue Mar 18 13:49:10 UTC 2025


On Fri, 14 Mar 2025 10:32:01 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 ...
>
> Christian Hagedorn has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Introduce predicates_enums.hpp

Looks good to me.

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

Marked as reviewed by roland (Reviewer).

PR Review: https://git.openjdk.org/jdk/pull/24013#pullrequestreview-2694628566


More information about the hotspot-compiler-dev mailing list