[10] RFR (M): 6986483: CHA: optimize calls through interfaces
Vitaly Davidovich
vitalyd at gmail.com
Wed Feb 22 14:48:04 UTC 2017
On Wed, Feb 22, 2017 at 9:47 AM, Vladimir Ivanov <
vladimir.x.ivanov at oracle.com> wrote:
> Vitaly,
>
> A bit premature to ask perhaps, but could this conceivably be backported
>> to Java 9?
>>
> Yes, once it gets enough testing in jdk10 repo I'll consider backporting
> it into upcoming 9u release.
>
> No chances to get it into jdk9 GA though.
>
Sounds great - thanks!
>
> Best regards,
> Vladimir Ivanov
>
>
>> I happened to be separately looking at this area, analysing the
>> performance of interfaces/abstract classes to apply a certain
>> implementation technique to avoid going megamorphic.
>>
>> I concluded that the implementation technique was not viable, but
>> with your patch i think i can revive it and perform more detailed
>> analysis.
>>
>> Based on my benchmark the performance improvement looks good.
>>
>> Thanks!
>> Paul.
>>
>> > On 14 Feb 2017, at 10:51, Vladimir Ivanov
>> <vladimir.x.ivanov at oracle.com <mailto:vladimir.x.ivanov at oracle.com>>
>>
>> wrote:
>> >
>> > http://cr.openjdk.java.net/~vlivanov/6986483/webrev.00/
>> > https://bugs.openjdk.java.net/browse/JDK-6986483
>> >
>> > Proposed change adds CHA support in C2 for interface calls.
>> >
>> > Consider the following hierarchy:
>> >
>> > interface Intf { m(); }
>> > class C implements Intf { public m() { ... } }
>> > class C1 extends C { /* doesn't override m() */ }
>> > ...
>> > class Cn extends C { /* doesn't override m() */ }
>> >
>> > Call site: invokeinterface Intf.m() ...
>> >
>> > If Intf were an abstract class, CHA could deduce that Intf::m()
>> can be replaced with C::m(), but it doesn't work for interfaces.
>> Verifier doesn't check interface types in bytecode, so CHA can't
>> assume the receiver implements Intf.
>> >
>> > CHA in C1 handles such call sites for interfaces with a single
>> implementor. It replaces invokeinterface Intf.m() with invokevirtual
>> C.m() guarded by a subtype check (instanceof C). C2 doesn't do that
>> and this request is about adding that. Type profiling doesn't help
>> here (the call site is usually megamorphic), so C2 can't inline it.
>> >
>> > The proposed implementation is similar to C1, except that the code
>> deoptimizes when subtype check fails and ICCE is thrown from the
>> interpreter.
>> >
>> > While working on it, I spotted and fixed a couple of
>> inefficiencies in C1 implementation:
>> >
>> > (1) dependency context being used was broader than necessary -
>> resolved instead of declared interface (hence, possibility of
>> unnecessary invalidations);
>> >
>> > (2) didn't work for interfaces w/ any default methods: CHA
>> doesn't support default methods at the moment, so what matters is
>> whether Intf::m() is default or not and not whether Intf has *any*
>> concrete methods.
>> >
>> > Testing: unit tests on CHA, JPRT, RBT (hs-comp-tier0, in
>> progress), LogCompilation tool.
>> >
>> > Thanks!
>> >
>> > Best regards,
>> > Vladimir Ivanov
>>
>> --
>> Sent from my phone
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/attachments/20170222/c3505082/attachment.html>
More information about the hotspot-compiler-dev
mailing list