changeset 13292:a8964e9bb948

GRAAL-635: PartialEscapeClosure.processNodeWithState should support all NodeWithState correctly
author Gilles Duboscq <duboscq@ssw.jku.at>
date Wed, 11 Dec 2013 16:28:15 +0100
parents 01fd11e44f73
children 5215f94f94ec
files graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/NodeWithState.java graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/VirtualUtil.java
diffstat 3 files changed, 20 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/NodeWithState.java	Wed Dec 11 14:23:58 2013 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/NodeWithState.java	Wed Dec 11 16:28:15 2013 +0100
@@ -26,4 +26,6 @@
 
 public interface NodeWithState {
     FrameState getState();
+
+    Node asNode();
 }
--- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java	Wed Dec 11 14:23:58 2013 +0100
+++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java	Wed Dec 11 16:28:15 2013 +0100
@@ -130,19 +130,14 @@
     }
 
     private void processNodeWithState(NodeWithState nodeWithState, final BlockT state, final GraphEffectList effects) {
-        FrameState stateAfter = nodeWithState.getState();
-        if (stateAfter != null) {
-            if (stateAfter.usages().count() > 1) {
-                if (nodeWithState instanceof StateSplit) {
-                    StateSplit split = (StateSplit) nodeWithState;
-                    stateAfter = (FrameState) stateAfter.copyWithInputs();
-                    split.setStateAfter(stateAfter);
-                } else {
-                    throw GraalInternalError.shouldNotReachHere();
-                }
+        FrameState frameState = nodeWithState.getState();
+        if (frameState != null) {
+            if (frameState.usages().count() > 1) {
+                nodeWithState.asNode().replaceFirstInput(frameState, frameState.copyWithInputs());
+                frameState = nodeWithState.getState();
             }
             final HashSet<ObjectState> virtual = new HashSet<>();
-            stateAfter.applyToNonVirtual(new NodeClosure<ValueNode>() {
+            frameState.applyToNonVirtual(new NodeClosure<ValueNode>() {
 
                 @Override
                 public void apply(Node usage, ValueNode value) {
@@ -203,7 +198,7 @@
                 } else {
                     v = new MaterializedObjectState(obj.virtual, obj.getMaterializedValue());
                 }
-                effects.addVirtualMapping(stateAfter, v);
+                effects.addVirtualMapping(frameState, v);
             }
         }
     }
--- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/VirtualUtil.java	Wed Dec 11 14:23:58 2013 +0100
+++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/VirtualUtil.java	Wed Dec 11 16:28:15 2013 +0100
@@ -91,18 +91,24 @@
         boolean success = true;
         for (Node node : obsoleteNodes) {
             if (flood.isMarked(node)) {
-                TTY.print("offending node path:");
+                TTY.println("offending node path:");
                 Node current = node;
-                while (current != null) {
-                    TTY.println(current.toString());
+                TTY.print(current.toString());
+                while (true) {
                     current = path.get(current);
-                    if (current != null && current instanceof FixedNode && !obsoleteNodes.contains(current)) {
-                        break;
+                    if (current != null) {
+                        TTY.print(" -> " + current.toString());
+                        if (current instanceof FixedNode && !obsoleteNodes.contains(current)) {
+                            break;
+                        }
                     }
                 }
                 success = false;
             }
         }
+        if (!success) {
+            TTY.println();
+        }
         return success;
     }