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