Mercurial > hg > graal-jvmci-8
changeset 5682:f787843c890c
implemented inferStamp for NewInstanceStubCall to infer exact, non-null stamp from constant hub value
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Fri, 22 Jun 2012 10:43:06 +0200 |
parents | b32dc49bc024 |
children | 0ca242de9383 |
files | graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotKlassOop.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaType.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotTypePrimitive.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/NewInstanceStubCall.java src/share/vm/graal/graalCodeInstaller.cpp src/share/vm/graal/graalJavaAccess.hpp |
diffstat | 6 files changed, 31 insertions(+), 15 deletions(-) [+] |
line wrap: on
line diff
--- 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() + ">"; } }
--- 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; }
--- 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
--- 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));
--- 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 {
--- 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;") \