RFR: 8290711: assert(false) failed: infinite loop in PhaseIterGVN::optimize [v5]
Vladimir Kozlov
kvn at openjdk.org
Thu Aug 25 17:47:33 UTC 2022
On Wed, 24 Aug 2022 11:55:33 GMT, Roland Westrelin <roland at openjdk.org> wrote:
>> 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.
>
> Roland Westrelin has updated the pull request incrementally with one additional commit since the last revision:
>
> reworded comment
Testing passed.
-------------
Marked as reviewed by kvn (Reviewer).
PR: https://git.openjdk.org/jdk/pull/9961
More information about the hotspot-compiler-dev
mailing list