It seems to work :) Same code for the PIC, with a different test code: https://gist.github.com/forax/2ea146eacaf5608cec93e8066e9ae665
with: /usr/jdk/jdk-9/bin/java -XX:-BackgroundCompilation -XX:-UseOnStackReplacement -XX:+PrintCompilation -Xpatch:java.base=../classes -m java.base/java.lang.invoke.FunPIC When the deopt() is called because test() see an URL instead of a String, you can see in the trace below that just after "deopt 1", test() is "made not entrant", but you can not see the same message for test2(). So only the inline blob that see an URL is deoptimized and not all blobs that share the same PIC. very good idea, John ! i believe a PIC like that should be added to java.lang.invoke.MethodHandles. Rémi deopt 0 325 409 n 0 java.lang.invoke.MethodHandle::invokeBasic(LL)I (native) 325 410 n 0 java.lang.invoke.MethodHandle::linkToSpecial(LLLL)I (native) (static) 326 411 b 3 java.util.HashMap$ValueIterator::next (8 bytes) 326 412 n 0 java.lang.invoke.MethodHandle::invokeBasic(L)I (native) 326 413 n 0 java.lang.invoke.MethodHandle::linkToSpecial(LLL)I (native) (static) 327 414 b 1 java.lang.invoke.MethodHandleImpl::isCompileConstant (2 bytes) 327 415 b 3 java.lang.invoke.DirectMethodHandle::internalMemberName (8 bytes) 328 416 b 3 java.lang.invoke.Invokers::checkCustomized (23 bytes) 328 417 b 3 java.lang.invoke.Invokers::maybeCustomize (28 bytes) 328 418 b 3 java.lang.invoke.LambdaForm$MH/1836643189::invokeExact_MT (23 bytes) 329 419 n 0 java.lang.Class::isInstance (native) 329 420 b 3 java.lang.invoke.LambdaForm$BMH/429313384::reinvoke (25 bytes) 329 421 b 3 java.lang.invoke.LambdaForm$DMH/344560770::invokeSpecial_LL_L (15 bytes) 330 422 b 3 java.lang.Class::cast (27 bytes) 330 423 b 3 java.lang.invoke.FunPIC::m (78 bytes) 331 424 !b 3 java.lang.invoke.FunPIC::test (15 bytes) 332 425 !b 3 java.lang.invoke.FunPIC::test2 (15 bytes) 335 426 !b 4 java.lang.invoke.FunPIC::test (15 bytes) 336 424 ! 3 java.lang.invoke.FunPIC::test (15 bytes) made not entrant 336 427 !b 4 java.lang.invoke.FunPIC::test2 (15 bytes) 337 425 ! 3 java.lang.invoke.FunPIC::test2 (15 bytes) made not entrant deopt 1 340 426 ! 4 java.lang.invoke.FunPIC::test (15 bytes) made not entrant 340 428 b 4 java.lang.invoke.LambdaForm$DMH/166239592::invokeStatic_LL_I (15 bytes) 341 429 b 4 java.lang.invoke.FunPIC::typeCheck (14 bytes) 341 430 b 4 java.lang.invoke.LambdaForm$DMH/1967205423::invokeStatic_L_I (14 bytes) 343 431 b 3 java.lang.StringLatin1::inflate (34 bytes) 343 432 !b 4 java.lang.invoke.FunPIC::test (15 bytes) 500000 ----- Mail original ----- > De: "Remi Forax" <fo...@univ-mlv.fr> > À: "Da Vinci Machine Project" <mlvm-dev@openjdk.java.net> > Envoyé: Samedi 23 Juillet 2016 12:39:08 > Objet: Re: InvokeDynamic PIC Slowdown (deopt issue?) need advice > At least the PIC usual test seems to work :) > > https://gist.github.com/forax/7d1c06df9546baf9d98e8c0c1f255e05 > > The instructions are for JDK9 and i've put the class in java.lang.invoke to > access to the annotations @Stable, @DontInline and @ForceInline. > > Rémi > > ----- Mail original ----- >> De: "John Rose" <john.r.r...@oracle.com> >> À: "Da Vinci Machine Project" <mlvm-dev@openjdk.java.net> >> Envoyé: Samedi 23 Juillet 2016 01:25:32 >> Objet: Re: InvokeDynamic PIC Slowdown (deopt issue?) need advice > >> On May 31, 2016, at 12:41 PM, Mark Roos <mr...@roos.com> wrote: >>> >>> It looks like, from some fine timing, that each time the Smalltalk class >>> changes >>> there is a large amount >>> of time added to the call. Which I would expect if there was a deopt >>> whenever a >>> different GWT triggered. >>> There are 6 GWTs in this chain ( idleValue can be one of six Smalltalk >>> classes). >> >> Has anybody on this list played with using a short @Stable array to >> represent a >> PIC? >> Editing the PIC would involve changing the array instead of recompiling a >> call >> site. >> >> The effect would be to preserve existing inlinings of the PIC site (unless >> they >> self-invalidate) but allow the PIC to update itself over time as new cases >> arise. >> Previously compiled uses of the PIC would stay optimized as-is. >> >> The @Stable array would always have a series of zero or more non-null >> entries, >> followed by at least one null entry. The search in the @Stable array would >> inline >> and short-circuit over irrelevant PIC entries, if the pattern-matching logic >> were >> inlinable. Entries could be as simple as @Stable 2-arrays of guard MH and >> target MH. >> (If they are objects, some care with TrustFinalFields would also be needed.) >> >> Using this technique would probably lead to fewer deopts. The @Stable array >> could >> also be shared by several PIC sites, if that helps with footprint. >> >> class PIC { >> @Stable final MethodHandle[][] cache = new MethodHandle[PIC_SIZE+1][]; >> // cache[0] = new MethodHandle[] { guard, target }, etc. >> // cache[cache.length-1] is either null or some permanent catch-all logic >> } >> >> — John >> _______________________________________________ >> mlvm-dev mailing list >> mlvm-dev@openjdk.java.net >> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev > _______________________________________________ > mlvm-dev mailing list > mlvm-dev@openjdk.java.net > http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev _______________________________________________ mlvm-dev mailing list mlvm-dev@openjdk.java.net http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev