RFR: 8170455: C2: Access to [].clone from interfaces fails
Jamsheed C m
jamsheed.c.m at oracle.com
Mon Feb 6 14:53:34 UTC 2017
Thank you, Vladimir!
Best Regards,
Jamsheed
On 2/6/2017 7:22 PM, Vladimir Ivanov wrote:
>> revised webrev: http://cr.openjdk.java.net/~jcm/8170455/webrev.01/
>
> Looks good.
>
> Best regards,
> Vladimir Ivanov
>
>> On 1/31/2017 3:55 PM, Jamsheed C m wrote:
>>> Hi,
>>>
>>> Array type are treated as Object type in Compiler (see [1]) and
>>> lookup happens in Object Class in compiler interface. This used to
>>> work before default method got introduced. with default methods
>>> protected Object methods are inaccessible from interface , so lookup
>>> fails, caller method always deopt as unloaded and decompile in C2.
>>> This causes considerable degradation in performance.
>>>
>>> Fix: array types are directly passed to lookup code(fix), all other
>>> code is kept as it is.
>>>
>>> bug id: https://bugs.openjdk.java.net/browse/JDK-8170455
>>>
>>> webrev: http://cr.openjdk.java.net/~jcm/8170455/webrev.00/
>>>
>>> Best Regards,
>>>
>>> Jamsheed
>>>
>>> [1]
>>>
>>> ciInstanceKlass*
>>> ciEnv::get_instance_klass_for_declared_method_holder(ciKlass*
>>> method_holder) {
>>> // For the case of <array>.clone(), the method holder can be a
>>> ciArrayKlass
>>> // instead of a ciInstanceKlass. For that case simply pretend
>>> that the
>>> // declared holder is Object.clone since that's where the call will
>>> bottom out.
>>> // A more correct fix would trickle out through many interfaces in
>>> CI,
>>> // requiring ciInstanceKlass* to become ciKlass* and many more
>>> places would
>>> // require checks to make sure the expected type was found. Given
>>> that this
>>> // only occurs for clone() the more extensive fix seems like
>>> overkill so
>>> // instead we simply smear the array type into Object.
>>>
>>>
>>>
>>>
>>>
>>
More information about the hotspot-compiler-dev
mailing list