[9] [8u40] RFR (M): 8059877: GWT branch frequencies pollution due to LF sharing

Remi Forax forax at univ-mlv.fr
Fri Oct 10 20:28:20 UTC 2014


Hi Vladimir,

Why do you need getHistoricInt ?
Is it because Unsafe.getInt() doesn't do any constant folding ?

BTW, why getHistoricInt is named getHistoricInt ?

cheers,
Rémi

On 10/10/2014 09:08 PM, Vladimir Ivanov wrote:
> http://cr.openjdk.java.net/~vlivanov/8059877/webrev.00/
> https://bugs.openjdk.java.net/browse/JDK-8059877
>
> LambdaForm sharing introduces profile pollution in compiled 
> LambdaForms. The most serious consequence is inlining distortion, 
> which severely degrade peak performance. The main victim is 
> guardWithTest (GWT) combinator.
>
> Before LambdaForm sharing, inlining in GWT was affected by 2 aspects:
>   - branch frequencies: never-taken branch is skipped;
>   - target & fallback method handles (corresponding LFs: compiled vs 
> interpreted): if method handle has been invoked < COMPILE_THRESHOLD 
> times, LambdaForm.vmentry points to LF interpreter which is marked w/ 
> @DontInline.
>
> LambdaForm sharing breaks both aspects:
>   - sharing of GWT LambdaForm pollutes branch profile;
>   - sharing of LambdaForms used in target & fallback pollutes 
> invocation counters.
>
> I experimented w/ VM API to guide JIT-compiler using profiling 
> information gathered on LambdaForm level [1], but decided to take 
> safer route for now (8u40). JIT-compiler control approach looks 
> promising, but I need more time to get rid of some performance 
> artifacts it suffers from.
>
> The proposed fix is to mimic behavior of fully customized LambdaForms.
> When GWT is created, both target & fallback method handles are wrapped 
> in a special reinoker, which blocks inlining (@DontInline on 
> reinvoker's compiled LambdaForm). Once a wrapper is invoked more that 
> DONT_INLINE_THRESHOLD times, it's LambdaForm is replaced with a 
> regular reinvoker, which is fully transparent for the JIT and it 
> inlines smoothly.
>
> The downside of the chosen approach is that LambdaForm.updateForm() 
> doesn't guarantee that all places where stale LambaForm is used see 
> the update. If it is already part of some nmethod, it won't be 
> invalidated and recompiled, but will be kept as is. It shouldn't be a 
> problem, since DONT_INLINE_THRESHOLD is expected to be pretty low 
> (~30), so only very rarely executed branches are affected.
>
> The fix significantly improves peak performance w/ full LF sharing 
> (USE_LF_EDITOR=true).
>
> Octane/nashorn results [2] for:
>   (1) USE_LF_EDITOR=false DONT_INLINE_THRESHOLD=0 (default for 8u40&9)
>   (2) USE_LF_EDITOR=true  DONT_INLINE_THRESHOLD=0 (default for 8u40&9)
>   (3) USE_LF_EDITOR=true  DONT_INLINE_THRESHOLD=30 (fixed version)
>
> (1) & (2) correspond to default configurations (partial & full LF 
> sharing respectively). (3) is the fixed version.
>
> The fix recovers peak performance for:
>  * Crypto:       ~255ms -> ~12ms;
>  * DeltaBlue:     ~40ms ->  ~2ms;
>  * Raytracer:     ~62ms ->  ~7ms;
>  * EarleyBoyer:  ~160ms ->  ~22ms;
>  * NavierStokes:  ~17ms ->  ~13ms;
>
> 2 subbenchmarks (Box2D & Gbemu) still has some regressions, but it's 
> much better now:
>    Box2D: ~48ms -> ~61ms  (w/o the fix: ~155ms)
>    Gbemu: ~88ms -> ~116ms (w/o the fix: ~160ms)
>
> Testing:
>   tests: jck (api/java_lang/invoke), jdk/java/lang/invoke, 
> jdk/java/util/streams, octane
>  configurations: -ea -esa -Xverify:all
>  + COMPILE_THRESHOLD={0,30} + USE_LF_EDITOR={false,true} + 
> DONT_INLINE_THRESHOLD={0,30}
>
> Thanks!
>
> Best regards,
> Vladimir Ivanov
>
> [1] http://cr.openjdk.java.net/~vlivanov/profiling/
> [2] http://cr.openjdk.java.net/~vlivanov/8059877/octane.txt
> _______________________________________________
> mlvm-dev mailing list
> mlvm-dev at openjdk.java.net
> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev



More information about the mlvm-dev mailing list