Limitations of the Calling Convention Optimization
Brian Goetz
brian.goetz at oracle.com
Fri Oct 23 12:42:42 UTC 2020
So, confirming: we can have multiple calling conventions for a given
method, but for a given _call site_, we choose a CC at linkage time and
we have to stick with that. Correct?
An "easy" case in Maurizio's library is something like this:
sealed interface X permits Val { }
primitive class Val implements X { }
X makeVal() { return new Val(); }
Here, we are always returning a non-null Val. So ideally, we'd like
invocations
Val v = makeVal()
to scalarize. But the method descriptor is `()LX;`, and, at linkage
time, we can't guarantee `X` has been loaded, which means we can't
observe that Val is the only subtype of X. So what you need is:
- X and Val have to have been loaded at linkage time;
- we need some confidence that `makeVal()` always returns a non-null
value.
Does this capture what you're saying?
> Hi Brian,
>
> On 21.10.20 20:25, Brian Goetz wrote:
>> Let's try and invert the question. Rather than beating up the JIT guys with "Y U no scalarize",
>> let's ask: what information would the JIT need (and _when_) in order to routinely scalarize methods
>> like this?
> With the current implementation, we would need the following information to scalarize interface
> arguments and returns:
> - A signal to load the type at method link time (John already elaborated on this [1]) and the
> information that it's a sealed interface with a single inline type implementor which also needs to
> be loaded.
> - A guarantee that the argument/return is null free OR the expectation that passing null will be
> slow (deoptimization -> execution in the interpreter).
>
> Best regards,
> Tobias
>
> [1] https://mail.openjdk.java.net/pipermail/valhalla-dev/2020-October/008141.html
More information about the valhalla-dev
mailing list