public class TestMeetInstanceId { static class A { } static class B { } static class C extends B { } // o has profile A static void m1(Object o) { } // o has profile unknown + not null static void m3(Object o) { } // b has profile unknown static void m2(B b, boolean flag) { // inlining of m1 + use of parameter profiling in m2 cause join of: // TestMeetInstanceId$B * // TestMeetInstanceId$A:exact * (inline_depth=2) // = java/lang/Object:AnyNull *,iid=top (inline_depth=2) m1(b); if (flag) { // inlining of m3 + parameter profiling cause join of: // TestMeetInstanceId$B * // java/lang/Object:NotNull *,iid=top (inline_depth=2) // which results in: /* === Meet Not Symmetric === t = java/lang/Object:AnyNull * (inline_depth=-2) this= TestMeetInstanceId$B:TopPTR *,iid=top (inline_depth=InlineDepthTop) mt=(t meet this)= TestMeetInstanceId$B:AnyNull * (inline_depth=-2) t_dual= java/lang/Object:NotNull *,iid=top (inline_depth=2) this_dual= TestMeetInstanceId$B * mt_dual= TestMeetInstanceId$B:NotNull *,iid=top (inline_depth=2) mt_dual meet t_dual= java/lang/Object:NotNull * (inline_depth=2) mt_dual meet this_dual= TestMeetInstanceId$B * */ m3(b); } } static public void main(String[] args) { A a = new A(); B b = new B(); C c = new C(); // compile m1 to freeze the argument profile for (int i = 0; i < 20000; i++) { if ((i % 2) == 0) { m1(a); } else { m1(null); } } for (int i = 0; i < 20000; i++) { if ((i % 3) == 0) { m2(b, true); } else if ((i % 3) == 1) { m2(c, true); } else { m2(null, false); } } } }