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