[13] RFR (M): 8223213: Implement fast class initialization checks on x86-64

Vladimir Ivanov vladimir.x.ivanov at oracle.com
Thu May 30 10:38:17 UTC 2019


Thanks for reviews, Vladimir, Claes, David, Martin, and Coleen!

Best regards,
Vladimir Ivanov

On 29/05/2019 22:06, coleen.phillimore at oracle.com wrote:
> 
> Vladimir,
> 
> This looks good to me.
> 
> On 5/29/19 12:20 PM, Vladimir Ivanov wrote:
>> Thanks, Coleen.
>>
>> Updated webrev:
>>   http://cr.openjdk.java.net/~vlivanov/8223213/webrev.03
>>
>> Incremental webrev:
>>   http://cr.openjdk.java.net/~vlivanov/8223213/webrev.03_02/
>>
>>> I reviewed mostly the interpreter and shared change.  As someone else 
>>> commented, I don't like the addition of a develop flag because some 
>>> platforms don't support class initialization barriers.  Isn't it 
>>> normal to do this with the misnamed VM_Version, like adding 
>>> VM_Version::supports_class_initialization_barriers() with x86 
>>> returning true until the other platforms false until they implement 
>>> the feature. Then there isn't another flag configuration to test (or 
>>> not test).
>>
>> I like your suggestion. Didn't know VM_Version is used in such a way.
>>
>> Replaced UseFastClassInitChecks with 
>> VM_Version::supports_fast_class_init_checks().
>>
>>> http://cr.openjdk.java.net/~vlivanov/8223213/webrev.02/src/hotspot/cpu/x86/interp_masm_x86.cpp.udiff.html 
>>>
>>>
>>> I have to admit that the relationship between resolved bytecode in 
>>> bytecode_1/bytecode_2 and which _f1/_f2 held the Method* was actually 
>>> a surprise to me.  There's nothing structurally in cpCache other than 
>>> reading the code that enforces this and it wasn't always a Method* in 
>>> f2 for invokeinterface, for example, so it's sort of an accident.
>>>
>>> But this code is correct and I think as a follow up we should make 
>>> load_invoke_cp_cache_entry() call load_resolved_method_at_index() too 
>>> and have some assert in cpCache that this is true, or rewrite the 
>>> cpCache completely.
>>
>> I went ahead and changed load_invoke_cp_cache_entry() to call 
>> load_resolved_method_at_index() (along with some other minor 
>> refactorings). If you have any ideas/suggestions about the assert, I 
>> can add it as well.
> 
> I think the change to use load_resolved_method_at_index() is good 
> because if someone moves things around, it'll now fail very quickly.  I 
> think this is the right amount of refactoring.
> 
> Thanks,
> Coleen
>>
>> Best regards,
>> Vladimir Ivanov
>>
>>> The code to do the initialization barrier in the interpreter looks good.
>>>
>>> Thanks,
>>> Coleen
>>>
>>> On 5/28/19 7:40 AM, Vladimir Ivanov wrote:
>>>> Thanks, Martin.
>>>>
>>>> Updated webrev:
>>>>   http://cr.openjdk.java.net/~vlivanov/8223213/webrev.02/
>>>>
>>>>> Are these assertions safe?
>>>>> +   assert(method()->needs_clinit_barrier(), "barrier not needed");
>>>>> +   assert(method()->holder()->is_being_initialized(), "barrier not 
>>>>> needed");
>>>>> Can it happen that initialization concurrently completes before 
>>>>> they are evaluated?
>>>>
>>>> Good point. Even though ciInstanceKlass caches initialization state 
>>>> of the corresponding InstanceKlass, it seems there's a possibility 
>>>> that the state is updated during the compilation (see 
>>>> ciInstanceKlass::update_if_shared). I enhanced the asserts to check 
>>>> that initialization has been stated.
>>>
>>> Ok, this makes sense.
>>>>
>>>>> A small suggestion for x86 TemplateTable::invokeinterface:
>>>>> It'd be nice to replace load of interface klass by your new 
>>>>> load_method_holder.
>>>>
>>>> Agree. Updated.
>>>
>>> This is nice.
>>>
>>>
>>>>
>>>> Best regards,
>>>> Vladimir Ivanov
>>>
> 


More information about the hotspot-dev mailing list