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

Remi Forax forax at univ-mlv.fr
Thu Jul 24 16:19:00 UTC 2014

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 

> 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.

> Maurizio


> On 24/07/14 13:25, Remi Forax wrote:
>> Hi Maurizio,
>> I think you have miss several opcodes that also need to be marked as 
>> any,
>>   anewarray, areturn and i think dup, dup_x1, dup_x2  and pop
>> (I suppose than Object.equals will be used instead of if_acmpeq, 
>> if_acmpne)
>> Maybe you want to treat anewarray like opcodes getfield/invoke* but
>> in that case, either you need invokedynamic or a new bytecode ?
>> cheers,
>> Rémi
>> On 07/24/2014 01:26 PM, maurizio.cimadamore at oracle.com wrote:
>>> Changeset: bb57e20a33a4
>>> Author:    mcimadamore
>>> Date:      2014-07-24 12:22 +0100
>>> URL: 
>>> http://hg.openjdk.java.net/valhalla/valhalla/langtools/rev/bb57e20a33a4
>>> Add support for tracking 'any'-related opcodes
>>> *) Overhauled Items hierarchy (now field/methods have their own 
>>> classes)
>>> *) Add AnyItem to model a bytecode item associated with 'any' variables
>>> *) Add new BytecodeMapping attribute to map 'any'-related opcodes 
>>> back to the original (unerased) signature
>>> ! src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java
>>> ! src/share/classes/com/sun/tools/javac/jvm/Code.java
>>> ! src/share/classes/com/sun/tools/javac/jvm/Gen.java
>>> ! src/share/classes/com/sun/tools/javac/jvm/Items.java
>>> ! src/share/classes/com/sun/tools/javac/util/Names.java

More information about the valhalla-dev mailing list