[14] RFR(S): 8234617: C1: Incorrect result of field load due to missing narrowing conversion

Tobias Hartmann tobias.hartmann at oracle.com
Mon Dec 2 05:57:01 UTC 2019


Thanks Vladimir!

Best regards,
Tobias

On 29.11.19 15:19, Vladimir Ivanov wrote:
> 
>> http://cr.openjdk.java.net/~thartmann/8234617/webrev.00/
> 
> Looks good.
> 
> Best regards,
> Vladimir Ivanov
> 
>>
>> Writing an (integer) value to a boolean, byte, char or short field includes an implicit narrowing
>> conversion [1]. With -XX:+EliminateFieldAccess (default), C1 tries to omit field loads by caching
>> and reusing the last written value. The problem is that this value is not necessarily converted to
>> the field type and we end up using an incorrect value.
>>
>> For example, for the field store/load in testShort, C1 emits:
>>    [...]
>>    0x00007f0fc582bd6c:   mov    %dx,0x12(%rsi)
>>    0x00007f0fc582bd70:   mov    %rdx,%rax
>>    [...]
>>
>> The field load has been eliminated and the non-converted integer value (%rdx) is returned.
>>
>> The fix is to emit an explicit conversion to get the correct field value after the write:
>>    [...]
>>    0x00007ff07982bd6c:   mov    %dx,0x12(%rsi)
>>    0x00007ff07982bd70:   movswl %dx,%edx
>>    0x00007ff07982bd73:   mov    %rdx,%rax
>>    [...]
>>
>> Thanks,
>> Tobias
>>
>> [1] https://docs.oracle.com/javase/specs/jvms/se13/html/jvms-6.html#jvms-6.5.putfield
>>


More information about the hotspot-compiler-dev mailing list