On Apr 2, 2014, at 4:16 PM, Paul Sandoz <paul.san...@oracle.com> wrote: > >>>> Regarding redundant null check, do you have a test case so I can play with >>>> it myself? >>>> >>> >>> I will send something to you later today or tomorrow. >>> > > > Still plan to send you something today :-) but later on... >
See below for an inline trace, the assembler and the class that was executed with -XX:-TieredCompilation using Java 8. Paul. Inlining _isInstance on constant Class java/lang/String ! @ 9 MHFieldTest::testLoopOne (25 bytes) inline (hot) @ 8 java.lang.invoke.LambdaForm$MH/617901222::invokeExact_MT (15 bytes) inline (hot) @ 2 java.lang.invoke.Invokers::checkExactType (30 bytes) inline (hot) @ 11 java.lang.invoke.MethodHandle::type (5 bytes) accessor @ 11 java.lang.invoke.LambdaForm$MH/523429237::putObjectFieldCast (32 bytes) inline (hot) @ 1 java.lang.invoke.DirectMethodHandle::fieldOffset (9 bytes) inline (hot) @ 6 java.lang.invoke.DirectMethodHandle::checkBase (7 bytes) inline (hot) @ 1 java.lang.Object::getClass (0 bytes) (intrinsic) @ 13 java.lang.invoke.DirectMethodHandle::checkCast (9 bytes) inline (hot) @ 5 java.lang.invoke.DirectMethodHandle$Accessor::checkCast (9 bytes) inline (hot) @ 5 java.lang.Class::cast (27 bytes) inline (hot) @ 6 java.lang.Class::isInstance (0 bytes) (intrinsic) @ 28 sun.misc.Unsafe::putObject (0 bytes) (intrinsic) [Verified Entry Point] 0x000000010ccf0da0: mov %eax,-0x14000(%rsp) 0x000000010ccf0da7: push %rbp 0x000000010ccf0da8: sub $0x20,%rsp ;*synchronization entry ; - MHFieldTest::testLoopOne@-1 (line 57) 0x000000010ccf0dac: mov 0xc(%rsi),%r10d ;*getfield a ; - MHFieldTest::testLoopOne@5 (line 57) 0x000000010ccf0db0: test %r10d,%r10d 0x000000010ccf0db3: je 0x000000010ccf0ddd ;*ifnull ; - java.lang.Class::cast@1 (line 3257) ; - java.lang.invoke.DirectMethodHandle$Accessor::checkCast@5 (line 441) ; - java.lang.invoke.DirectMethodHandle::checkCast@5 (line 510) ; - java.lang.invoke.LambdaForm$MH/640070680::putObjectFieldCast@13 ; - java.lang.invoke.LambdaForm$MH/789451787::invokeExact_MT@11 ; - MHFieldTest::testLoopOne@8 (line 57) 0x000000010ccf0db5: add $0x10,%rsi 0x000000010ccf0db9: mov %r10d,(%rsi) 0x000000010ccf0dbc: mov %rsi,%r10 0x000000010ccf0dbf: shr $0x9,%r10 0x000000010ccf0dc3: mov $0x18f780000,%r11 0x000000010ccf0dcd: mov %r12b,(%r11,%r10,1) ;*getfield a ; - MHFieldTest::testLoopOne@5 (line 57) 0x000000010ccf0dd1: add $0x20,%rsp 0x000000010ccf0dd5: pop %rbp 0x000000010ccf0dd6: test %eax,-0x113ddc(%rip) # 0x000000010cbdd000 ; {poll_return} 0x000000010ccf0ddc: retq 0x000000010ccf0ddd: mov %rsi,%rbp 0x000000010ccf0de0: mov %r10d,0x4(%rsp) 0x000000010ccf0de5: mov $0xffffffad,%esi 0x000000010ccf0dea: nop 0x000000010ccf0deb: callq 0x000000010ccbc120 ; OopMap{rbp=Oop [4]=NarrowOop off=112} ;*ifnull ; - java.lang.Class::cast@1 (line 3257) ; - java.lang.invoke.DirectMethodHandle$Accessor::checkCast@5 (line 441) ; - java.lang.invoke.DirectMethodHandle::checkCast@5 (line 510) ; - java.lang.invoke.LambdaForm$MH/640070680::putObjectFieldCast@13 ; - java.lang.invoke.LambdaForm$MH/789451787::invokeExact_MT@11 ; - MHFieldTest::testLoopOne@8 (line 57) ; {runtime_call} 0x000000010ccf0df0: callq 0x000000010c07ace4 ;*ifnull ; - java.lang.Class::cast@1 (line 3257) ; - java.lang.invoke.DirectMethodHandle$Accessor::checkCast@5 (line 441) ; - java.lang.invoke.DirectMethodHandle::checkCast@5 (line 510) ; - java.lang.invoke.LambdaForm$MH/640070680::putObjectFieldCast@13 ; - java.lang.invoke.LambdaForm$MH/789451787::invokeExact_MT@11 ; - MHFieldTest::testLoopOne@8 (line 57) ; {runtime_call} import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; public class MHFieldTest { volatile String a = "A"; public String b; static final MethodHandle b_setter; static { try { b_setter = MethodHandles.lookup().findSetter(MHFieldTest.class, "b", String.class); } catch (Exception e) { throw new Error(e); } } public static void main(String[] args) { new MHFieldTest().testLoop(); } void testLoop() { for (int i = 0; i < 1000000; i++) { testLoopOne(); } } void testLoopOne() { try { b_setter.invokeExact(this, a); } catch (Throwable t) { throw new Error(t); } } }