CHA for interfaces in C2 compiler
Remi Forax
forax at univ-mlv.fr
Thu Apr 16 07:15:17 UTC 2015
On 04/15/2015 07:02 PM, Vladimir Ivanov wrote:
> Nothing changed in 8 & 9 in this respect.
>
> You are looking on a microbenchmark, where you have a trivial method
> with contains just a single call. My point is that it's a corner case
> and you shouldn't notice the difference in a larger application.
>
> Null checks are pervasive on Java level, but for JIT compiler it is
> enough to perform it only once on a value to known the value is
> non-null afterwards.
>
> The same applies to exact type checks: dominating exact type check
> eliminates the need to repeat the type check. It is recorded in C2
> type system and propagated to all usages.
>
> Every place where type profiling for that interface happens a single
> exact type will be recorded.
>
> Please, note that CHA is more generic and covers the cases when
> numerous classes have a single method implementation. Type profiling
> is usually useless in such case.
Now that we have default methods on interface, we also have several
classes that implement the same interface that may share a single method
implementation, methods like Predicate::and or Function::compose by example.
I have no idea if implementing CHA on interfaces worth it or not,
but Java the language is a moving target, something that was true at
some point of time may be not true anymore.
>
> But in your example there's a single implementing class, so type
> profile works fine.
>
> Best regards,
> Vladimir Ivanov
regards,
Rémi
>
> On 4/15/15 7:37 PM, Vitaly Davidovich wrote:
>> 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 <mailto: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
>>
>>
More information about the hotspot-compiler-dev
mailing list