RFR 8218142 [lworld] C1 support for array covariance for aaload

Srikanth srikanth.adayapalam at oracle.com
Tue Feb 5 13:34:00 UTC 2019


Javac by default allows covariance now.

Srikanth

On 05/02/19 5:24 PM, Ioi Lam wrote:
> If I remember correctly, some of them failed to compile or run after 
> changes in javac or hotspot-runtime that disallowed covariance. I'll 
> re-enable them and see what happens.
>
> Thanks
>
> - Ioi
>
> On 2/5/19 3:06 AM, Tobias Hartmann wrote:
>> Hi Ioi,
>>
>> this looks good to me. Should we re-enable the tests marked with 
>> "TODO Re-enable if value type
>> arrays become covariant with object arrays"? C2 already supports 
>> array covariance.
>>
>> Thanks,
>> Tobias
>>
>> On 31.01.19 13:52, Ioi Lam wrote:
>>> http://cr.openjdk.java.net/~iklam/valhalla/8218142-aaload-covariance.v01/ 
>>>
>>> https://bugs.openjdk.java.net/browse/JDK-8218142
>>>
>>> When loading from an array declared as Object[], now the C1 code 
>>> checks if the array is flattened.
>>> If so, the loading is done via a runtime call.
>>>
>>> Here's an example of the generated code
>>>
>>>        mov    0x8(%rsi),%eax      ; rsi = array
>>>        mov    $0x800000000,%r12
>>>        add    %r12,%rax           ; rax = array klass
>>>        xor    %r12,%r12           ; why is this here??
>>>        mov    0xc(%rax),%eax      ; layout_helper
>>>        sar    $0x1d,%eax
>>>        cmp    $0xfffffffd,%eax    ; check for 
>>> Klass::_lh_array_tag_vt_value
>>>        je      L_3                ; slow case
>>>
>>> L_1   movslq %edx,%rdx           ; non-flattened load
>>>        mov    0x10(%rsi,%rdx,4),%eax
>>>        shl    $0x3,%rax
>>> L_2   ....
>>>
>>> L_3   mov    %rsi,0x8(%rsp)      ; LoadFlattenedArrayStub slow case
>>>        mov    %rdx,(%rsp)
>>>        callq  0x00007fe6489c8840  ; runtime_call load_flattened_array
>>>        jmpq    L_2
>>>
>>>
>>> The code is pretty big and sub-optimal. My plan is to also get 
>>> aastore working first, and then
>>> optimize.
>>>
>>> One possibility is to check if the array is actually an Object[] 
>>> array. That should help with the
>>> erased generic types.
>>>
>>>        mov    0x8(%rsi),%eax      ; rsi = array
>>> +     cmp    $0x00001234, %eax   ; compressed klass for 
>>> [Ljava/lang/Object;
>>> +     je     L_1                 ; go to non-flattened load
>>>        mov    $0x800000000,%r12
>>>
>>>
>>> Thanks
>>> - Ioi



More information about the valhalla-dev mailing list