Thanks, John.

On 2/4/16 9:52 PM, John Rose wrote:
Looks good. Except I don't recall how is_inline interacts, if at all, with 
customization. It's not clear what is being gated, and which optimizations get 
let through.
Inlining through MH::invokeBasic doesn't happen when there's @DontInline on the target. It is the case for GWT which has CountingWrapper on both paths. It starts with a reinvoker.dontInline LF and then switches to a reinvoker LF (after 30 invocations). If a compilation happens when reinvoker.dontInline is used, a direct call is generated and even if the branch becomes hot, all the calls goes through reinvoker.dontInline. Update to reinvoker LF isn't visible unless the dispatch goes through MH::invokeBasic linker.

I had an impression that I introduced LF customization logic to the non-inlined case in GWT, but I can't find it in the code. So, it seems the regression is caused by repeated checks performed by reinvoker.dontInline LF and not by LF customization missed in generated code.

Also, I stumbled upon a quirk in inlining policy: inlining through linkers can't be delayed. It happens when JIT hits some limit on IR size. So, right now inlining can stop in the middle of MH chain and a linker call is generated.

But after JDK-8072008 there's no problem with delaying inlining. C2 can decide whether to keep the direct call or inline through it. So, I enabled late inlining for all linkers. (Surprisingly, no significant performance difference on nashorn.)

So, I decided to keep invokeBasic linker call replacement for now, but piggypack LF customization on the stuck counting LF.

Updated webrev:
  http://cr.openjdk.java.net/~vlivanov/8148994/webrev.01/hotspot
  http://cr.openjdk.java.net/~vlivanov/8148994/webrev.01/jdk

* enabled late inlining for linkers;
* add LF customization check in CountingWrapper::countDown, so when counting is stuck, the target will be customized.

Testing: octane, JPRT.

I'm working on JDK-8071793 [1] and will reconsider how LF customization on non-inlined branch in GWTs works given there is a more JVM-friendly mechanism to control inlining. With the proposed fix reinvoker.dontInline is never customized (only the target it points to) and serves as a trampoline between GWT & target LF. It would be better to jump right to the customized LF, if non-inlined branch becomes hot.

Best regards,
Vladimir Ivanov

[1] https://bugs.openjdk.java.net/browse/JDK-8071793
    "Prune rarely called invokedynamic call sites during inlining"

Maybe a comment about that would be useful
Reviewed.

– John

On Feb 4, 2016, at 7:51 AM, Vladimir Ivanov <vladimir.x.iva...@oracle.com> 
wrote:

http://cr.openjdk.java.net/~vlivanov/8148994/webrev.00
https://bugs.openjdk.java.net/browse/JDK-8148994

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* calls"

Reply via email to