RFR(S): 8232539: SIGSEGV in C2 Node::unique_ctrl_out
Vladimir Kozlov
vladimir.kozlov at oracle.com
Wed Nov 6 18:05:40 UTC 2019
I am fine with this conservative fix (bailout optimization). It is good that performance is not affected.
Thanks,
Vladimir
On 11/5/19 1:01 AM, Tobias Hartmann wrote:
> Performance results look good.
>
> Best regards,
> Tobias
>
> On 04.11.19 08:25, Tobias Hartmann wrote:
>> Hi Roland,
>>
>> this seems reasonable to me but I'm concerned that it might cause performance regressions. I'll run
>> some tests in our system.
>>
>> Best regards,
>> Tobias
>>
>> On 23.10.19 10:50, Roland Westrelin wrote:
>>>
>>> http://cr.openjdk.java.net/~roland/8232539/webrev.00/
>>>
>>> I couldn't come up with a test case because node processing order during
>>> IGVN matters. Bug was reported against 11 but I see no reason it
>>> wouldn't apply to current code as well.
>>>
>>> At parse time, predicates are added by
>>> Parse::maybe_add_predicate_after_if() but not loop is actually
>>> created. Compile::_major_progress is cleared. On the next round of IGVN,
>>> one input of a region points to predicates. The same region has an if as
>>> use that can be split through phi during IGVN. The predicates are going
>>> to be removed by IGVN. But that happens in multiple steps because there
>>> are several predicates (for reason Deoptimization::Reason_predicate,
>>> Deoptimization::Reason_loop_limit_check etc.) and because for each
>>> predicate one IGVN iteration must first remove the Opaque1 node, then
>>> another kill the IfFalse projection, finally another replace the IfTrue
>>> projection by the If control input.
>>>
>>> Split if occurs while predicates are in the process of being removed. It
>>> sees predicates, tries to walk over them, encounters a predicates that's
>>> been half removed (false projection removed) and we hit the assert/crash.
>>>
>>> I propose we simply not apply IGVN split if if we're splitting through a
>>> loop or if there's a predicate input to a region because:
>>>
>>> - Making split if robust to dying predicates is not straightforward as
>>> far as I can tell
>>>
>>> - Loop opts split if doesn't split through loop header so why would it
>>> make sense for IGVN split if?
>>>
>>> - I'm wondering if there are other cases where handling of predicates in
>>> split if could be wrong (and so more trouble ahead):
>>>
>>> + What if we split through a Loop region, predicates were added by
>>> loop optimizations, loop opts are now over so the predicates added at
>>> parse time were removed: then PhaseIdealLoop::find_predicate()
>>> wouldn't report a predicate but cloning predicates would still be
>>> required for correctness?
>>>
>>> + What if we have no loop, a region has predicates as input,
>>> predicates are going to die but have not yet been processed, split if
>>> uselessly duplicates predicates but one of then is control dependent
>>> on the branch it is in so cloning predicates actually causes a broken
>>> graph?
>>>
>>> So overall it feels safer to me to simply bail out from split if for
>>> loops/predicates.
>>>
>>> Roland.
>>>
More information about the hotspot-compiler-dev
mailing list