# HG changeset patch # User Christian Wimmer # Date 1354236824 28800 # Node ID 5c25483b5515b1f5a64c9f4ca07cc9ab24bcae42 # Parent 0c59b76e6689b32b810539509654c2c564eadb82 Remove the ResolvedJavaType.Representation for static fields. It is not necessary to emit the constant holder for static fields in the GraphBuilder. Only the VM-specific lowering needs to create the constants, and it can access the VM-specific metadata objects directly. diff -r 0c59b76e6689 -r 5c25483b5515 graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/ResolvedJavaType.java --- a/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/ResolvedJavaType.java Thu Nov 29 15:05:39 2012 -0800 +++ b/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/ResolvedJavaType.java Thu Nov 29 16:53:44 2012 -0800 @@ -38,16 +38,6 @@ */ public enum Representation { /** - * The runtime representation of the data structure containing the static primitive fields of this type. - */ - StaticPrimitiveFields, - - /** - * The runtime representation of the data structure containing the static object fields of this type. - */ - StaticObjectFields, - - /** * The runtime representation of the Java class object of this type. */ JavaClass, diff -r 0c59b76e6689 -r 5c25483b5515 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaField.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaField.java Thu Nov 29 15:05:39 2012 -0800 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaField.java Thu Nov 29 16:53:44 2012 -0800 @@ -27,7 +27,6 @@ import java.lang.reflect.*; import com.oracle.graal.api.meta.*; -import com.oracle.graal.api.meta.ResolvedJavaType.*; import com.oracle.graal.hotspot.*; import com.oracle.graal.nodes.extended.*; import com.oracle.graal.phases.*; @@ -101,8 +100,7 @@ if (receiver == null) { assert Modifier.isStatic(flags); if (holder.isInitialized()) { - Constant encoding = holder.getEncoding(getKind() == Kind.Object ? Representation.StaticObjectFields : Representation.StaticPrimitiveFields); - return ReadNode.readUnsafeConstant(getKind(), encoding.asObject(), offset); + return ReadNode.readUnsafeConstant(getKind(), holder.mirror(), offset); } return null; } else { @@ -116,7 +114,7 @@ } @Override - public ResolvedJavaType getDeclaringClass() { + public HotSpotResolvedObjectType getDeclaringClass() { return holder; } diff -r 0c59b76e6689 -r 5c25483b5515 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedObjectType.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedObjectType.java Thu Nov 29 15:05:39 2012 -0800 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedObjectType.java Thu Nov 29 16:53:44 2012 -0800 @@ -249,9 +249,6 @@ return Constant.forObject(javaMirror); case ObjectHub: return klass(); - case StaticPrimitiveFields: - case StaticObjectFields: - return Constant.forObject(javaMirror); default: assert false : "Should not reach here."; return null; diff -r 0c59b76e6689 -r 5c25483b5515 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Thu Nov 29 15:05:39 2012 -0800 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Thu Nov 29 16:53:44 2012 -0800 @@ -485,13 +485,14 @@ callTarget.replaceAndDelete(loweredCallTarget); } } else if (n instanceof LoadFieldNode) { - LoadFieldNode field = (LoadFieldNode) n; - int displacement = ((HotSpotResolvedJavaField) field.field()).offset(); - assert field.kind() != Kind.Illegal; - ReadNode memoryRead = graph.add(new ReadNode(field.object(), LocationNode.create(field.field(), field.field().getKind(), displacement, graph), field.stamp())); - memoryRead.dependencies().add(tool.createNullCheckGuard(field.object(), field.leafGraphId())); - graph.replaceFixedWithFixed(field, memoryRead); - if (field.isVolatile()) { + LoadFieldNode loadField = (LoadFieldNode) n; + HotSpotResolvedJavaField field = (HotSpotResolvedJavaField) loadField.field(); + ValueNode object = loadField.isStatic() ? ConstantNode.forObject(field.getDeclaringClass().mirror(), this, graph) : loadField.object(); + assert loadField.kind() != Kind.Illegal; + ReadNode memoryRead = graph.add(new ReadNode(object, LocationNode.create(field, field.getKind(), field.offset(), graph), loadField.stamp())); + memoryRead.dependencies().add(tool.createNullCheckGuard(object, loadField.leafGraphId())); + graph.replaceFixedWithFixed(loadField, memoryRead); + if (loadField.isVolatile()) { MembarNode preMembar = graph.add(new MembarNode(JMM_PRE_VOLATILE_READ)); graph.addBeforeFixed(memoryRead, preMembar); MembarNode postMembar = graph.add(new MembarNode(JMM_POST_VOLATILE_READ)); @@ -500,8 +501,9 @@ } else if (n instanceof StoreFieldNode) { StoreFieldNode storeField = (StoreFieldNode) n; HotSpotResolvedJavaField field = (HotSpotResolvedJavaField) storeField.field(); - WriteNode memoryWrite = graph.add(new WriteNode(storeField.object(), storeField.value(), LocationNode.create(field, field.getKind(), field.offset(), graph))); - memoryWrite.dependencies().add(tool.createNullCheckGuard(storeField.object(), storeField.leafGraphId())); + ValueNode object = storeField.isStatic() ? ConstantNode.forObject(field.getDeclaringClass().mirror(), this, graph) : storeField.object(); + WriteNode memoryWrite = graph.add(new WriteNode(object, storeField.value(), LocationNode.create(field, field.getKind(), field.offset(), graph))); + memoryWrite.dependencies().add(tool.createNullCheckGuard(object, storeField.leafGraphId())); memoryWrite.setStateAfter(storeField.stateAfter()); graph.replaceFixedWithFixed(storeField, memoryWrite); FixedWithNextNode last = memoryWrite; diff -r 0c59b76e6689 -r 5c25483b5515 graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java --- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Thu Nov 29 15:05:39 2012 -0800 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Thu Nov 29 16:53:44 2012 -0800 @@ -832,37 +832,28 @@ } private void genGetStatic(JavaField field) { - JavaType holder = field.getDeclaringClass(); - boolean isInitialized = (field instanceof ResolvedJavaField) && ((ResolvedJavaType) holder).isInitialized(); - Constant constantValue = null; - if (isInitialized) { - constantValue = ((ResolvedJavaField) field).readConstantValue(null); - } - if (constantValue != null) { - frameState.push(constantValue.getKind().getStackKind(), appendConstant(constantValue)); + Kind kind = field.getKind(); + if (field instanceof ResolvedJavaField && ((ResolvedJavaType) field.getDeclaringClass()).isInitialized()) { + Constant constantValue = ((ResolvedJavaField) field).readConstantValue(null); + if (constantValue != null) { + frameState.push(constantValue.getKind().getStackKind(), appendConstant(constantValue)); + } else { + LoadFieldNode load = currentGraph.add(new LoadFieldNode(null, (ResolvedJavaField) field, graphId)); + appendOptimizedLoadField(kind, load); + } } else { - ValueNode container = genTypeOrDeopt(field.getKind() == Kind.Object ? Representation.StaticObjectFields : Representation.StaticPrimitiveFields, holder, isInitialized); - Kind kind = field.getKind(); - if (container != null) { - LoadFieldNode load = currentGraph.add(new LoadFieldNode(container, (ResolvedJavaField) field, graphId)); - appendOptimizedLoadField(kind, load); - } else { - // deopt will be generated by genTypeOrDeopt, not needed here - frameState.push(kind.getStackKind(), append(ConstantNode.defaultForKind(kind, currentGraph))); - } + append(currentGraph.add(new DeoptimizeNode(DeoptimizationAction.InvalidateRecompile, DeoptimizationReason.Unresolved, graphId))); + frameState.push(kind.getStackKind(), append(ConstantNode.defaultForKind(kind, currentGraph))); } } private void genPutStatic(JavaField field) { - JavaType holder = field.getDeclaringClass(); - boolean isInitialized = (field instanceof ResolvedJavaField) && ((ResolvedJavaType) holder).isInitialized(); - ValueNode container = genTypeOrDeopt(field.getKind() == Kind.Object ? Representation.StaticObjectFields : Representation.StaticPrimitiveFields, holder, isInitialized); ValueNode value = frameState.pop(field.getKind().getStackKind()); - if (container != null) { - StoreFieldNode store = currentGraph.add(new StoreFieldNode(container, (ResolvedJavaField) field, value, graphId)); + if (field instanceof ResolvedJavaField && ((ResolvedJavaType) field.getDeclaringClass()).isInitialized()) { + StoreFieldNode store = currentGraph.add(new StoreFieldNode(null, (ResolvedJavaField) field, value, graphId)); appendOptimizedStoreField(store); } else { - // deopt will be generated by genTypeOrDeopt, not needed here + append(currentGraph.add(new DeoptimizeNode(DeoptimizationAction.InvalidateRecompile, DeoptimizationReason.Unresolved, graphId))); } } diff -r 0c59b76e6689 -r 5c25483b5515 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/AccessFieldNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/AccessFieldNode.java Thu Nov 29 15:05:39 2012 -0800 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/AccessFieldNode.java Thu Nov 29 16:53:44 2012 -0800 @@ -100,7 +100,7 @@ @Override public boolean verify() { - assertTrue(object != null, "Access object can not be null"); + assertTrue((object == null) == isStatic(), "static field must not have object, instance field must have object"); return super.verify(); } }