changeset 15009:e49f62425090

introduce non-ValueNode Proxy interface
author Lukas Stadler <lukas.stadler@oracle.com>
date Mon, 07 Apr 2014 13:55:45 +0200
parents 01fdabd19cd5
children f36e56e9dd9a
files graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64MemoryPeephole.java graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/NodeLIRBuilder.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardProxyNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardedValueNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardingPiNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/MemoryProxyNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PhiNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PiNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ProxyNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/TypeProfileProxyNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ValueProxyNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FixedValueAnchorNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingReadNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeCastNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/WriteNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/MemoryProxy.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/Proxy.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/ValueProxy.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/GraphUtil.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConditionalEliminationPhase.java
diffstat 22 files changed, 86 insertions(+), 43 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64MemoryPeephole.java	Mon Apr 07 11:32:09 2014 +0200
+++ b/graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64MemoryPeephole.java	Mon Apr 07 13:55:45 2014 +0200
@@ -431,7 +431,7 @@
     protected ValueNode uncast(ValueNode value) {
         if (value instanceof UnsafeCastNode) {
             UnsafeCastNode cast = (UnsafeCastNode) value;
-            return cast.getOriginalValue();
+            return cast.getOriginalNode();
         }
         return value;
     }
--- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/NodeLIRBuilder.java	Mon Apr 07 11:32:09 2014 +0200
+++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/NodeLIRBuilder.java	Mon Apr 07 13:55:45 2014 +0200
@@ -336,7 +336,7 @@
                                 continue;
                             } else if (node instanceof UnsafeCastNode) {
                                 UnsafeCastNode cast = (UnsafeCastNode) node;
-                                if (cast.getOriginalValue() == access) {
+                                if (cast.getOriginalNode() == access) {
                                     continue;
                                 }
                             }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardProxyNode.java	Mon Apr 07 11:32:09 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardProxyNode.java	Mon Apr 07 13:55:45 2014 +0200
@@ -24,19 +24,24 @@
 
 import com.oracle.graal.graph.*;
 import com.oracle.graal.nodes.extended.*;
+import com.oracle.graal.nodes.spi.*;
 import com.oracle.graal.nodes.type.*;
 
-public class GuardProxyNode extends ProxyNode implements GuardingNode {
+public class GuardProxyNode extends ProxyNode implements GuardingNode, Proxy {
 
-    @Input(InputType.Guard) private ValueNode value;
+    @Input(InputType.Guard) private GuardingNode value;
 
-    public GuardProxyNode(ValueNode value, AbstractBeginNode proxyPoint) {
+    public GuardProxyNode(GuardingNode value, AbstractBeginNode proxyPoint) {
         super(StampFactory.forVoid(), proxyPoint);
         this.value = value;
     }
 
     @Override
     public ValueNode value() {
-        return value;
+        return value.asNode();
+    }
+
+    public Node getOriginalNode() {
+        return value.asNode();
     }
 }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardedValueNode.java	Mon Apr 07 11:32:09 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardedValueNode.java	Mon Apr 07 13:55:45 2014 +0200
@@ -88,7 +88,7 @@
     }
 
     @Override
-    public ValueNode getOriginalValue() {
+    public ValueNode getOriginalNode() {
         return object;
     }
 }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardingPiNode.java	Mon Apr 07 11:32:09 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardingPiNode.java	Mon Apr 07 13:55:45 2014 +0200
@@ -132,7 +132,7 @@
                     @ConstantNodeParameter DeoptimizationAction action, @ConstantNodeParameter Stamp stamp);
 
     @Override
-    public ValueNode getOriginalValue() {
+    public ValueNode getOriginalNode() {
         return object;
     }
 }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/MemoryProxyNode.java	Mon Apr 07 11:32:09 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/MemoryProxyNode.java	Mon Apr 07 13:55:45 2014 +0200
@@ -31,19 +31,18 @@
 @NodeInfo(allowedUsageTypes = {InputType.Memory})
 public class MemoryProxyNode extends ProxyNode implements MemoryProxy, LIRLowerable {
 
-    @Input(InputType.Memory) private ValueNode value;
+    @Input(InputType.Memory) private MemoryNode value;
     private final LocationIdentity identity;
 
-    public MemoryProxyNode(ValueNode value, AbstractBeginNode exit, LocationIdentity identity) {
+    public MemoryProxyNode(MemoryNode value, AbstractBeginNode exit, LocationIdentity identity) {
         super(StampFactory.forVoid(), exit);
         this.value = value;
-        assert value instanceof MemoryNode;
         this.identity = identity;
     }
 
     @Override
     public ValueNode value() {
-        return value;
+        return value.asNode();
     }
 
     public LocationIdentity getLocationIdentity() {
@@ -71,4 +70,8 @@
     public MemoryPhiNode asMemoryPhi() {
         return getOriginalMemoryNode().asMemoryPhi();
     }
+
+    public Node getOriginalNode() {
+        return value.asNode();
+    }
 }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PhiNode.java	Mon Apr 07 11:32:09 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PhiNode.java	Mon Apr 07 13:55:45 2014 +0200
@@ -25,7 +25,6 @@
 import com.oracle.graal.graph.*;
 import com.oracle.graal.graph.spi.*;
 import com.oracle.graal.nodes.calc.*;
-import com.oracle.graal.nodes.extended.*;
 import com.oracle.graal.nodes.type.*;
 
 public abstract class PhiNode extends FloatingNode {
@@ -58,7 +57,7 @@
     /**
      * Get the instruction that produces the value associated with the i'th predecessor of the
      * merge.
-     * 
+     *
      * @param i the index of the predecessor
      * @return the instruction that produced the value in the i'th predecessor
      */
@@ -68,7 +67,7 @@
 
     /**
      * Sets the value at the given index and makes sure that the values list is large enough.
-     * 
+     *
      * @param i the index at which to set the value
      * @param x the new phi input value for the given location
      */
@@ -89,7 +88,7 @@
 
     /**
      * Get the number of inputs to this phi (i.e. the number of predecessors to the merge).
-     * 
+     *
      * @return the number of inputs in this phi
      */
     public int valueCount() {
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PiNode.java	Mon Apr 07 11:32:09 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PiNode.java	Mon Apr 07 13:55:45 2014 +0200
@@ -94,7 +94,7 @@
     }
 
     @Override
-    public ValueNode getOriginalValue() {
+    public ValueNode getOriginalNode() {
         return object;
     }
 
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ProxyNode.java	Mon Apr 07 11:32:09 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ProxyNode.java	Mon Apr 07 13:55:45 2014 +0200
@@ -27,14 +27,13 @@
 import com.oracle.graal.graph.Node.ValueNumberable;
 import com.oracle.graal.nodes.calc.*;
 import com.oracle.graal.nodes.extended.*;
-import com.oracle.graal.nodes.spi.*;
 import com.oracle.graal.nodes.type.*;
 
 /**
  * A proxy is inserted at loop exits for any value that is created inside the loop (i.e. was not
  * live on entry to the loop) and is (potentially) used after the loop.
  */
-public abstract class ProxyNode extends FloatingNode implements IterableNodeType, ValueNumberable, ValueAndStampProxy {
+public abstract class ProxyNode extends FloatingNode implements IterableNodeType, ValueNumberable {
 
     @Input(InputType.Association) private AbstractBeginNode proxyPoint;
 
@@ -58,20 +57,15 @@
         return super.verify();
     }
 
-    @Override
-    public ValueNode getOriginalValue() {
-        return value();
-    }
-
     public static MemoryProxyNode forMemory(MemoryNode value, AbstractBeginNode exit, LocationIdentity location, StructuredGraph graph) {
-        return graph.unique(new MemoryProxyNode(ValueNodeUtil.asNode(value), exit, location));
+        return graph.unique(new MemoryProxyNode(value, exit, location));
     }
 
     public static ValueProxyNode forValue(ValueNode value, AbstractBeginNode exit, StructuredGraph graph) {
         return graph.unique(new ValueProxyNode(value, exit));
     }
 
-    public static GuardProxyNode forGuard(ValueNode value, AbstractBeginNode exit, StructuredGraph graph) {
+    public static GuardProxyNode forGuard(GuardingNode value, AbstractBeginNode exit, StructuredGraph graph) {
         return graph.unique(new GuardProxyNode(value, exit));
     }
 }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/TypeProfileProxyNode.java	Mon Apr 07 11:32:09 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/TypeProfileProxyNode.java	Mon Apr 07 13:55:45 2014 +0200
@@ -123,7 +123,7 @@
     }
 
     @Override
-    public ValueNode getOriginalValue() {
+    public ValueNode getOriginalNode() {
         return object;
     }
 }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ValueProxyNode.java	Mon Apr 07 11:32:09 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ValueProxyNode.java	Mon Apr 07 13:55:45 2014 +0200
@@ -26,7 +26,7 @@
 import com.oracle.graal.graph.spi.*;
 import com.oracle.graal.nodes.spi.*;
 
-public class ValueProxyNode extends ProxyNode implements Canonicalizable, Virtualizable {
+public class ValueProxyNode extends ProxyNode implements Canonicalizable, Virtualizable, ValueAndStampProxy {
 
     @Input private ValueNode value;
 
@@ -60,4 +60,9 @@
             tool.replaceWithVirtual(state.getVirtualObject());
         }
     }
+
+    @Override
+    public ValueNode getOriginalNode() {
+        return value();
+    }
 }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FixedValueAnchorNode.java	Mon Apr 07 11:32:09 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FixedValueAnchorNode.java	Mon Apr 07 13:55:45 2014 +0200
@@ -54,7 +54,7 @@
     }
 
     @Override
-    public ValueNode getOriginalValue() {
+    public ValueNode getOriginalNode() {
         return object;
     }
 
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingReadNode.java	Mon Apr 07 11:32:09 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingReadNode.java	Mon Apr 07 13:55:45 2014 +0200
@@ -69,7 +69,7 @@
     @Override
     public Node canonical(CanonicalizerTool tool) {
         if (object() instanceof PiNode && ((PiNode) object()).getGuard() == getGuard()) {
-            return graph().unique(new FloatingReadNode(((PiNode) object()).getOriginalValue(), location(), getLastLocationAccess(), stamp(), getGuard(), getBarrierType(), isCompressible()));
+            return graph().unique(new FloatingReadNode(((PiNode) object()).getOriginalNode(), location(), getLastLocationAccess(), stamp(), getGuard(), getBarrierType(), isCompressible()));
         }
         return ReadNode.canonicalizeRead(this, location(), object(), tool, isCompressible());
     }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java	Mon Apr 07 11:32:09 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java	Mon Apr 07 13:55:45 2014 +0200
@@ -62,7 +62,7 @@
     @Override
     public Node canonical(CanonicalizerTool tool) {
         if (object() instanceof PiNode && ((PiNode) object()).getGuard() == getGuard()) {
-            return graph().add(new ReadNode(((PiNode) object()).getOriginalValue(), location(), stamp(), getGuard(), getBarrierType(), isCompressible()));
+            return graph().add(new ReadNode(((PiNode) object()).getOriginalNode(), location(), stamp(), getGuard(), getBarrierType(), isCompressible()));
         }
         return canonicalizeRead(this, location(), object(), tool, isCompressible());
     }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeCastNode.java	Mon Apr 07 11:32:09 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeCastNode.java	Mon Apr 07 13:55:45 2014 +0200
@@ -54,7 +54,7 @@
     }
 
     @Override
-    public ValueNode getOriginalValue() {
+    public ValueNode getOriginalNode() {
         return object;
     }
 
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/WriteNode.java	Mon Apr 07 11:32:09 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/WriteNode.java	Mon Apr 07 13:55:45 2014 +0200
@@ -60,7 +60,7 @@
     @Override
     public void simplify(SimplifierTool tool) {
         if (object() instanceof PiNode && ((PiNode) object()).getGuard() == getGuard()) {
-            setObject(((PiNode) object()).getOriginalValue());
+            setObject(((PiNode) object()).getOriginalNode());
         }
     }
 
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java	Mon Apr 07 11:32:09 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java	Mon Apr 07 13:55:45 2014 +0200
@@ -201,7 +201,7 @@
     }
 
     @Override
-    public ValueNode getOriginalValue() {
+    public ValueNode getOriginalNode() {
         return object;
     }
 }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/MemoryProxy.java	Mon Apr 07 11:32:09 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/MemoryProxy.java	Mon Apr 07 13:55:45 2014 +0200
@@ -25,7 +25,7 @@
 import com.oracle.graal.api.meta.*;
 import com.oracle.graal.nodes.extended.*;
 
-public interface MemoryProxy extends ValueProxy, MemoryNode {
+public interface MemoryProxy extends Proxy, MemoryNode {
 
     LocationIdentity getLocationIdentity();
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/Proxy.java	Mon Apr 07 13:55:45 2014 +0200
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2013, 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.graph.*;
+
+/**
+ * This interface marks nodes whose result is the same as one of their inputs. Such nodes are used
+ * to add type information, to introduce scheduling restrictions, etc.
+ *
+ * For some algorithms it is necessary or advantageous to see through these proxies.
+ */
+public interface Proxy extends NodeInterface {
+
+    Node getOriginalNode();
+
+}
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/ValueProxy.java	Mon Apr 07 11:32:09 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/ValueProxy.java	Mon Apr 07 13:55:45 2014 +0200
@@ -27,11 +27,11 @@
 /**
  * This interface marks nodes whose result is the same as one of their inputs. Such nodes are used
  * to add type information, to introduce scheduling restrictions, etc.
- * 
+ *
  * For some algorithms it is necessary or advantageous to see through these proxies.
  */
-public interface ValueProxy {
+public interface ValueProxy extends Proxy {
 
-    ValueNode getOriginalValue();
+    ValueNode getOriginalNode();
 
 }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/GraphUtil.java	Mon Apr 07 11:32:09 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/GraphUtil.java	Mon Apr 07 13:55:45 2014 +0200
@@ -168,7 +168,7 @@
         if (proxyPoint instanceof LoopExitNode) {
             LoopExitNode exit = (LoopExitNode) proxyPoint;
             LoopBeginNode loopBegin = exit.loopBegin();
-            ValueNode vpnValue = vpn.value();
+            Node vpnValue = vpn.value();
             for (ValueNode v : loopBegin.stateAfter().values()) {
                 ValueNode v2 = v;
                 if (loopBegin.isPhiAtMerge(v2)) {
@@ -297,7 +297,7 @@
     public static ValueNode unproxify(ValueNode value) {
         ValueNode result = value;
         while (result instanceof ValueProxy) {
-            result = ((ValueProxy) result).getOriginalValue();
+            result = ((ValueProxy) result).getOriginalNode();
         }
         return result;
     }
@@ -313,7 +313,7 @@
         ValueNode v = proxy;
         do {
             if (v instanceof ValueProxy) {
-                v = ((ValueProxy) v).getOriginalValue();
+                v = ((ValueProxy) v).getOriginalNode();
             } else if (v instanceof PhiNode) {
                 v = ((PhiNode) v).singleValue();
             } else {
@@ -339,7 +339,7 @@
             worklist.add(proxy);
             for (Node node : worklist) {
                 if (node instanceof ValueProxy) {
-                    ValueNode originalValue = ((ValueProxy) node).getOriginalValue();
+                    ValueNode originalValue = ((ValueProxy) node).getOriginalNode();
                     if (!process(originalValue, worklist)) {
                         return;
                     }
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConditionalEliminationPhase.java	Mon Apr 07 11:32:09 2014 +0200
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConditionalEliminationPhase.java	Mon Apr 07 13:55:45 2014 +0200
@@ -845,7 +845,7 @@
             for (Node n : value.usages()) {
                 if (n instanceof ValueProxy) {
                     ValueProxy proxyNode = (ValueProxy) n;
-                    if (proxyNode.getOriginalValue() == value) {
+                    if (proxyNode.getOriginalNode() == value) {
                         GuardingNode result = searchAnchor((ValueNode) n, type);
                         if (result != null) {
                             return result;