# HG changeset patch # User Doug Simon # Date 1340354586 -7200 # Node ID f787843c890ca0b62325052f06dcc3f7b96d4040 # Parent b32dc49bc024cae82f323995bc21078d416d857b implemented inferStamp for NewInstanceStubCall to infer exact, non-null stamp from constant hub value diff -r b32dc49bc024 -r f787843c890c graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotKlassOop.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotKlassOop.java Thu Jun 21 17:33:45 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotKlassOop.java Fri Jun 22 10:43:06 2012 +0200 @@ -22,6 +22,8 @@ */ package com.oracle.graal.hotspot; +import com.oracle.graal.api.meta.*; + /** * A mechanism for safely conveying a HotSpot klassOop value from the compiler to the C++ code. * Such values should not be directly exposed to Java code as they are not real Java @@ -32,17 +34,14 @@ private static final long serialVersionUID = -5445542223575839143L; - /** - * The Java object from which the klassOop value can be derived (by the C++ code). - */ - public final Class javaMirror; + public final ResolvedJavaType type; - public HotSpotKlassOop(Class javaMirror) { - this.javaMirror = javaMirror; + public HotSpotKlassOop(ResolvedJavaType type) { + this.type = type; } @Override public String toString() { - return "HotSpotKlassOop<" + javaMirror.getName() + ">"; + return "HotSpotKlassOop<" + type.toJava().getName() + ">"; } } diff -r b32dc49bc024 -r f787843c890c graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaType.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaType.java Thu Jun 21 17:33:45 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaType.java Fri Jun 22 10:43:06 2012 +0200 @@ -27,6 +27,7 @@ import java.util.*; import com.oracle.graal.api.meta.*; +import com.oracle.graal.graph.*; import com.oracle.graal.hotspot.*; /** @@ -55,6 +56,7 @@ private ResolvedJavaType arrayOfType; private HotSpotResolvedJavaType() { + throw new GraalInternalError(HotSpotResolvedJavaType.class + " should only be created from C++ code"); } @Override @@ -267,7 +269,7 @@ @Override public synchronized HotSpotKlassOop klassOop() { if (klassOopCache == null) { - klassOopCache = new HotSpotKlassOop(javaMirror); + klassOopCache = new HotSpotKlassOop(this); } return klassOopCache; } diff -r b32dc49bc024 -r f787843c890c graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotTypePrimitive.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotTypePrimitive.java Thu Jun 21 17:33:45 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotTypePrimitive.java Fri Jun 22 10:43:06 2012 +0200 @@ -41,7 +41,7 @@ public HotSpotTypePrimitive(Kind kind) { this.kind = kind; this.name = String.valueOf(Character.toUpperCase(kind.typeChar)); - this.klassOop = new HotSpotKlassOop(kind.toJavaClass()); + this.klassOop = new HotSpotKlassOop(this); } @Override diff -r b32dc49bc024 -r f787843c890c graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/NewInstanceStubCall.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/NewInstanceStubCall.java Thu Jun 21 17:33:45 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/NewInstanceStubCall.java Fri Jun 22 10:43:06 2012 +0200 @@ -25,6 +25,7 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.gen.*; import com.oracle.graal.compiler.target.*; +import com.oracle.graal.hotspot.*; import com.oracle.graal.hotspot.target.*; import com.oracle.graal.lir.*; import com.oracle.graal.nodes.*; @@ -38,14 +39,26 @@ */ public class NewInstanceStubCall extends FixedWithNextNode implements LIRGenLowerable { + private static final Stamp defaultStamp = StampFactory.objectNonNull(); + @Input private final ValueNode hub; public NewInstanceStubCall(ValueNode hub) { - super(StampFactory.objectNonNull()); + super(defaultStamp); this.hub = hub; } @Override + public boolean inferStamp() { + if (stamp() == defaultStamp && hub.isConstant()) { + HotSpotKlassOop klassOop = (HotSpotKlassOop) this.hub.asConstant().asObject(); + updateStamp(StampFactory.exactNonNull(klassOop.type)); + return true; + } + return false; + } + + @Override public void generate(LIRGenerator gen) { Variable result = gen.newVariable(Kind.Object); gen.emitMove(gen.operand(hub), AMD64.rdx.asValue(Kind.Object)); diff -r b32dc49bc024 -r f787843c890c src/share/vm/graal/graalCodeInstaller.cpp --- a/src/share/vm/graal/graalCodeInstaller.cpp Thu Jun 21 17:33:45 2012 +0200 +++ b/src/share/vm/graal/graalCodeInstaller.cpp Fri Jun 22 10:43:06 2012 +0200 @@ -780,7 +780,9 @@ if (obj->is_a(HotSpotKlassOop::klass())) { assert(!obj.is_null(), ""); - *((jobject*) operand) = JNIHandles::make_local(java_lang_Class::as_klassOop(HotSpotKlassOop::javaMirror(obj))); + oop type = HotSpotKlassOop::type(obj); + klassOop klass = java_lang_Class::as_klassOop(HotSpotResolvedJavaType::javaMirror(type)); + *((jobject*) operand) = JNIHandles::make_local(klass); _instructions->relocate(instruction, oop_Relocation::spec_for_immediate(), Assembler::imm_operand); TRACE_graal_3("relocating (HotSpotJavaType) at %016x/%016x", instruction, operand); } else { diff -r b32dc49bc024 -r f787843c890c src/share/vm/graal/graalJavaAccess.hpp --- a/src/share/vm/graal/graalJavaAccess.hpp Thu Jun 21 17:33:45 2012 +0200 +++ b/src/share/vm/graal/graalJavaAccess.hpp Fri Jun 22 10:43:06 2012 +0200 @@ -56,10 +56,10 @@ boolean_field(HotSpotResolvedJavaType, isInstanceClass) \ boolean_field(HotSpotResolvedJavaType, isInterface) \ int_field(HotSpotResolvedJavaType, instanceSize) \ - end_class \ - start_class(HotSpotKlassOop) \ - oop_field(HotSpotKlassOop, javaMirror, "Ljava/lang/Class;") \ - end_class \ + end_class \ + start_class(HotSpotKlassOop) \ + oop_field(HotSpotKlassOop, type, "Lcom/oracle/graal/api/meta/ResolvedJavaType;") \ + end_class \ start_class(HotSpotResolvedJavaMethod) \ oop_field(HotSpotResolvedJavaMethod, name, "Ljava/lang/String;") \ oop_field(HotSpotResolvedJavaMethod, holder, "Lcom/oracle/graal/api/meta/ResolvedJavaType;") \