RFR: 8290711: assert(false) failed: infinite loop in PhaseIterGVN::optimize
Roland Westrelin
roland at openjdk.org
Mon Aug 22 10:00:54 UTC 2022
In the test case: the loop is an infinite loop but loop optimizations
don't add a NeverBranch node because the loop is reachable from Root
(following Root's inputs) through a null check in the loop body. When
CCP runs, it finds the null check never fails. PhaseCCP::transform()
works through the graph starting from Root and following its inputs.
But because the null check never fails, it doesn't follow the path to
the loop body and it doesn't update the type of nodes in the loop body
(as done in PhaseCCP::transform_once()). That's wrong as the loop body
is not dead. As a consequence, for one CastPP node, its bottom type
and the type recorded in PhaseCCP's type table differ. When igvn runs
next, for some nodes, MemNode::Ideal_common() sees a difference
between the address type recorded by igvn and the one reported by
bottom_type(). That causes memory nodes to be indefinitely
re-enqueued for igvn.
The fix I propose is similar to one Tobias implemented in the valhalla
repo (JDK-8265973). With this fix, all loops are always considered
reachable by PhaseCCP::transform() (which I think, worst case, is only
a waste of compilation time but has no correctness issue). To achieve
that safepoints are collected by CCP before PhaseCCP::transform()
transform() follows inputs from Root and safepoints.
-------------
Commit messages:
- comment
- fix
- test
Changes: https://git.openjdk.org/jdk/pull/9961/files
Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=9961&range=00
Issue: https://bugs.openjdk.org/browse/JDK-8290711
Stats: 110 lines in 3 files changed: 110 ins; 0 del; 0 mod
Patch: https://git.openjdk.org/jdk/pull/9961.diff
Fetch: git fetch https://git.openjdk.org/jdk pull/9961/head:pull/9961
PR: https://git.openjdk.org/jdk/pull/9961
More information about the hotspot-compiler-dev
mailing list