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