# HG changeset patch # User Gilles Duboscq # Date 1386775695 -3600 # Node ID a8964e9bb9483cea1d2051b3c0c20dba191fea0f # Parent 01fd11e44f731f9b1ac27e201e60c6780bc7d3ef GRAAL-635: PartialEscapeClosure.processNodeWithState should support all NodeWithState correctly diff -r 01fd11e44f73 -r a8964e9bb948 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/NodeWithState.java --- 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(); } diff -r 01fd11e44f73 -r a8964e9bb948 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 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 virtual = new HashSet<>(); - stateAfter.applyToNonVirtual(new NodeClosure() { + frameState.applyToNonVirtual(new NodeClosure() { @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); } } } diff -r 01fd11e44f73 -r a8964e9bb948 graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/VirtualUtil.java --- 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; }