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

Vladimir Kozlov vladimir.kozlov at oracle.com
Wed Jun 20 19:33:19 UTC 2018


On 6/20/18 12:22 PM, Nils Eliasson wrote:
> 
> 
> On 2018-06-20 18:32, Vladimir Kozlov wrote:
>> On 6/20/18 2:01 AM, Nils Eliasson wrote:
>>> I simplified it to:
>>>
>>>    virtual bool guaranteed_safepoint() {
>>>        // Calls to boxing methods will be expanded, and safepoints 
>>> aren't guaranteed
>>>        return !is_boxing_method();
>>>    }
>>>
>>> is_boxing_method() checks is_macro() that checks the Flag_is_macro 
>>> which is only set when C->eliminate_boxing() is true.
>>
>> Okay.
>>
>>>
>>> "(proj_out_or_null(TypeFunc::Parms) == NULL));" seems redundant too 
>>> me. What would that guard against?
>>
>> It checks that result of the call is not used (Box object is 
>> eliminated by EA). It is needed otherwise you will get bad graph.
> 
> We don't need that check since we prevent an optimization for happening. 
> The graph is kept as it is.

So the result is only used by Safepoint? Then how it is eliminated later?

Hmm, may be check _is_scalar_replaceable instead.

Vladimir

> 
> This is the graph:
> 
> Integer.valueOf
>      |
> CatchProj
>      |
> SafePoint
>      |
> OuterCountedLoopEnd
> 
> The original problem is that the SafePoint was removed because the 
> Integer.valueOf reported that it guarantees a safepoint. With the change 
> - guaranteed_safepoint() returns false for boxes - no safepoint removal 
> is done, the graph is kept intact.
> 
> Regards,
> 
> Nils
>>
>> Thanks,
>> Vladimir
>>
>>>
>>> New webrev here: http://cr.openjdk.java.net/~neliasso/8205107/webrev.03/
>>>
>>> Thanks for the help!
>>>
>>> Nils
>>>
>>>
>>>
>>> On 2018-06-19 19:18, Vladimir Kozlov wrote:
>>>> On 6/19/18 9:01 AM, Vladimir Kozlov wrote:
>>>>> On 6/19/18 7:22 AM, Nils Eliasson wrote:
>>>>>> 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.
>>>>>
>>>>> I assume you are talking about eliminate_boxing_node() in macro 
>>>>> expansion.
>>>>>
>>>>>>
>>>>>> 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.
>>>>>
>>>>> It returns false for Allocate nodes which are macro nodes. That is 
>>>>> what comment says.
>>>>>
>>>>> In case of boxing node I think we should add to CallStaticJavaNode 
>>>>> class
>>>>>
>>>>>    // Boxing call which is not used and will be removed.
>>>>>    virtual bool        guaranteed_safepoint()  { return 
>>>>> C->eliminate_boxing() && is_boxing_method() && 
>>>>> (proj_out_or_null(TypeFunc::Parms) == NULL); }
>>>>
>>>> Sorry, test should be reversed because it guarantee SP if call is 
>>>> *not* removed:
>>>>
>>>> virtual bool        guaranteed_safepoint()  { return 
>>>> !(C->eliminate_boxing() && is_boxing_method() && 
>>>> (proj_out_or_null(TypeFunc::Parms) == NULL)); }
>>>>
>>>> Vladimir
>>>>
>>>>>
>>>>> Vladimir
>>>>>
>>>>>>
>>>>>> // 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