RFR: 8351392: C2 crash: failed: Expected Bool, but got OpaqueMultiversioning
Emanuel Peter
epeter at openjdk.org
Fri Mar 7 11:39:59 UTC 2025
On Fri, 7 Mar 2025 11:26:39 GMT, Christian Hagedorn <chagedorn at openjdk.org> wrote:
>> With https://github.com/openjdk/jdk/pull/23865 I mark the `OpaqueMultiversioning` useless once there are no loops for the multiversioning any more. The idea was that this way the `multiversion_if` would be folded away once the loops are gone, and then we should not encounter the `OpaqueMultiversioning` in `PhaseIdealLoop::conditional_move`.
>>
>> But there is a case where we do not remove the `OpaqueMultiversioning` fast enough, see the attached regression test:
>> - The loops disappear during IGVN.
>> - At the beginning of the next loop-opts we mark the `OpaqueMultiversioning` as useless.
>> - Later during loop-opts we encounter the useless `OpaqueMultiversioning` in `PhaseIdealLoop::conditional_move`, and assert.
>> - But in the IGVN after this loop-opts phase we would have constant folded the `OpaqueMultiversioning` and `multiversion_if` anyway... we just did not get there fast enough ;)
>>
>> Hence I propose to just create an explicit bailout for useless `OpaqueMultiversioning` nodes in `PhaseIdealLoop::conditional_move`.
>
> src/hotspot/share/opto/loopopts.cpp line 794:
>
>> 792: return nullptr;
>> 793: }
>> 794: if (bol->is_OpaqueMultiversioning() && bol->as_OpaqueMultiversioning()->is_useless()) {
>
> Isn't any `OpaqueMultiversioning` we find here supposed to be useless? Can we assert that instead?
That is essencially what we I already do. If we find a **useful** node, then we just hit the assert further down.
But if you want then I can refactor it explicitly.
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/23943#discussion_r1984916090
More information about the hotspot-compiler-dev
mailing list