RFR: 8350578: Refactor useless Parse and Template Assertion Predicate elimination code by using a PredicateVisitor [v2]
Christian Hagedorn
chagedorn at openjdk.org
Fri Mar 14 10:32:01 UTC 2025
> 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 hinder some optimizations. I've added the code now i...
Christian Hagedorn has updated the pull request incrementally with one additional commit since the last revision:
Introduce predicates_enums.hpp
-------------
Changes:
- all: https://git.openjdk.org/jdk/pull/24013/files
- new: https://git.openjdk.org/jdk/pull/24013/files/a5611e3e..1508a3be
Webrevs:
- full: https://webrevs.openjdk.org/?repo=jdk&pr=24013&range=01
- incr: https://webrevs.openjdk.org/?repo=jdk&pr=24013&range=00-01
Stats: 150 lines in 6 files changed: 82 ins; 58 del; 10 mod
Patch: https://git.openjdk.org/jdk/pull/24013.diff
Fetch: git fetch https://git.openjdk.org/jdk.git pull/24013/head:pull/24013
PR: https://git.openjdk.org/jdk/pull/24013
More information about the hotspot-compiler-dev
mailing list