changeset 6666:49cd16dfb10c

fix lock-related assertion in PEA
author Lukas Stadler <lukas.stadler@jku.at>
date Tue, 06 Nov 2012 10:01:17 +0100
parents 6b71c116b370
children eaca0ecbf0ca
files graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewArrayNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewInstanceNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/EscapeOp.java graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/nodes/MaterializeObjectNode.java graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/BlockState.java graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java
diffstat 6 files changed, 29 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewArrayNode.java	Mon Nov 05 12:58:32 2012 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewArrayNode.java	Tue Nov 06 10:01:17 2012 +0100
@@ -125,6 +125,11 @@
                     public VirtualObjectNode virtualObject(long virtualId) {
                         return new VirtualArrayNode(virtualId, elementType, constantLength);
                     }
+
+                    @Override
+                    public int lockCount() {
+                        return 0;
+                    }
                 };
             }
         }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewInstanceNode.java	Mon Nov 05 12:58:32 2012 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewInstanceNode.java	Tue Nov 06 10:01:17 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;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/EscapeOp.java	Mon Nov 05 12:58:32 2012 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/EscapeOp.java	Tue Nov 06 10:01:17 2012 +0100
@@ -34,4 +34,6 @@
 
     public abstract VirtualObjectNode virtualObject(long virtualId);
 
+    public abstract int lockCount();
+
 }
--- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/nodes/MaterializeObjectNode.java	Mon Nov 05 12:58:32 2012 +0100
+++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/nodes/MaterializeObjectNode.java	Tue Nov 06 10:01:17 2012 +0100
@@ -35,12 +35,12 @@
 
     @Input private final NodeInputList<ValueNode> 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;
+            }
         };
     }
 
--- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/BlockState.java	Mon Nov 05 12:58:32 2012 +0100
+++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/BlockState.java	Tue Nov 06 10:01:17 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();
--- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java	Mon Nov 05 12:58:32 2012 +0100
+++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java	Tue Nov 06 10:01:17 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);