# HG changeset patch # User Gilles Duboscq # Date 1340288819 -7200 # Node ID a65b2a11bf343a718d89ca554e5d2916dc372541 # Parent 29684ae5a194b8e0feaf2cb1b5baf765cacc1683 Fix for peeling and VirtualStateNode FrameState.applyToNonVirtual now applies to outter framestates and give usage node in the closure diff -r 29684ae5a194 -r a65b2a11bf34 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/DebugInfoBuilder.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/DebugInfoBuilder.java Wed Jun 20 16:59:47 2012 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/DebugInfoBuilder.java Thu Jun 21 16:26:59 2012 +0200 @@ -153,7 +153,7 @@ } else if (value != null) { Debug.metric("StateVariables").increment(); Value operand = nodeOperands.get(value); - assert operand != null && (operand instanceof Variable || operand instanceof Constant) : operand; + assert operand != null && (operand instanceof Variable || operand instanceof Constant) : operand + " for " + value; return operand; } else { diff -r 29684ae5a194 -r a65b2a11bf34 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/loop/LoopFragmentInside.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/loop/LoopFragmentInside.java Wed Jun 20 16:59:47 2012 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/loop/LoopFragmentInside.java Thu Jun 21 16:26:59 2012 +0200 @@ -28,6 +28,7 @@ import com.oracle.graal.graph.*; import com.oracle.graal.graph.iterators.*; import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.VirtualState.NodeClosure; import com.oracle.graal.nodes.PhiNode.*; import com.oracle.graal.nodes.util.*; @@ -235,8 +236,8 @@ newExitMerge.addForwardEnd(end); } - for (PhiNode phi : loopBegin.phis().snapshot()) { - PhiNode firstPhi = graph.add(phi.type() == PhiType.Value ? new PhiNode(phi.kind(), newExitMerge) : new PhiNode(phi.type(), newExitMerge)); + for (final PhiNode phi : loopBegin.phis().snapshot()) { + final PhiNode firstPhi = graph.add(phi.type() == PhiType.Value ? new PhiNode(phi.kind(), newExitMerge) : new PhiNode(phi.type(), newExitMerge)); for (EndNode end : newExitMerge.forwardEnds()) { LoopEndNode loopEnd = reverseEnds.get(end); ValueNode prim = prim(phi.valueAt(loopEnd)); @@ -245,7 +246,15 @@ } ValueNode initializer = firstPhi; if (duplicateState != null) { - duplicateState.replaceFirstInput(phi, firstPhi); // fix the merge's state after + // fix the merge's state after + duplicateState.applyToNonVirtual(new NodeClosure() { + @Override + public void apply(Node from, ValueNode node) { + if (node == phi) { + from.replaceFirstInput(phi, firstPhi); + } + } + }); } mergedInitializers.put(phi, initializer); } diff -r 29684ae5a194 -r a65b2a11bf34 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/CheckCastSnippets.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/CheckCastSnippets.java Wed Jun 20 16:59:47 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/CheckCastSnippets.java Thu Jun 21 16:26:59 2012 +0200 @@ -34,7 +34,6 @@ import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.*; -import com.oracle.graal.compiler.phases.*; import com.oracle.graal.cri.*; import com.oracle.graal.debug.*; import com.oracle.graal.graph.*; diff -r 29684ae5a194 -r a65b2a11bf34 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/NewInstanceSnippets.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/NewInstanceSnippets.java Wed Jun 20 16:59:47 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/NewInstanceSnippets.java Thu Jun 21 16:26:59 2012 +0200 @@ -33,7 +33,6 @@ import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; -import com.oracle.graal.compiler.phases.*; import com.oracle.graal.cri.*; import com.oracle.graal.debug.*; import com.oracle.graal.graph.*; diff -r 29684ae5a194 -r a65b2a11bf34 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FrameState.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FrameState.java Wed Jun 20 16:59:47 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FrameState.java Thu Jun 21 16:26:59 2012 +0200 @@ -392,10 +392,13 @@ @Override public void applyToNonVirtual(NodeClosure< ? super ValueNode> closure) { for (ValueNode value : values.nonNull()) { - closure.apply(value); + closure.apply(this, value); } for (VirtualObjectState state : virtualObjectMappings) { state.applyToNonVirtual(closure); } + if (outerFrameState() != null) { + outerFrameState().applyToNonVirtual(closure); + } } } diff -r 29684ae5a194 -r a65b2a11bf34 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/VirtualState.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/VirtualState.java Wed Jun 20 16:59:47 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/VirtualState.java Thu Jun 21 16:26:59 2012 +0200 @@ -31,7 +31,7 @@ public abstract class VirtualState extends Node { public interface NodeClosure { - void apply(T node); + void apply(Node usage, T node); } public abstract VirtualState duplicateWithVirtualState(); diff -r 29684ae5a194 -r a65b2a11bf34 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/VirtualObjectState.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/VirtualObjectState.java Wed Jun 20 16:59:47 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/VirtualObjectState.java Thu Jun 21 16:26:59 2012 +0200 @@ -69,7 +69,7 @@ @Override public void applyToNonVirtual(NodeClosure< ? super ValueNode> closure) { for (ValueNode value : fieldValues) { - closure.apply(value); + closure.apply(this, value); } } }