[13] RFR (M): 8223216: C2: Unify class initialization checks between new, getstatic, and putstatic
dean.long at oracle.com
dean.long at oracle.com
Mon May 6 18:39:23 UTC 2019
OK, thanks for the explanation. Looks good.
dl
On 5/3/19 3:49 PM, Vladimir Ivanov wrote:
> Thanks for the feedback, Dean.
>
>> Do you want to have a Runtime reviewer take a look at the new logic?
>
> I'm definitely looking for feedback on 8223213 from Runtime team. But
> 8223216 is C2-specific and incrementally builds on top of it, so I
> don't think there's anything new for Runtime team to look at.
>
>> Can you explain why Parse::clinit_deopt() changed from testing for
>>
>> InstanceKlass::fully_initialized
>>
>> to testing for
>>
>> InstanceKlass::being_initialized
>>
>> instead? How do we know we it is the initializing thread?
>
> Initializing thread is irrelevant here. The check is solely about the
> current state of the holder class.
>
> Parse::clinit_deopt() is not mandatory (nmethod clinit barrier on
> entry cover all important cases), but an optimization. It is added by
> 8223213 specifically for C2 to trigger recompilation once the holder
> class is fully initialized. The motivation is to get better code when
> a class is fully initialized.
>
> The change in 8223216 is intended as a refactoring: since there are
> only 2 states allowed here (being_initialized and fully_initialized),
> it doesn't matter what state is checked (== being initialized vs !=
> fully_initialized).
>
> Best regards,
> Vladimir Ivanov
>
>> On 5/1/19 4:37 PM, Vladimir Ivanov wrote:
>>> http://cr.openjdk.java.net/~vlivanov/8223216/webrev.00/
>>> https://bugs.openjdk.java.net/browse/JDK-8223216
>>>
>>> (The patch has minor dependencies on 8223213 [1] I sent out for
>>> review earlier.)
>>>
>>> C2 implements class initialization checks for new and
>>> getstatic/putstatic differently: while "new" supports fast class
>>> initialization checks, static field accesses rely on uncommon traps
>>> which may lead to deoptimization/recompilation storms during
>>> long-running class initialisation.
>>>
>>> Proposed patch unifies implementation between them and uses the
>>> following barrier:
>>> if (holder->is_initialized()) {
>>> uncommon_trap(initialized, reinterpret);
>>> }
>>> if (!holder->is_reentrant_initialization(current_thread)) {
>>> uncommon_trap(uninitialized, none);
>>> }
>>>
>>> It also enhances checks for not-yet-initialized classes
>>> (Compile::needs_clinit_barrier) and unifies the implementation
>>> between new, invokestatic, and getfield/putfield.
>>>
>>> Testing: tier1-5, targeted microbenchmarks, new test from 8223213
>>>
>>> Thanks!
>>>
>>> Best regards,
>>> Vladimir Ivanov
>>>
>>> [1] http://cr.openjdk.java.net/~vlivanov/8223213/webrev.00/
>>> https://bugs.openjdk.java.net/browse/JDK-8223213
>>>
>>
More information about the hotspot-compiler-dev
mailing list