hg: valhalla/valhalla/langtools: Add support for tracking 'any'-related opcodes

Remi Forax forax at univ-mlv.fr
Thu Jul 24 18:38:03 UTC 2014


On 07/24/2014 07:33 PM, Maurizio Cimadamore wrote:
>
> On 24/07/14 18:00, Remi Forax wrote:
>>
>> On 07/24/2014 06:35 PM, Maurizio Cimadamore wrote:
>>>
>>> On 24/07/14 17:19, Remi Forax wrote:
>>>>
>>>> On 07/24/2014 03:21 PM, Maurizio Cimadamore wrote:
>>>>> Hi Remi,
>>>>> thanks for the comments. This is an initial prototype to get 
>>>>> things going and unblock the work on the specializer. The current 
>>>>> support will be enough to compile simple classes such as Box (in 
>>>>> Brian's document).
>>>>>
>>>>> Said that, opcodes such as dup/pop can easily be added in the 
>>>>> current code by adding more 'cases' to the filtering switch.
>>>>>
>>>>> areturn is there - but it's generated in a different code path - 
>>>>> see Gen.visitReturn.
>>>>>
>>>>> For opcodes such as new and newarray, we need to have unerased 
>>>>> expression types being saved by javac somewhere, so that was a bit 
>>>>> beyond the scope of this patch.
>>>>
>>>> new if different of anewarray, i don't think you can specialize new.
>>>> anewarray is equivalent to getfield, the syntax use an internal 
>>>> name instead of a descriptor which is an historical glitch in my 
>>>> opinion
>>>> but if you know how to specialize getfield, you know how to 
>>>> specialize anewarray.
>>> I said new - because there will need to be something if you do
>>>
>>> new ArrayList<int>
>>>
>>> in order to point back at the unerased info. This will become 
>>> something else in the long run, but for now tagging 'new' will make 
>>> sure that the specializer will have a chance to rewrite the name of 
>>> the class to be instantiated.
>>
>> I see, but this code is not specializable.
>> In my opinion, new ArrayList<int> should be rewritten to use 
>> invokedynamic, here is why.
>>
>> I think the specializer as you call it should work at runtime, 
>> otherwise we will run in exactly the same trouble we have with inner 
>> classes,
>> binary compatibility being the biggest issue.
>> So there is an issue if you generate ArrayList<int> at runtime, it 
>> doesn't exit at compile time :)
>> so you can not have a name to insert in the bytecode.
>>
>> For me, ArrayList<int> or ArrayList<double> should be erased as 
>> Object (exactly like the supertype of int[] and double[] is Object),
>> and the type argument should be sent as a bootstrap argument to a 
>> special invokedynamic.
>>
>> basically
>>   new ArrayList<int>
>> can be trasformed to
>>   invokedynamic <init> ()Ljava/lang/Object;  [ int.class ]
>>
>> likewise, any method call on ArrayList<int> should be an invokedynamic.
>>
>> With that, at runtime, in the bootstrap method, you can ask the 
>> specializer to generate specialized class only when needed,
>> i.e the first time a constructor is called.
> In time, an approach similar to the one you describe will be used - in 
> the meantime, we'd like to get more experience with these features by 
> using an offline specializer that goes through the bytecode and spits 
> specialized versions of the classfiles.

while I understand that you want to find the best class file format and 
how to verify it, how from that to specialize a class, etc,
i think that wrestling with the Java classloading monster is as 
important and should be done sooner than later.

>>
>>
>>>>
>>>>>
>>>>> Regarging comparisons - the first issue is that type-checking 
>>>>> support for comparisons involving 'any' type-variable is not there 
>>>>> yet - i.e. the compiler will reject it as of now. Once that's 
>>>>> allowed, you will be able to compare T with T but not T with int 
>>>>> (similarly as you cannot compare an ordinary type-variable with a 
>>>>> string). In other words, I don't believe equals() will ever be 
>>>>> generated - i.e. the compiler will always use if_acmpeq and the 
>>>>> likes, which will be tagged, eventually, in the bytecode.
>>>>
>>>> I was thinking about the opposite,
>>>> <any T> void m(T t1, t t2) {
>>>>   return t1.equals(t2);
>>>> }
>>>>
>>>> does this code should use if_icmpeq if T is specialized with T=int.
>>>
>>> The code above doesn't compile. It doesn't make sense (at least for 
>>> now) to speak about members of an 'any' type-variable, so there's no 
>>> equals in T.
>>
>> so practically there will be at least two codes by method, the one 
>> that takes an Object because you can do equals on it
>> and the one that takes any that will use ==.
> That's the status of the current (very early) prototype. Nothing is 
> set in stone at this point - but it seems like a stable design choice.

I'm not saying it's bad, i think it's better than what i was thinking :)

>
> Maurizio

Rémi



More information about the valhalla-dev mailing list