couple questions on method handle combinators

Roland Westrelin rwestrel at redhat.com
Fri Jun 9 16:03:02 UTC 2017


I've been playing with method handle combinators and value types. Here
are 2 tests that I put together:

http://cr.openjdk.java.net/~roland/valhalla/combinators/webrev.00/

but they don't do what I want.

test77() runs fine but I noticed that if what test77_test() returns is
not constant then, test77_target1() and test_target2() are not inlined:

    876   82    b        compiler.valhalla.valuetypes.ValueTypeTestBench::test77 (8 bytes)
                            @ 4   java.lang.invoke.LambdaForm$MH/1308244637::invokeExact_MT (36 bytes)   force inline by annotation
                              @ 11   java.lang.invoke.Invokers::checkExactType (17 bytes)   force inline by annotation
                                @ 1   java.lang.invoke.MethodHandle::type (5 bytes)   accessor
                              @ 21   java.lang.invoke.Invokers::checkCustomized (23 bytes)   force inline by annotation
                                @ 1   java.lang.invoke.MethodHandleImpl::isCompileConstant (2 bytes)   (intrinsic)
                              @ 32   java.lang.invoke.LambdaForm$MH/597255128::guard (91 bytes)   force inline by annotation
                                @ 51   java.lang.invoke.LambdaForm$DMH/586617651::invokeVirtual (14 bytes)   force inline by annotation
                                  @ 1   java.lang.invoke.DirectMethodHandle::internalMemberName (8 bytes)   force inline by annotation
                                  @ 10   compiler.valhalla.valuetypes.ValueTypeTestBench::test77_test (5 bytes)   accessor
               !                @ 63   java.lang.invoke.MethodHandleImpl::profileBoolean (34 bytes)   (intrinsic)
                                @ 79   java.lang.invoke.MethodHandleImpl::selectAlternative (8 bytes)   inline (hot)
                                @ 87   java.lang.invoke.MethodHandle::invokeBasic(L)Qjava/lang/__Value; (0 bytes)   receiver not constant

What I want is 2 inlined methods that return a value type and the 2
return values go through a merge point before the method handle call
returns. Anyone sees way to get that with guardWithTest or something
else?

test78() attempts to build a loop whose result is a value type but
creation of the loop combinator fails with:

java.lang.ExceptionInInitializerError
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:563)
        at com.sun.javatest.regtest.agent.MainWrapper$MainThread.run(MainWrapper.java:115)
        at java.base/java.lang.Thread.run(Thread.java:844)
Caused by: java.lang.IllegalStateException: java.lang.ClassNotFoundException: compiler.valhalla.valuetypes.My
        at java.base/java.lang.invoke.MethodHandles.makeIdentity(MethodHandles.java:3432)
        at java.base/java.lang.invoke.MethodHandles.identity(MethodHandles.java:3363)
        at java.base/java.lang.invoke.MethodHandles.countedLoop(MethodHandles.java:5524)
        at java.base/java.lang.invoke.MethodHandles.countedLoop(MethodHandles.java:5389)
        at compiler.valhalla.valuetypes.ValueTypeTestBench.<clinit>(ValueTypeTestBench.java:2314)
        ... 6 more
Caused by: java.lang.ClassNotFoundException: compiler.valhalla.valuetypes.My
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:553)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:486)
        at java.base/java.lang.Class.forName0(Native Method)
        at java.base/java.lang.Class.forName(Class.java:374)
        at java.base/valhalla.shady.MinimalValueTypes_1_0.getValueCapableClass(MinimalValueTypes_1_0.java:81)
        at java.base/java.lang.invoke.MethodHandles.makeIdentity(MethodHandles.java:3430)
        ... 10 more

Anyone has any idea how to build the loop combinator?

Roland.


More information about the valhalla-dev mailing list