RFR(L): 8161211: better inlining support for loop bytecode intrinsics

Michael Haupt michael.haupt at oracle.com
Tue Sep 20 12:53:48 UTC 2016


Dear all,

please review this change.
Bug: https://bugs.openjdk.java.net/browse/JDK-8161211
Webrev: http://cr.openjdk.java.net/~mhaupt/8161211/webrev.00/

The method handle loop combinators introduced with JEP 274 were originally not intrinsified, leading to poor performance as compared to a pure-Java baseline, but also to handwired method handle combinations. The intrinsics introduced with 8143211 [1] improved on the situation somewhat, but still did not provide good inlining opportunities for the JIT compiler. This change introduces a usage of BoundMethodHandles as arrays to carry the various handles involved in loop execution.

Extra credits to Vladimir Ivanov, who suggested the BMH-as-arrays approach in the first place, and Claes Redestad, who suggested to use LambdaForm editing to neatly enable caching. Thanks!

Performance improves considerably. The table below reports scores in ns/op. The "unpatched" column contains results from before applying the patch for 8161211; the "patched" column, from thereafter.

The create benchmarks measure the cost of loop handle creation. The baseline and baselineMH benchmarks measure the cost of running a pure Java and handwired method handle construct.

Relevant comparisons include loop combinator results versus baselines, and versus unpatched loop combinator results. For the latter, there are significant improvements, except for the creation benchmarks (creation has a more complex workflow now). For the former, it can be seen that the BMH-array intrinsics generally perform better than handwired handle constructs, and have moved much closer to.

Thanks,

Michael



[1] https://bugs.openjdk.java.net/browse/JDK-8143211



Benchmark                                           (iterations)     unpatched        patched
MethodHandlesCountedLoop.Create.create3             N/A              16039.108        18400.405
MethodHandlesCountedLoop.Create.create4             N/A              15621.959        17924.696
MethodHandlesCountedLoop.Invoke.baseline3           0                2.858            2.839
MethodHandlesCountedLoop.Invoke.baseline3           1                5.125            5.164
MethodHandlesCountedLoop.Invoke.baseline3           10               11.887           11.924
MethodHandlesCountedLoop.Invoke.baseline3           100              67.441           67.281
MethodHandlesCountedLoop.Invoke.baseline4           0                2.855            2.838
MethodHandlesCountedLoop.Invoke.baseline4           1                5.120            5.179
MethodHandlesCountedLoop.Invoke.baseline4           10               11.875           11.906
MethodHandlesCountedLoop.Invoke.baseline4           100              67.607           67.374
MethodHandlesCountedLoop.Invoke.baselineMH3         0                9.734            9.606
MethodHandlesCountedLoop.Invoke.baselineMH3         1                15.689           15.674
MethodHandlesCountedLoop.Invoke.baselineMH3         10               68.912           69.303
MethodHandlesCountedLoop.Invoke.baselineMH3         100              605.666          606.432
MethodHandlesCountedLoop.Invoke.baselineMH4         0                14.561           13.234
MethodHandlesCountedLoop.Invoke.baselineMH4         1                19.543           19.773
MethodHandlesCountedLoop.Invoke.baselineMH4         10               71.977           72.466
MethodHandlesCountedLoop.Invoke.baselineMH4         100              596.842          602.469
MethodHandlesCountedLoop.Invoke.countedLoop3        0                49.339           5.810
MethodHandlesCountedLoop.Invoke.countedLoop3        1                95.444           7.441
MethodHandlesCountedLoop.Invoke.countedLoop3        10               508.746          21.002
MethodHandlesCountedLoop.Invoke.countedLoop3        100              4701.808         145.996
MethodHandlesCountedLoop.Invoke.countedLoop4        0                49.443           5.798
MethodHandlesCountedLoop.Invoke.countedLoop4        1                98.721           7.438
MethodHandlesCountedLoop.Invoke.countedLoop4        10               503.825          21.049
MethodHandlesCountedLoop.Invoke.countedLoop4        100              4681.803         147.020
MethodHandlesDoWhileLoop.Create.create              N/A              7628.312         9100.332
MethodHandlesDoWhileLoop.Invoke.baseline            1                3.868            3.909
MethodHandlesDoWhileLoop.Invoke.baseline            10               16.480           16.461
MethodHandlesDoWhileLoop.Invoke.baseline            100              144.260          144.232
MethodHandlesDoWhileLoop.Invoke.baselineMH          1                14.434           14.494
MethodHandlesDoWhileLoop.Invoke.baselineMH          10               92.542           93.454
MethodHandlesDoWhileLoop.Invoke.baselineMH          100              877.480          880.496
MethodHandlesDoWhileLoop.Invoke.doWhileLoop         1                26.791           7.153
MethodHandlesDoWhileLoop.Invoke.doWhileLoop         10               158.985          16.990
MethodHandlesDoWhileLoop.Invoke.doWhileLoop         100              1391.746         130.946
MethodHandlesIteratedLoop.Create.create             N/A              13547.499        15478.542
MethodHandlesIteratedLoop.Invoke.baseline           0                2.973            2.980
MethodHandlesIteratedLoop.Invoke.baseline           1                6.771            6.658
MethodHandlesIteratedLoop.Invoke.baseline           10               14.955           14.955
MethodHandlesIteratedLoop.Invoke.baseline           100              81.842           82.582
MethodHandlesIteratedLoop.Invoke.baselineMH         0                14.893           14.668
MethodHandlesIteratedLoop.Invoke.baselineMH         1                20.998           21.304
MethodHandlesIteratedLoop.Invoke.baselineMH         10               73.677           72.703
MethodHandlesIteratedLoop.Invoke.baselineMH         100              613.913          614.475
MethodHandlesIteratedLoop.Invoke.iteratedLoop       0                33.583           9.603
MethodHandlesIteratedLoop.Invoke.iteratedLoop       1                82.239           14.433
MethodHandlesIteratedLoop.Invoke.iteratedLoop       10               448.356          38.650
MethodHandlesIteratedLoop.Invoke.iteratedLoop       100              4189.034         279.779
MethodHandlesLoop.Create.create                     N/A              15505.970        17559.399
MethodHandlesLoop.Invoke0.baseline                  1                3.179            3.181
MethodHandlesLoop.Invoke0.baseline                  10               5.952            6.115
MethodHandlesLoop.Invoke0.baseline                  100              50.942           50.943
MethodHandlesLoop.Invoke0.loop                      1                46.454           5.353
MethodHandlesLoop.Invoke0.loop                      10               514.230          8.487
MethodHandlesLoop.Invoke0.loop                      100              5166.251         52.188
MethodHandlesLoop.Invoke1.loop                      1                34.321           5.277
MethodHandlesLoop.Invoke1.loop                      10               430.839          8.481
MethodHandlesLoop.Invoke1.loop                      100              4095.302         52.206
MethodHandlesTryFinally.baselineExceptional         N/A              3.005            3.002
MethodHandlesTryFinally.baselineMHExceptional       N/A              166.316          166.087
MethodHandlesTryFinally.baselineMHNormal            N/A              9.337            9.276
MethodHandlesTryFinally.baselineNormal              N/A              2.696            2.683
MethodHandlesTryFinally.create                      N/A              406.255          406.594
MethodHandlesTryFinally.invokeTryFinallyExceptional N/A              154.121          154.692
MethodHandlesTryFinally.invokeTryFinallyNormal      N/A              5.350            5.334
MethodHandlesWhileLoop.Create.create                N/A              12214.383        14503.515
MethodHandlesWhileLoop.Invoke.baseline              0                3.886            3.888
MethodHandlesWhileLoop.Invoke.baseline              1                5.379            5.377
MethodHandlesWhileLoop.Invoke.baseline              10               16.000           16.201
MethodHandlesWhileLoop.Invoke.baseline              100              142.066          143.338
MethodHandlesWhileLoop.Invoke.baselineMH            0                11.028           11.012
MethodHandlesWhileLoop.Invoke.baselineMH            1                21.269           21.159
MethodHandlesWhileLoop.Invoke.baselineMH            10               97.493           97.656
MethodHandlesWhileLoop.Invoke.baselineMH            100              887.579          886.532
MethodHandlesWhileLoop.Invoke.whileLoop             0                24.829           7.108
MethodHandlesWhileLoop.Invoke.whileLoop             1                46.039           8.573
MethodHandlesWhileLoop.Invoke.whileLoop             10               240.963          21.088
MethodHandlesWhileLoop.Invoke.whileLoop             100              2092.671         159.016



-- 

 <http://www.oracle.com/>
Dr. Michael Haupt | Principal Member of Technical Staff
Phone: +49 331 200 7277 | Fax: +49 331 200 7561
Oracle Java Platform Group | LangTools Team | Nashorn
Oracle Deutschland B.V. & Co. KG | Schiffbauergasse 14 | 14467 Potsdam, Germany

ORACLE Deutschland B.V. & Co. KG | Hauptverwaltung: Riesstraße 25, D-80992 München
Registergericht: Amtsgericht München, HRA 95603

Komplementärin: ORACLE Deutschland Verwaltung B.V. | Hertogswetering 163/167, 3543 AS Utrecht, Niederlande
Handelsregister der Handelskammer Midden-Nederland, Nr. 30143697
Geschäftsführer: Alexander van der Ven, Jan Schultheiss, Val Maher
 <http://www.oracle.com/commitment>	Oracle is committed to developing practices and products that help protect the environment



More information about the core-libs-dev mailing list