Limitations of the Calling Convention Optimization

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Wed Oct 21 19:58:40 UTC 2020


On 21/10/2020 19:25, Brian Goetz wrote:
>
>>
>> Unfortunately, the problematic idioms referred to in this thread 
>> shows up quite a bit throughout the API; these are only some of the 
>> methods which return new instances of these classes:
>>
>> For instance, in MemoryAddress we find the following methods:
>>
>> MemoryAddress addOffset(long offset); // returns _new_ address with 
>> given offset from existing one
>> static MemoryAddress ofLong(long value); // create _new_ address with 
>> given long value
>
> 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?
>
> It seems that one part of it is knowing that these will never return a 
> null reference.  Here's one way we might express this constraint in 
> source code, using idioms the language already has:
>
>     sealed interface MA permits Impl { MA offset(long offset); }
>
>     primitive class Impl implements MA {
>         @Override        // covariant override
>         Impl addOffset(long offset) { ... }
>     }
>
> From a language perspective, this makes sense to developers (and, this 
> is hidden in the implementation); we're returning a more constrained 
> type, which the language already allows.  Ignoring the translation 
> story here (MA::offset and Impl::offset might have different 
> descriptors, bridge methods, yada yada), would having information like 
> this strewn throughout the implementation be sufficient to hint the 
> JIT that no nulls will be forthcoming?
>
>
I tried this - I couldn't get it to work - the compiler complains if you 
try that.

Also, while this works for return types, it doesn't scale to parameters, 
right?

Maurizio




More information about the valhalla-dev mailing list