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

Remi Forax forax at univ-mlv.fr
Wed Feb 6 22:39:56 UTC 2019


----- Mail original -----
> De: "Karen Kinnear" <karen.kinnear at oracle.com>
> À: "Srikanth" <srikanth.adayapalam at oracle.com>
> Cc: "valhalla-dev" <valhalla-dev at openjdk.java.net>
> Envoyé: Mercredi 6 Février 2019 15:38:04
> Objet: Re: RFR 8218142 [lworld] C1 support for array covariance for aaload

> Many thanks Srikanth for the covariance/non-covariance support.
> 
> And the current flags:
> -XDallowWithFieldOperator: __WithField construct is allowed only when on
> -XDallowGenericsOverValues: For values to parameterize generics, not for values
> them
> selves to be generic
> -XDnonCovariantValueArrays: For experiments where VT[] is not a subtype of
> j.l.O[]
> -XDallowEmptyValues: Allow values that have no state
> 
> (I agree with getting rid of -XDdisallowValueConstructors if you didn’t do that
> already)
> 
> thanks,
> Karen

Hi Karen,
is there already a support for empty value type in the VM ??

Rémi

> 
>> On Feb 5, 2019, at 8:34 AM, Srikanth <srikanth.adayapalam at oracle.com> wrote:
>> 
>> 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