[9] RFR (XS): C2: continuous CallSite relinkage eventually disables compilation for a method

Vladimir Ivanov vladimir.x.ivanov at oracle.com
Fri Jan 27 12:29:12 UTC 2017


Vladimir, John, thanks for the feedback.

I incorporated your suggestions:

   http://cr.openjdk.java.net/~vlivanov/8173338/webrev.02/

> It could be unsafe to check outside lock. method::_code is cleaned up
> under the same lock but after the state change. So if a caller access
> _code field it would be wrong.

I don't see how method::_code is relevant to compiled method state 
checks. It's just a double-checked locking idiom. Should be safe since 
state transitions are monotonic.

> But, I think, it should be safe with your original change in
> CodeCache::make_marked_nmethods_not_entrant() because it does not access
> method::_code. You should use !is_not_entrant() instead of is_alive() -
> it works for AOT too.

I decided to keep state checks both in 
CodeCache::make_marked_nmethods_not_entrant() and 
nmethod::make_not_entrant_or_zombie(). !is_not_entrant() isn't precise 
enough, since it passes for zombie nmethods as well.

Also, added equivalent pre-lock check in 
AOTCompiledMethod::make_not_entrant_helper(). Let me know if you see any 
problems with that.

Best regards,
Vladimir Ivanov

> On 1/26/17 12:44 PM, Vladimir Ivanov wrote:
>> What about moving the check to nmethod::make_not_entrant()?
>>
>> http://cr.openjdk.java.net/~vlivanov/8173338/webrev.01
>>
>> Or I can fix it separately.
>>
>> Best regards,
>> Vladimir Ivanov
>>
>> On 1/26/17 11:30 PM, Vladimir Kozlov wrote:
>>> It will not work for AOT nmethods which have not_used state.
>>>
>>> Vladimir
>>>
>>> On 1/26/17 8:47 AM, Vladimir Ivanov wrote:
>>>> http://cr.openjdk.java.net/~vlivanov/8173338/webrev.00/
>>>> https://bugs.openjdk.java.net/browse/JDK-8173338
>>>>
>>>> The fix for JDK-7177745 disabled deoptimization count update when it
>>>> happens due to CallSite.target change.
>>>>
>>>> There was one case missed though: the count is still updated when
>>>> compilation fails due to a dependency becoming invalid
>>>> during the compilation.
>>>>
>>>> The fix is to avoid the update when recompilation fails due to
>>>> call_site_target dependency failure.
>>>>
>>>> Also, added a check in CodeCache::make_marked_nmethods_not_entrant()
>>>> to avoid repeated nmethod::make_not_entrant() calls
>>>> on nmethods which are already not entrant. Otherwise, the check is
>>>> performed under Patching_lock inside
>>>> nmethod::make_not_entrant_or_zombie() for every non-entrant method in
>>>> the code cache.
>>>>
>>>> Testing: regression test, RBT (in progress)
>>>>
>>>> Thanks!
>>>>
>>>> Best regards,
>>>> Vladimir Ivanov


More information about the hotspot-compiler-dev mailing list