CHA for interfaces in C2 compiler

Vitaly Davidovich vitalyd at gmail.com
Wed Apr 15 16:37:50 UTC 2015


Hi Vladimir,

Here's what I see on 7u60:

private static int doIt(final Foo f) {
return f.num();
    }

    interface Foo
    {
int num();
    }

    final class FooImpl implements Foo
    {
@Override
public int num() {
    return 1;
}
    }

Running a simple test where only FooImpl is loaded (in fact, it's the only
impl period) produces the following asm (stripped down to essentials):

  0x00007f0b31e14a6c: mov    0x8(%rsi),%r10d    ; implicit exception:
dispatches to 0x00007f0b31e14a9d
  0x00007f0b31e14a70: cmp    $0x71c9e068,%r10d  ;   {oop('FooImpl')}
  0x00007f0b31e14a77: jne    0x00007f0b31e14a8a
  0x00007f0b31e14a79: mov    $0x1,%eax
  0x00007f0b31e14a7e: add    $0x10,%rsp
  0x00007f0b31e14a82: pop    %rbp

If I change Foo to be an abstract class, we get this:

0x00007f0209deb18c: test   %rsi,%rsi
  0x00007f0209deb18f: je     0x00007f0209deb1a2
  0x00007f0209deb191: mov    $0x1,%eax
  0x00007f0209deb196: add    $0x10,%rsp
  0x00007f0209deb19a: pop    %rbp

So there's an explicit null check but no type check.

Did something change in java 8 or 9 that leads you to say "completely
eliminated"?

Thanks

On Wed, Apr 15, 2015 at 12:26 PM, Vladimir Ivanov <
vladimir.x.ivanov at oracle.com> wrote:

> Vitaly,
>
> Type profiling reliably detects single interface implementation cases and
> type check overhead is completely eliminated in most of the cases (type
> checks are aggressively commoned).
>
> Do you still think it is worth an effort?
>
> Best regards,
> Vladimir Ivanov
>
>
> On 4/15/15 5:10 PM, Vitaly Davidovich wrote:
>
>> Hi guys,
>>
>> So CHA on classes works nicely in the case of only one subtype loaded.
>> What about interfaces? Currently, it looks like no such
>> optimization/analysis is done.  In my experience, there's a substantial
>> amount of code that exposes an interface via some API, but then loads
>> only implementation of it.  The interface is used instead of abstract
>> class to allow more flexibility in the future.
>>
>> I fully realize that lots of interfaces have more than 1 implementer
>> loaded at runtime, but I also think it's worthwhile to attempt CHA for
>> them.
>>
>> Is this something that's feasible to do? It would require more class
>> loading dependencies to be tracked, but I'm also fine with having this
>> be an extra flag that I can use to enable/disable this optimization.
>>
>> Thoughts?
>>
>> Thanks
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/attachments/20150415/72d22e78/attachment-0001.html>


More information about the hotspot-compiler-dev mailing list