[8u40] RFR (M): 8059877: GWT branch frequencies pollution due to LF sharing
vladimir.x.ivanov at oracle.com
Tue Oct 28 19:04:47 UTC 2014
John, thanks for the feedback!
See my answers inline.
> The algorithm looks fine, as long as the count is small. (Otherwise we
> might want to spend effort recompiling the DontInline LF.
Yes, the intention is to have it small - about the same as
COMPILE_THRESHOLD. I experimented with recompiling all affected
nmethods, but it seriously slows down warmup once recompilation limit is
> Call it CountingWrapper, since that's what it does. (Count down vs.
> count up doesn't matter much.)
> Then you can call the states "counting" and "not counting". The
> pre-action is present only in the counting state.
> The aspect of inlining or blocking is then focused down to a detail of
> the LF flavor.
> You call DelegatingMethodHandle.makeReinvokerForm in three places, two
> of which are identical calls. I suggest refactoring so as to call it in
> two places.
I decided to go the following route: I factored CountingWrapper logic,
but instead of caching lambda forms for counting & non-counting cases, I
cache lambda form producers (MethodHandle -> LambdaForm). It allows to
delay LF instantiation for non-counting case and create new lambda forms
for DelegatingMethodHandle::asTypeUncached in CoutingWrapper.
My observations show that about half of the wrappers stay in counting
state, so I decided it makes sense to delay LF instantiation.
> (Nit: As a matter of style, the default value of a boolean flag should
> be usual one, in typical cases. By that reasoning, LF.forceInline
> should be LF.dontInline; the objection to this is that it is anti-style
> to have a negative word in a boolean name.)
If you don't mind, I decided to leave forceInline flag name as is.
> You could create and cache *both* reinvoker forms when the MH wrapper is
> created, so that the non-counting, inline-enabled LF is created more
> eagerly during warmup. It might make for a smoother warmup. (Maybe.
> Maybe not.)
Good point! I decided to precompile non-counting LF before setting it.
More information about the core-libs-dev