RFR(S): 8205107: assert(c->Opcode() == Op_SafePoint) failed: broken outer loop

Nils Eliasson nils.eliasson at oracle.com
Tue Jun 19 14:22:27 UTC 2018


I looked at it in a bit more detail.

The call is a java/lang/Integer::valueOf that is considered a macro node 
so it is kept around until macro expansion which happens after the place 
where we hit the assert. So the call will go away.

However SafepointNode::Identity does check:

if( n0->is_Call() && n0->as_Call()->guaranteed_safepoint() ) {
       // Useless Safepoint, so remove it

And CallNode::guaranteed_safepoint() is:

   // Are we guaranteed that this node is a safepoint?  Not true for leaf calls and
   // for some macro nodes whose expansion does not have a safepoint on the fast path.
   virtual bool        guaranteed_safepoint()  { return true; }

No check for call/macro-nodes is implemeted despite the comment! If I 
fix this the problem goes away.

// Nils



On 2018-06-18 15:41, Roland Westrelin wrote:
>> Roland, why we need to keep Safepoint in Outer loop if we have call?
> I double checked with a simple test case and we don't keep the safepoint
> if there's a call so it's indeed strange that we would need Nils' patch.
>
> Roland.



More information about the hotspot-compiler-dev mailing list