RFR: 8291599: Assertion in PhaseIdealLoop::skeleton_predicate_has_opaque after JDK-8289127

Roland Westrelin roland at openjdk.org
Thu Aug 25 15:33:59 UTC 2022


In TestPhiInSkeletonPredicateExpression.test1():

- Loop predication adds predicates for the null check of array and the
  array range check. It also adds skeleton predicates in case of
  subsequent unrolling.

- One of the skeleton predicate has the following shape:

(Opaque4 (Bool (CmpUL (AddL (AddL (ConvI2L (LoadI (Phi ...))) (ConvI2L (CastII (AddI (OpaqueLoopInit OpaqueLoopStride))))) -1) ...)))

- Split thru phi pushes the null check through the dominating
  region. The skeleton predicate subgraph is transformed to:

(Opaque4 (Bool (CmpUL (Phi ...) ...)))

- Logic that processes skeleton predicate can no longer find the
  OpaqueLoopInit and OpaqueLoopStride nodes because they are now
  behind a phi. That causes the assert to fire.

The fix I propose is to catch cases where part of a skeleton predicate
expression (a subgraph with a OpaqueLoopInit or OpaqueLoopStride node)
is being split during split if and to clone the entire skeleton
predicate subgraph then.

There's a already logic for that currently but it only triggers if
PhaseIdealLoop::split_up() tries to split an OpaqueLoopInit or
OpaqueLoopStride. In the case here, the OpaqueLoopInit and
OpaqueLoopStride nodes have control above the region at which split if
occurs. So they are never split by PhaseIdealLoop::split_up(). The
AddL nodes in subgraph are.

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

Commit messages:
 - fix
 - test

Changes: https://git.openjdk.org/jdk/pull/10022/files
 Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=10022&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8291599
  Stats: 179 lines in 4 files changed: 153 ins; 23 del; 3 mod
  Patch: https://git.openjdk.org/jdk/pull/10022.diff
  Fetch: git fetch https://git.openjdk.org/jdk pull/10022/head:pull/10022

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


More information about the hotspot-compiler-dev mailing list