RFR: 8290711: assert(false) failed: infinite loop in PhaseIterGVN::optimize [v4]
Vladimir Kozlov
kvn at openjdk.org
Tue Aug 23 23:46:30 UTC 2022
On Tue, 23 Aug 2022 15:41:25 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:
>
> move _safepoints declaration
Should we add `NeverBranch` if the only exit is never taken (CCP folds it)?
Or it is done already for such loops later after CCP?
src/hotspot/share/opto/phaseX.cpp line 1964:
> 1962:
> 1963: // This CCP pass may prove that no exit test for a loop ever succeeds (i.e. the loop is infinite). In that case,
> 1964: // the logic below doesn't follow any path from Root to the loop body (they are proven never taken). If CCP only works
May be clarify that "any path from Root's inputs". Because any such loop is reachable from Root's uses/outputs.
-------------
PR: https://git.openjdk.org/jdk/pull/9961
More information about the hotspot-compiler-dev
mailing list