>> For JEP 348, this is an opportunistic >> optimization; for 303, it is essential functionality (the call can’t proceed >> un-intrinsified.) And, for the indy() intrinsic, it simply cannot live >> without >> the constant folding and propagation. So separating those aspects is not >> practical. > > yes, on paper, but for JEP 348 you also need to know if the arguments of an > intrinsics are constant or not.
Silly Remi, you’ve gotten confused by the difference between “constant” and “constant” :) JEP 303 defines a broader, separate notion of “intrinsifiable constant”, which is deliberately different from “constant expression”. JEP 348 only needs to know about the weaker, already-present notion of constant expression. The intrinsic for indy() is useless without the broader form, but we can optimize String.format just fine without it. >> The two differ dramatically in their spec impact, as well. 348 requires >> little >> more than permission to redirect the translation for specific methods; 303 is >> much more deeply intrusive. > > We can pull the VarHandle trick ! > Instead of specifying the semantics of Intrinsics.ldc/invokedynamic in the > JLS which is as you said intrusive, you can move the spec part in the javadoc > by transforming the compile time error to a runtime one. > If the arguments of Intrinsics.ldc/invokedynamic are not constant, the > compiler can still generate an indy call that will verify at runtime that the > arguments are constants (technically by verifying that methods are always > called with the same instances doing pointer checks). So we have moved > compile errors to runtime errors which is objectively bad but we have at the > same time avoided big change of the JLS by transforming > Intrinsics.ldc/invokedynamic to API point only. Ah, now you reveal your actual goal — to ship the indy() intrinsic sooner :) I really wish you’d lead with this stuff :) This is a clever trick, but results in a measurably worse feature, since with constant folding it is easy to get wrong, and getting compile-time help is pretty valuable. > We may still need enhanced constant folding but that's another concern. No, you will absolutely need enhanced folding to make it work; making an IndyRef requires making MethodTypeRefs, MethodHandleRefs, etc. (And even if we tried to special-case the “build it all at once” case, without error messages at compile time to tell you when you messed up, it would be a very frustrating feature to use.)