[9] RFR (S): 8074548: Never-taken branches cause repeated deopts in MHs.GWT case

Vladimir Ivanov vladimir.x.ivanov at oracle.com
Mon Mar 16 18:26:21 UTC 2015


MethodHandleImpl::profileBoolean doesn't update never-taken branch count 
when hitting a deopt on it. As a result, for rarely taken branches 
consequent compilations consider them as never-taken and prune them 
again causing repeated deopts. It severely affects peak performance.

The fix is to update MHI::profileBoolean intrinsic to insert a guard and 
uncommon trap w/ reexecute bit set for never-seen value. Once previously 
never seen value is encountered, the execution resumes after deopt in 
MHI::profileBoolean and corresponding count becomes non-zero.

The guard doesn't add any additional overhead, since it dominates all 
value usages and all branches on the same value are eliminated.

Testing: java/lang/invoke, nashorn, octane

Best regards,
Vladimir Ivanov

More information about the hotspot-compiler-dev mailing list