Question about hack in templateTable_x86.cpp

Sergey Kuksenko sergey.kuksenko at oracle.com
Fri Nov 6 18:47:39 UTC 2020


Created: https://bugs.openjdk.java.net/browse/JDK-8255995

On 11/5/20 5:40 PM, John Rose wrote:
> On Nov 5, 2020, at 5:34 PM, Sergey Kuksenko 
> <sergey.kuksenko at oracle.com <mailto:sergey.kuksenko at oracle.com>> wrote:
>> On 11/5/20 3:09 PM, John Rose wrote:
>>> On Nov 5, 2020, at 10:09 AM, Sergey Kuksenko 
>>> <sergey.kuksenko at oracle.com <mailto:sergey.kuksenko at oracle.com>> wrote:
>>>>
>>>>    // might be substitutable, test if either rax or rdx is null __ 
>>>> testptr(rdx, rax);
>>>>    __ jcc(Assembler::zero, (cc ==equal) ? not_taken : taken);
>>>>
>>>> The last "test" does simultaneous check either one of oops is null. 
>>>> I really like that hack, but I am not sure.
>>>>
>>>> What if we've got two non-null pointers which just have different 
>>>> bits? That hack may work only if we know that ANY two pointers have 
>>>> some ones at the same bit position. Do we have such assurance?
>>>
>>> Not in general.  If you look at verify_oop_mask and verify_oop_bits,
>>> you might be able to reassure yourself that this works out OK.
>>> In particular, we need both values to be non-zero.
>>>
>>> The macro here should do this, and fall back to reliable code (such
>>> as a CC-testing bitwise OR) if the reassurance fails, or at least fail
>>> to boot the JVM.
>>>
>>> See Universe::calculate_verify_data for where these bits come from.
>>
>> I don't want to be boring, just want to understand it for myself.
>>
>> "calculate_verify_data" finds high bits common prefix for min/max 
>> heap addresses. What if that high common prefix is all zeros or even 
>> zero length?
>>
>> For example, in ZGC we use:
>>
>> Universe::calculate_verify_data((HeapWord*)0, (HeapWord*)UINTPTR_MAX);
>>
>> In that case prefix mask/bits will be zeros.
>>
>
> Yes, that’s why I said “we need both values to be non-zero”.
>
> So, the code you found is buggy but just happens to work
> out sometimes.  It should be changed.  It clearly wasn’t
> written with calculate_verify_data in mind; that’s just
> something that I was reminded of when you wrote your
> note.
>
> Good find!
>
> — John


More information about the valhalla-dev mailing list