[9] RFR (S): 8148994: Replacing MH::invokeBasic with a direct call breaks LF customization

Vladimir Ivanov vladimir.x.ivanov at oracle.com
Thu Feb 4 15:51:35 UTC 2016


JDK-8072008 [1] introduced an optimization to bypass linker calls in 
generated code when target method can't be inlined.

Unfortunately, it doesn't work well with MH::invokeBasic(), because it 
clashes with LambdaForm customization: if a call is not inlined, it is 
important for performance to update (customize) corresponding LambdaForm 
on-the-fly. MH::invokeBasic() linker does MH -> LF -> Method* -> 
_from_compiled_entry traversal on every invocation, while direct call 
points right to the _from_compiled_entry. So, any LambdaForm updates 
aren't visible until recompilation.

The fix is to keep MH::invokeBasic linker, so up-to-date LambdaForm 
instance is used on every invocation.

Also, cleaned up relevant tests a bit.

Testing: octane, JPRT.

Best regards,
Vladimir Ivanov

[1] https://bugs.openjdk.java.net/browse/JDK-8072008
     "Emit direct call instead of linkTo* for recursive indy/MH.invoke* 

More information about the hotspot-compiler-dev mailing list