RFR(L): 8185265 [MVT] improve performance of return of value types with new calling convention

Tobias Hartmann tobias.hartmann at oracle.com
Mon Aug 21 10:48:21 UTC 2017


Hi Roland,

I was finally able to solve this. Some JCK tests failed because we were treating a klass with JVM_ACC_NATIVE (0x100) as 
value klass (since JVM_ACC_VALUE == JVM_ACC_NATIVE). The problem then is that these classes have a vtable which 
overwrites the pack and unpack handler addresses. I filed 8186439 [1] to fix this by ignoring the access flag for older 
class file versions.

For the record: In addition to Roland's changes, I will push this cleanup that moves the initialization code to the 
valueKlass constructor and converts the vtable assert to a guarantee (the JCK tests were only executed with product builds):
http://cr.openjdk.java.net/~thartmann/8185265/webrev.00/

All tests pass.

I'm just a bit concerned about MacroAssembler::lookup_interface_method() which computes the start of the itable 
according to the size of the vtable. With value types, the vtable size is 0 although two slots are occupied by the 
handler addresses. We need to fix this if we are ever going to support invokeinterface on value types.

Thanks,
Tobias

[1] https://bugs.openjdk.java.net/browse/JDK-8186439

On 11.08.2017 09:01, Roland Westrelin wrote:
> 
> Thanks for investigating the failure.
> 
>> I added some debug print statements and the klass we are deallocating is
>> javasoft/sqe/tests/vm/classfmt/clf/clfacc006/clfacc00602m1/clfacc00602m10p which is obviously not a value klass.
>>
>> I guess the problem then is that pack_handler() is != NULL because it was never initialized to NULL and we try to free a
>> non-existing buffer blob.
> 
>  From the stack trace you sent before we get there from:
> 
> void ClassLoaderData::value_classes_do(void f(ValueKlass*)) {
>    // Lock-free access requires load_ptr_acquire
>    for (Klass* k = load_ptr_acquire(&_klasses); k != NULL; k = k->next_link()) {
>      if (k->is_value()) {
>        f(ValueKlass::cast(k));
>      }
>      assert(k != k->next_link(), "no loops!");
>    }
> }
> 
> Why does is_value() returns true for this klass?
> 
> Roland.
> 


More information about the valhalla-dev mailing list