# HG changeset patch # User Gilles Duboscq # Date 1380103684 -7200 # Node ID 4fc75b6ca3dda368a5f10b1b1454d5e3a95e7178 # Parent 4f0e0602c1c781dcab8b84029e2c2cf45def3253 Introduce NodeWithState for nodes that hold some VirtualState. Use this interface in the required special cases (Scheduling and PEA) diff -r 4f0e0602c1c7 -r 4fc75b6ca3dd graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/G1PreWriteBarrier.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/G1PreWriteBarrier.java Wed Sep 25 11:16:17 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/G1PreWriteBarrier.java Wed Sep 25 12:08:04 2013 +0200 @@ -70,4 +70,8 @@ public DeoptimizationReason getDeoptimizationReason() { return DeoptimizationReason.NullCheckException; } + + public FrameState getState() { + return deoptimizationState; + } } diff -r 4f0e0602c1c7 -r 4fc75b6ca3dd graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/StubForeignCallNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/StubForeignCallNode.java Wed Sep 25 11:16:17 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/StubForeignCallNode.java Wed Sep 25 12:08:04 2013 +0200 @@ -23,7 +23,6 @@ package com.oracle.graal.hotspot.nodes; import com.oracle.graal.api.code.*; - import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; @@ -104,4 +103,8 @@ public DeoptimizationReason getDeoptimizationReason() { return null; } + + public FrameState getState() { + return deoptState; + } } diff -r 4f0e0602c1c7 -r 4fc75b6ca3dd graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractBeginNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractBeginNode.java Wed Sep 25 11:16:17 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractBeginNode.java Wed Sep 25 12:08:04 2013 +0200 @@ -185,4 +185,8 @@ throw new UnsupportedOperationException(); } } + + public FrameState getState() { + return stateAfter(); + } } diff -r 4f0e0602c1c7 -r 4fc75b6ca3dd graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractStateSplit.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractStateSplit.java Wed Sep 25 11:16:17 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractStateSplit.java Wed Sep 25 12:08:04 2013 +0200 @@ -41,6 +41,10 @@ stateAfter = x; } + public FrameState getState() { + return stateAfter(); + } + public boolean hasSideEffect() { return true; } diff -r 4f0e0602c1c7 -r 4fc75b6ca3dd graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DeoptimizeNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DeoptimizeNode.java Wed Sep 25 11:16:17 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DeoptimizeNode.java Wed Sep 25 12:08:04 2013 +0200 @@ -86,4 +86,8 @@ public DeoptimizationReason getDeoptimizationReason() { return reason; } + + public FrameState getState() { + return deoptState; + } } diff -r 4f0e0602c1c7 -r 4fc75b6ca3dd graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DeoptimizingFixedWithNextNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DeoptimizingFixedWithNextNode.java Wed Sep 25 11:16:17 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DeoptimizingFixedWithNextNode.java Wed Sep 25 12:08:04 2013 +0200 @@ -42,4 +42,8 @@ updateUsages(deoptState, f); deoptState = f; } + + public FrameState getState() { + return deoptState; + } } diff -r 4f0e0602c1c7 -r 4fc75b6ca3dd graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DeoptimizingNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DeoptimizingNode.java Wed Sep 25 11:16:17 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DeoptimizingNode.java Wed Sep 25 12:08:04 2013 +0200 @@ -23,11 +23,12 @@ package com.oracle.graal.nodes; import com.oracle.graal.api.meta.*; +import com.oracle.graal.nodes.spi.*; /** * Interface implemented by nodes which need deoptimization information. */ -public interface DeoptimizingNode { +public interface DeoptimizingNode extends NodeWithState { /** * Determines if this node needs deoptimization information. diff -r 4f0e0602c1c7 -r 4fc75b6ca3dd graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java Wed Sep 25 11:16:17 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java Wed Sep 25 12:08:04 2013 +0200 @@ -203,4 +203,14 @@ updateUsages(this.guard == null ? null : this.guard.asNode(), guard == null ? null : guard.asNode()); this.guard = guard; } + + @Override + public FrameState getState() { + if (deoptState != null) { + assert stateAfter() == null; + return deoptState; + } else { + return super.getState(); + } + } } diff -r 4f0e0602c1c7 -r 4fc75b6ca3dd graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeWithExceptionNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeWithExceptionNode.java Wed Sep 25 11:16:17 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeWithExceptionNode.java Wed Sep 25 12:08:04 2013 +0200 @@ -248,4 +248,14 @@ updateUsages(this.guard == null ? null : this.guard.asNode(), guard == null ? null : guard.asNode()); this.guard = guard; } + + @Override + public FrameState getState() { + if (deoptState != null) { + assert stateAfter() == null; + return deoptState; + } else { + return stateAfter(); + } + } } diff -r 4f0e0602c1c7 -r 4fc75b6ca3dd graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/StateSplit.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/StateSplit.java Wed Sep 25 11:16:17 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/StateSplit.java Wed Sep 25 12:08:04 2013 +0200 @@ -22,10 +22,12 @@ */ package com.oracle.graal.nodes; +import com.oracle.graal.nodes.spi.*; + /** * A state split is a node that may have a frame state associated with it. */ -public interface StateSplit { +public interface StateSplit extends NodeWithState { /** * Gets the state of the JVM frame after execution of this node. diff -r 4f0e0602c1c7 -r 4fc75b6ca3dd graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingAccessNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingAccessNode.java Wed Sep 25 11:16:17 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingAccessNode.java Wed Sep 25 12:08:04 2013 +0200 @@ -95,6 +95,10 @@ return barrierType; } + public FrameState getState() { + return deoptState; + } + @Override public boolean isCompressible() { return compressible; diff -r 4f0e0602c1c7 -r 4fc75b6ca3dd graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ForeignCallNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ForeignCallNode.java Wed Sep 25 11:16:17 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ForeignCallNode.java Wed Sep 25 12:08:04 2013 +0200 @@ -133,4 +133,14 @@ public DeoptimizationReason getDeoptimizationReason() { return null; } + + @Override + public FrameState getState() { + if (deoptState != null) { + assert stateAfter() == null; + return deoptState; + } else { + return super.getState(); + } + } } diff -r 4f0e0602c1c7 -r 4fc75b6ca3dd graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeStoreNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeStoreNode.java Wed Sep 25 11:16:17 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeStoreNode.java Wed Sep 25 12:08:04 2013 +0200 @@ -107,6 +107,10 @@ return unsafeStoreNode; } + public FrameState getState() { + return stateAfter; + } + // specialized on value type until boxing/unboxing is sorted out in intrinsification @SuppressWarnings("unused") diff -r 4f0e0602c1c7 -r 4fc75b6ca3dd graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/StoreFieldNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/StoreFieldNode.java Wed Sep 25 11:16:17 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/StoreFieldNode.java Wed Sep 25 12:08:04 2013 +0200 @@ -79,4 +79,8 @@ } } } + + public FrameState getState() { + return stateAfter; + } } diff -r 4f0e0602c1c7 -r 4fc75b6ca3dd graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/StoreIndexedNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/StoreIndexedNode.java Wed Sep 25 11:16:17 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/StoreIndexedNode.java Wed Sep 25 12:08:04 2013 +0200 @@ -81,4 +81,8 @@ } } } + + public FrameState getState() { + return stateAfter; + } } diff -r 4f0e0602c1c7 -r 4fc75b6ca3dd graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/NodeWithState.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/NodeWithState.java Wed Sep 25 12:08:04 2013 +0200 @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.graal.nodes.spi; + +import com.oracle.graal.nodes.*; + +public interface NodeWithState { + FrameState getState(); +} diff -r 4f0e0602c1c7 -r 4fc75b6ca3dd graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java --- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java Wed Sep 25 11:16:17 2013 +0200 +++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java Wed Sep 25 12:08:04 2013 +0200 @@ -36,6 +36,7 @@ import com.oracle.graal.nodes.calc.*; import com.oracle.graal.nodes.cfg.*; import com.oracle.graal.nodes.extended.*; +import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.virtual.*; import com.oracle.graal.phases.*; import com.oracle.graal.phases.graph.*; @@ -785,7 +786,7 @@ if (!(usage instanceof FrameState)) { throw new SchedulingError(usage.toString()); } - if (!(unscheduledUsage instanceof StateSplit || unscheduledUsage instanceof DeoptimizingNode)) { + if (!(unscheduledUsage instanceof NodeWithState)) { throw new SchedulingError(unscheduledUsage.toString()); } // Otherwise: Put the input into the same block as the usage. diff -r 4f0e0602c1c7 -r 4fc75b6ca3dd 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 Sep 25 11:16:17 2013 +0200 +++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java Wed Sep 25 12:08:04 2013 +0200 @@ -111,13 +111,18 @@ return !(node instanceof CommitAllocationNode || node instanceof AllocatedObjectNode); } if (isMarked) { - if (node instanceof StateSplit) { - StateSplit split = (StateSplit) node; - FrameState stateAfter = split.stateAfter(); + if (node instanceof NodeWithState) { + NodeWithState nodeWithState = (NodeWithState) node; + FrameState stateAfter = nodeWithState.getState(); if (stateAfter != null) { if (stateAfter.usages().count() > 1) { - stateAfter = (FrameState) stateAfter.copyWithInputs(); - split.setStateAfter(stateAfter); + if (nodeWithState instanceof StateSplit) { + StateSplit split = (StateSplit) nodeWithState; + stateAfter = (FrameState) stateAfter.copyWithInputs(); + split.setStateAfter(stateAfter); + } else { + throw GraalInternalError.shouldNotReachHere(); + } } final HashSet virtual = new HashSet<>(); stateAfter.applyToNonVirtual(new NodeClosure() {