[8] RFR (XS): 8031695: CHA ignores default methods during analysis leading to incorrect code generation

harold seigel harold.seigel at oracle.com
Wed Jan 22 11:40:46 PST 2014


Hi Vladimir.

Does this second version of is_concrete_method() also need a "&& 
!m->is_overpass()"?

1191 bool Dependencies::is_concrete_method(ciMethod* m) {
1192   // Statics are irrelevant to virtual call sites.
1193   if (m->is_static())  return false;
1194
1195   // We could also return false if m does not yet appear to be
1196   // executed, if the VM version supports this distinction also.
1197   return !m->is_abstract();
1198 }

Thanks, Harold


On 1/22/2014 12:29 PM, Vladimir Ivanov wrote:
> http://cr.openjdk.java.net/~vlivanov/8031695/webrev.00/
> https://bugs.openjdk.java.net/browse/JDK-8031695
>
> CHA erroneously ignores default methods when looking for different 
> versions of a method in a class hierarchy.
>
> Consider the following hierarchy:
>   interface I { default void m() { ... }}
>   class A implements I {}
>
>   class C extends A { }
>   class D extends A { public void m() { ... } }
>
> Call site: invokevirtual A.m()
>
> A.m resolves to I.m. Searching from A, CHA finds only D.m and 
> concludes that D.m is the only implementation of I.m, since 
> Dependencies::is_concrete_method returns false for I.m.
>
> But there is C with default implementation from I. So, if VM inlines 
> D.m and then C's instance is passed as objectref, the wrong method is 
> invoked (D.m instead of I.m).
>
> The fix is to take default methods into account doing CHA analysis and 
> treat the call site as non-monomorphic when a concrete method is found 
> for a default method.
>
> Conservative approach is chosen, since the fix is targeted for 8.
>
> Testing: failing application, regression test, vm.defmeth.testlist, 
> JDK regression tests (java/util/, java/lang)
>
> Thanks!
>
> Best regards,
> Vladimir Ivanov



More information about the hotspot-dev mailing list