RFR(XS): CTW: C2 compilation fails with "malformed control flow"

Vladimir Ivanov vladimir.x.ivanov at oracle.com
Wed Jan 29 13:45:05 UTC 2020


> http://cr.openjdk.java.net/~roland/8237951/webrev.00/

Looks good.

Best regards,
Vladimir Ivanov

> CatchNode::Value() makes the fallthrough path of a virtual or interface
> call dead if the receiver is null. This failure occurs because the
> fallthrough is erroneously killed during CCP. When CCP is executed, the
> type of the receiver is first set to top which causes CatchNode::Value()
> to make the fallthrough path dead then the type of the receiver changes
> to non null but the CatchNode is not reprocessed by CCP. That happens
> because:
> 
> 1758         // If we changed the receiver type to a call, we need to revisit
> 1759         // the Catch following the call.  It's looking for a non-NULL
> 1760         // receiver to know when to enable the regular fall-through path
> 1761         // in addition to the NullPtrException path
> 1762         if (m->is_Call()) {
> 1763           for (DUIterator_Fast i2max, i2 = m->fast_outs(i2max); i2 < i2max; i2++) {
> 1764             Node* p = m->fast_out(i2);  // Propagate changes to uses
> 1765             if (p->is_Proj() && p->as_Proj()->_con == TypeFunc::Control && p->outcnt() == 1) {
> 1766               worklist.push(p->unique_out());
> 
> the ProjNode has more than one use: a Load is pinned there. I could
> write a test case that causes a Load to be pinned on a Proj after a Call
> but couldn't have the test case trigger the failure (most likely because
> node processing order during CCP matters). The fix is to enqueue the
> CatchNode even if p doesn't have a single use.
> 
> Note: this triggered with Shenandoah but is not specific to Shenandoah.
> 
> Roland.
> 


More information about the hotspot-compiler-dev mailing list