# HG changeset patch # User Gilles Duboscq # Date 1352206747 -3600 # Node ID eaca0ecbf0ca5ce4805fb1037be0fd0450c5222f # Parent e54aeb000ad764c470eeb05ae79187b1e3f63752# Parent 49cd16dfb10c17c6fb3767c51e13020301f6cb37 Merge diff -r e54aeb000ad7 -r eaca0ecbf0ca graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewArrayNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewArrayNode.java Tue Nov 06 13:57:04 2012 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewArrayNode.java Tue Nov 06 13:59:07 2012 +0100 @@ -125,6 +125,11 @@ public VirtualObjectNode virtualObject(long virtualId) { return new VirtualArrayNode(virtualId, elementType, constantLength); } + + @Override + public int lockCount() { + return 0; + } }; } } diff -r e54aeb000ad7 -r eaca0ecbf0ca graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewInstanceNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewInstanceNode.java Tue Nov 06 13:57:04 2012 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewInstanceNode.java Tue Nov 06 13:59:07 2012 +0100 @@ -114,6 +114,11 @@ public VirtualObjectNode virtualObject(long virtualId) { return new VirtualInstanceNode(virtualId, instanceClass(), fields); } + + @Override + public int lockCount() { + return 0; + } }; } return null; diff -r e54aeb000ad7 -r eaca0ecbf0ca graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/EscapeOp.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/EscapeOp.java Tue Nov 06 13:57:04 2012 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/EscapeOp.java Tue Nov 06 13:59:07 2012 +0100 @@ -34,4 +34,6 @@ public abstract VirtualObjectNode virtualObject(long virtualId); + public abstract int lockCount(); + } diff -r e54aeb000ad7 -r eaca0ecbf0ca graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/nodes/MaterializeObjectNode.java --- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/nodes/MaterializeObjectNode.java Tue Nov 06 13:57:04 2012 +0100 +++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/nodes/MaterializeObjectNode.java Tue Nov 06 13:59:07 2012 +0100 @@ -35,12 +35,12 @@ @Input private final NodeInputList values; @Input private final VirtualObjectNode virtualObject; - private final boolean locked; + private final int lockCount; - public MaterializeObjectNode(VirtualObjectNode virtualObject, boolean locked) { + public MaterializeObjectNode(VirtualObjectNode virtualObject, int lockCount) { super(StampFactory.exactNonNull(virtualObject.type())); this.virtualObject = virtualObject; - this.locked = locked; + this.lockCount = lockCount; this.values = new NodeInputList<>(this, virtualObject.entryCount()); } @@ -54,7 +54,7 @@ if (virtualObject instanceof VirtualInstanceNode) { VirtualInstanceNode virtual = (VirtualInstanceNode) virtualObject; - NewInstanceNode newInstance = graph.add(new NewInstanceNode(virtual.type(), false, locked)); + NewInstanceNode newInstance = graph.add(new NewInstanceNode(virtual.type(), false, lockCount > 0)); this.replaceAtUsages(newInstance); graph.addAfterFixed(this, newInstance); @@ -73,9 +73,9 @@ ResolvedJavaType element = virtual.componentType(); NewArrayNode newArray; if (element.getKind() == Kind.Object) { - newArray = graph.add(new NewObjectArrayNode(element, ConstantNode.forInt(virtual.entryCount(), graph), false, locked)); + newArray = graph.add(new NewObjectArrayNode(element, ConstantNode.forInt(virtual.entryCount(), graph), false, lockCount > 0)); } else { - newArray = graph.add(new NewPrimitiveArrayNode(element, ConstantNode.forInt(virtual.entryCount(), graph), false, locked)); + newArray = graph.add(new NewPrimitiveArrayNode(element, ConstantNode.forInt(virtual.entryCount(), graph), false, lockCount > 0)); } this.replaceAtUsages(newArray); graph.addAfterFixed(this, newArray); @@ -116,6 +116,11 @@ public VirtualObjectNode virtualObject(long virtualId) { return virtualObject; } + + @Override + public int lockCount() { + return lockCount; + } }; } diff -r e54aeb000ad7 -r eaca0ecbf0ca graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/BlockState.java --- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/BlockState.java Tue Nov 06 13:57:04 2012 +0100 +++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/BlockState.java Tue Nov 06 13:59:07 2012 +0100 @@ -88,7 +88,7 @@ throw new BailoutException("array materialized with lock"); } - MaterializeObjectNode materialize = new MaterializeObjectNode(virtual, obj.getLockCount() > 0); + MaterializeObjectNode materialize = new MaterializeObjectNode(virtual, obj.getLockCount()); ValueNode[] values = new ValueNode[obj.getEntries().length]; materialize.setProbability(fixed.probability()); ValueNode[] fieldState = obj.getEntries(); diff -r e54aeb000ad7 -r eaca0ecbf0ca graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java --- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java Tue Nov 06 13:57:04 2012 +0100 +++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java Tue Nov 06 13:59:07 2012 +0100 @@ -97,7 +97,7 @@ for (int i = 0; i < fieldState.length; i++) { fieldState[i] = state.getScalarAlias(fieldState[i]); } - state.addObject(virtualObject, new ObjectState(virtualObject, fieldState, 0)); + state.addObject(virtualObject, new ObjectState(virtualObject, fieldState, op.lockCount())); state.addAndMarkAlias(virtualObject, (ValueNode) node, usages); effects.deleteFixedNode((FixedWithNextNode) node); virtualIds++; @@ -505,6 +505,7 @@ int virtual = 0; ObjectState startObj = states.get(0).getObjectState(object); int lockCount = startObj.getLockCount(); + boolean locksMatch = true; ValueNode singleValue = startObj.isVirtual() ? null : startObj.getMaterializedValue(); for (BlockState state : states) { ObjectState obj = state.getObjectState(object); @@ -516,9 +517,11 @@ singleValue = null; } } - assert obj.getLockCount() == lockCount : "mismatching lock counts"; + locksMatch &= obj.getLockCount() == lockCount; } + assert virtual < states.size() || locksMatch : "mismatching lock counts at " + merge; + if (virtual < states.size()) { if (singleValue == null) { PhiNode materializedValuePhi = new PhiNode(Kind.Object, merge);