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