<div dir="ltr">Hi guys,<div><br></div><div>Consider the following code/setup (8u51 C2 compiler):</div><div><br></div><div><div>private interface I</div><div>    {</div><div>        long value();</div><div><br></div><div>        long value2();</div><div>    }</div><div><br></div><div>private static final class C implements I<br></div><div>    {</div><div><br></div><div>        @Override</div><div>        public long value() {</div><div>            return 1;</div><div>        }</div><div><br></div><div>        @Override</div><div>        public long value2() {</div><div>            return 1;</div><div>        }</div><div>    }</div></div><div><br></div><div><div>private static final class Wrapper</div><div>    {</div><div>        private I _i;</div><div><br></div><div>        public long value() {</div><div>            return _i != null ? _i.value() : -1;</div><div>        }</div><div><br></div><div>        public long value2() {</div><div>            return _i != null ? _i.value2() : -1;</div><div>        }</div><div>    }</div></div><div><br></div><div>// The below is in the outer class now</div><div><br></div><div>private final Wrapper _w = new Wrapper();<br></div><div><br></div><div><div>private long doIt() {</div><div>        return _w.value() + _w.value2();</div><div> }</div></div><div><br></div><div>Simple harness to get code generated:</div><div><br></div><div><div>public void foo() {</div><div>        int s = 0;</div><div>        for (int i = 0; i < 15_000; ++i) {</div><div>            if (i % 1000 == 0) {</div><div>                _w._i = null;</div><div>            } else {</div><div>                _w._i = new C();</div><div>            }</div><div>            s += doIt();</div><div>        }</div><div>        System.out.println(s);</div><div>    }</div></div><div><br></div><div>The idea here is to create a profile whereby vast majority of the time _w._i is not null.  Here's the generated code for doIt(), which is the method I'm interested in:</div><div><br></div><div><div>[Verified Entry Point]</div><div>  0x00007ff5f82e0080: mov    %eax,-0x14000(%rsp)</div><div>  0x00007ff5f82e0087: push   %rbp</div><div>  0x00007ff5f82e0088: sub    $0x20,%rsp         ;*synchronization entry</div><div><br></div><div>  0x00007ff5f82e008c: mov    0x18(%rsi),%r11d   ;*getfield _w</div><div><br></div><div>  0x00007ff5f82e0090: mov    0xc(%r12,%r11,8),%r11d  ;*getfield _i</div><div>                                                ; implicit exception: dispatches to 0x00007ff5f82e0111<br></div><div>  0x00007ff5f82e0095: mov    $0x1,%eax</div><div>  0x00007ff5f82e009a: test   %r11d,%r11d</div><div>  0x00007ff5f82e009d: je     0x00007ff5f82e00d4  ;*ifnull</div><div><br></div><div>  0x00007ff5f82e009f: mov    0x8(%r12,%r11,8),%r8d</div><div>  0x00007ff5f82e00a4: cmp    $0xf8015a89,%r8d   ;   {metadata('$C')} // NOTE: I'm stripping away the nonessential fully qualified name</div><div>  0x00007ff5f82e00ab: jne    0x00007ff5f82e00f9  ;*invokeinterface value</div><div><br></div><div>  0x00007ff5f82e00ad: mov    $0x1,%ebp          ;*lreturn</div><div><br></div><div>  0x00007ff5f82e00b2: test   %r11d,%r11d</div><div>  0x00007ff5f82e00b5: je     0x00007ff5f82e00dd  ;*ifnull</div><div><br></div><div>  0x00007ff5f82e00b7: mov    0x8(%r12,%r11,8),%r10d</div><div>  0x00007ff5f82e00bc: cmp    $0xf8015a89,%r10d  ;   {metadata('$C')}</div><div>  0x00007ff5f82e00c3: jne    0x00007ff5f82e00e6  ;*lreturn</div><div><br></div><div>  0x00007ff5f82e00c5: add    %rbp,%rax          ;*ladd</div><div><br></div><div>  0x00007ff5f82e00c8: add    $0x20,%rsp</div><div>  0x00007ff5f82e00cc: pop    %rbp</div><div>  0x00007ff5f82e00cd: test   %eax,0x5e11f2d(%rip)        # 0x00007ff5fe0f2000</div><div>                                                ;   {poll_return}</div><div>  0x00007ff5f82e00d3: retq   </div></div><div><br></div><div>Does anyone know why (a) the null check is performed twice and (b) the type check for $C is performed twice? The simple getters were devirtualized and constants inlined, which is nice, but I'm wondering why there are redundant safety checks.</div><div><br></div><div>Thanks</div><div><br></div></div>