RFR: 8341977: Replace predicate walking and cloning code for Loop Peeling with a predicate visitor

Christian Hagedorn chagedorn at openjdk.org
Thu Oct 24 11:00:36 UTC 2024


#### Replacing the Remaining Predicate Walking and Cloning Code 
In the next series of patches (this, [JDK-8342943](https://bugs.openjdk.org/browse/JDK-8342943), [JDK-8342945](https://bugs.openjdk.org/browse/JDK-8342945), and [JDK-8342946](https://bugs.openjdk.org/browse/JDK-8342946)) I want to replace the predicate walking and cloning code used for Loop Peeling, Pre/Main/Post Loops, Loop Unswitching, removing useless Assertion Predicates and Loop Unrolling with new `PredicateVisitors` which can be used in combination with the new `PredicateIterator`.

#### Single Template Assertion Predicate Check
This replacement allows us to have a single `TemplateAssertionPredicate::is_predicate()` check that is called for all predicate matching code. This enables the removal of uncommon traps for Template Assertion Predicates with [JDK-8342047](https://bugs.openjdk.org/browse/JDK-8342047) which is a missing piece in order to fix the remaining problems with Assertion Predicates ([JDK-8288981](https://bugs.openjdk.org/browse/JDK-8288981)).

#### Common Refactorings for all the Patches in this Series
In each of the patch, I will do similar refactoring ideas:
- Replace the existing code in the corresponding `PhaseIdealLoop` method with call to a new (or existing) predicate visitor which extends the `PredicateVisitor` interface. 
- The visitor implements the Assertion Predicate `visit()` methods to implement the cloning and initialization of the Template Assertion Predicates.
- The predicate visitor is then passed to the `PredicateIterator` which walks through all predicates found at a loop and applies the visitor for each predicate. 
- The visitor creates new nodes (if there are Template Assertion Predicates) either in place or at the loop entry of a target loop. In the latter case, the calling code of the `PredicateIterator` must make sure to connect the tail of the newly created predicate chain after the old loop entry to the target loop head (see **P1** PR comment).
- Keep the semantics which includes to only apply the Template Assertion Predicate processing if there are Parse Predicates (see **P2** PR comment). This limitation should eventually be removed. But I want to do that separately at a later point.

#### Refactorings of this Patch
This first patch replaces the predicate walking and cloning code for Loop Peeling and lays the foundation for the replacement for main/post loops ([JDK-8342943](https://bugs.openjdk.org/browse/JDK-8342943)) which is quite similar. This patch includes:
- `AssertionPredicatesForLoop` as new prediciate visitor (this class is reused for [JDK-8342943](https://bugs.openjdk.org/browse/JDK-8342943)).
- To correctly rewire data dependencies, we need to check if a node is part of the original loop body or the cloned loop body. To do that, I've introduced an interface `NodeInLoopBody` which is implemented to check if a node is either in the original loop body (`NodeInOriginalLoopBody`) or in the cloned loop body (`NodeInClonedLoopBody`, added with the next patch).

Thanks,
Christian

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

Commit messages:
 - improve comments
 - 8341977: Replace predicate walking and cloning code for Loop Peeling with a predicate visitor

Changes: https://git.openjdk.org/jdk/pull/21679/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=21679&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8341977
  Stats: 199 lines in 4 files changed: 133 ins; 53 del; 13 mod
  Patch: https://git.openjdk.org/jdk/pull/21679.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/21679/head:pull/21679

PR: https://git.openjdk.org/jdk/pull/21679


More information about the hotspot-compiler-dev mailing list