RFR[XS]: 8238272: Eliminate cast_from_oop to narrowOop*

Kim Barrett kim.barrett at oracle.com
Fri Jan 31 22:12:14 UTC 2020


> On Jan 31, 2020, at 2:35 AM, Kim Barrett <kim.barrett at oracle.com> wrote:
> 
>> On Jan 31, 2020, at 2:07 AM, Aleksey Shipilev <shade at redhat.com> wrote:
>> 
>> On 1/31/20 7:51 AM, Kim Barrett wrote:
>>> Webrev:
>>> https://cr.openjdk.java.net/~kbarrett/8238272/open.00/
>> 
>> Hm, I am puzzled a bit.
>> 
>> a->obj_at_addr_raw(0) seems to point to the first array element (objArrayOopDesc::base_raw + 0 =
>> arrayOopDesc::base_raw(T_OBJECT) = cast_from_oop<intptr_t>(as_oop()) + base_offset_in_bytes(type) =
>> header_size(type) * HeapWordSize). Whereas cast_from_oop<T*>(a) points to the object header.
>> 
>> So start == 0 is really a special case here, do we know why?
> 
> I realized there’s a problem shortly after sending out the RFR, and was starting to write
> this when I saw your reply.
> 
> I should have realized this after looking at the end computation in the line after the change.
> obj_at_addr_raw asserts the index is in range, which is exclusive on the length.  That’s
> why the end computation hand-inlines the same address calculation as done by
> obj_at_addr_raw, rather than using that function.  With my change we’ll get an assert
> if the array length is also 0, even if start is also 0.
> 
> The fix is to use the same hand-inlined address calculation for start as for end, perhaps
> packaging that up in a new function.  I’ll get back to this next week.  Sorry for the noise.

Here's a new webrev:

https://cr.openjdk.java.net/~kbarrett/8238272/open.01/

I didn't bother with an incremental webrev, since the new version is just
a one-line change replacing the previous one-line change.

Testing: tier1



More information about the hotspot-dev mailing list