RFR: 8156916: intrinsify MethodHandles.arrayConstructor()

Chen Liang liach at openjdk.org
Sun Apr 30 22:04:27 UTC 2023


On Sun, 30 Apr 2023 06:14:28 GMT, Chen Liang <liach at openjdk.org> wrote:

> Try to intrinsify MethodHandles.arrayConstructor for java.lang, java.lang.invoke, and java.util types, which InvokerBytecodeGenerator can refer to directly in a class constant.
> 
> In fact, the performance difference of Array.newInstance and anewarray is quite negligible per benchmark:
> 
> Benchmark                                                            Mode  Cnt     Score     Error  Units
> MethodHandlesArrayConstructorCall.baselineConstruct                  avgt    5     3.467 ±   0.163  ns/op
> MethodHandlesArrayConstructorCall.constantFoldConstruct              avgt    5     3.403 ±   0.070  ns/op
> MethodHandlesArrayConstructorCall.constantFoldNonInvocableConstruct  avgt    5     3.445 ±   0.231  ns/op
> MethodHandlesArrayConstructorCall.instanceConstruct                  avgt    5     4.034 ±   0.168  ns/op
> MethodHandlesArrayConstructorCall.instanceNonInvocableConstruct      avgt    5     4.038 ±   0.104  ns/op
> MethodHandlesArrayConstructorColdStart.testCreateInvocable             ss   10  1425.991 ± 308.216  us/op
> MethodHandlesArrayConstructorColdStart.testCreateNonInvocable          ss   10  1401.480 ± 258.402  us/op
> MethodHandlesArrayConstructorColdStart.testCreateObject                ss   10  1213.018 ± 166.522  us/op
> MethodHandlesArrayConstructorColdStart.testCreatePrimitive             ss   10  1163.461 ± 178.549  us/op

src/java.base/share/classes/java/lang/invoke/MethodHandles.java line 4334:

> 4332:         MethodHandle ani = MethodHandleImpl.getConstantHandle(MethodHandleImpl.MH_Array_newInstance).
> 4333:                 bindTo(arrayClass.getComponentType());
> 4334:         return ani.asType(ani.type().changeReturnType(arrayClass));

Since `Array.newInstance` is already intrinsified, this patch should probably dropped and the issue be no longer valid. However, one nit I have is that we can convert this `asType` to `viewAsType(..., false)` since `Array.newInstance`'s return type is trusted.

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/13735#discussion_r1181301403


More information about the core-libs-dev mailing list