changeset 19543:353669a84287

Utilities Node#acceptInputs and Node#acceptSuccessors.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Sun, 22 Feb 2015 23:44:37 +0100
parents f98e2f0c35d8
children c99fb69e93c7
files graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/match/MatchRuleRegistry.java graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Edges.java graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Graph.java graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerDivNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/GraphUtil.java graal/com.oracle.graal.replacements.test/src/com/oracle/graal/replacements/test/EdgesTest.java
diffstat 9 files changed, 71 insertions(+), 28 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/match/MatchRuleRegistry.java	Sun Feb 22 23:12:31 2015 +0100
+++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/match/MatchRuleRegistry.java	Sun Feb 22 23:44:37 2015 +0100
@@ -23,8 +23,6 @@
 package com.oracle.graal.compiler.match;
 
 import static com.oracle.graal.compiler.GraalDebugConfig.*;
-import static com.oracle.graal.graph.Edges.Type.*;
-
 import java.util.*;
 import java.util.Map.Entry;
 
@@ -50,7 +48,7 @@
     public static Position[] findPositions(NodeClass<? extends ValueNode> nodeClass, String[] names) {
         Position[] result = new Position[names.length];
         for (int i = 0; i < names.length; i++) {
-            Edges edges = nodeClass.getEdges(Inputs);
+            Edges edges = nodeClass.getInputEdges();
             for (int e = 0; e < edges.getDirectCount(); e++) {
                 if (names[i].equals(edges.getName(e))) {
                     result[i] = new Position(edges, e, Node.NOT_ITERABLE);
--- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Edges.java	Sun Feb 22 23:12:31 2015 +0100
+++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Edges.java	Sun Feb 22 23:44:37 2015 +0100
@@ -27,6 +27,7 @@
 import static com.oracle.graal.graph.Node.*;
 
 import java.util.*;
+import java.util.function.*;
 
 import com.oracle.graal.compiler.common.*;
 import com.oracle.graal.graph.NodeClass.EdgeInfo;
@@ -493,4 +494,29 @@
     public Type type() {
         return type;
     }
+
+    public void accept(Node node, Consumer<Node> consumer) {
+        int index = 0;
+        int curDirectCount = this.directCount;
+        while (index < curDirectCount) {
+            Node curNode = getNode(node, index);
+            if (curNode != null) {
+                consumer.accept(curNode);
+            }
+            index++;
+        }
+        int count = getCount();
+        while (index < count) {
+            NodeList<Node> list = getNodeList(node, index);
+            if (list != null) {
+                for (int i = 0; i < list.size(); ++i) {
+                    Node curNode = list.get(i);
+                    if (curNode != null) {
+                        consumer.accept(curNode);
+                    }
+                }
+            }
+            index++;
+        }
+    }
 }
--- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Graph.java	Sun Feb 22 23:12:31 2015 +0100
+++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Graph.java	Sun Feb 22 23:44:37 2015 +0100
@@ -516,7 +516,7 @@
             }
             if (minCountNode != null) {
                 for (Node usage : minCountNode.usages()) {
-                    if (usage != node && nodeClass == usage.getNodeClass() && node.valueEquals(usage) && nodeClass.getEdges(Inputs).areEqualIn(node, usage) &&
+                    if (usage != node && nodeClass == usage.getNodeClass() && node.valueEquals(usage) && nodeClass.getInputEdges().areEqualIn(node, usage) &&
                                     nodeClass.getEdges(Successors).areEqualIn(node, usage)) {
                         return usage;
                     }
--- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java	Sun Feb 22 23:12:31 2015 +0100
+++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java	Sun Feb 22 23:44:37 2015 +0100
@@ -27,6 +27,7 @@
 
 import java.lang.annotation.*;
 import java.util.*;
+import java.util.function.*;
 
 import sun.misc.*;
 
@@ -286,7 +287,16 @@
      * @return an {@link NodeClassIterable iterable} for all non-null input edges.
      */
     public NodeClassIterable inputs() {
-        return getNodeClass().getEdges(Inputs).getIterable(this);
+        return nodeClass.getInputEdges().getIterable(this);
+    }
+
+    /**
+     * Applies the given consumer to all inputs of this node.
+     *
+     * @param consumer the consumer to be applied to the inputs
+     */
+    public void acceptInputs(Consumer<Node> consumer) {
+        nodeClass.getInputEdges().accept(this, consumer);
     }
 
     /**
@@ -296,7 +306,16 @@
      * @return an {@link NodeClassIterable iterable} for all non-null successor edges.
      */
     public NodeClassIterable successors() {
-        return getNodeClass().getEdges(Successors).getIterable(this);
+        return nodeClass.getSuccessorEdges().getIterable(this);
+    }
+
+    /**
+     * Applies the given consumer to all successors of this node.
+     *
+     * @param consumer the consumer to be applied to the inputs
+     */
+    public void acceptSuccessors(Consumer<Node> consumer) {
+        nodeClass.getSuccessorEdges().accept(this, consumer);
     }
 
     /**
@@ -528,7 +547,7 @@
     public void replaceAtUsages(Node other) {
         assert checkReplaceWith(other);
         for (Node usage : usages()) {
-            boolean result = usage.getNodeClass().getEdges(Inputs).replaceFirst(usage, this, other);
+            boolean result = usage.getNodeClass().getInputEdges().replaceFirst(usage, this, other);
             assert assertTrue(result, "not found in inputs, usage: %s", usage);
             if (other != null) {
                 maybeNotifyInputChanged(usage);
@@ -554,7 +573,7 @@
         while (index < this.getUsageCount()) {
             Node usage = getUsageAt(index);
             if (usagePredicate.apply(usage)) {
-                boolean result = usage.getNodeClass().getEdges(Inputs).replaceFirst(usage, this, other);
+                boolean result = usage.getNodeClass().getInputEdges().replaceFirst(usage, this, other);
                 assert assertTrue(result, "not found in inputs, usage: %s", usage);
                 if (other != null) {
                     maybeNotifyInputChanged(usage);
@@ -610,7 +629,7 @@
     public void replaceAtPredecessor(Node other) {
         assert checkReplaceWith(other);
         if (predecessor != null) {
-            boolean result = predecessor.getNodeClass().getEdges(Successors).replaceFirst(predecessor, this, other);
+            boolean result = predecessor.getNodeClass().getSuccessorEdges().replaceFirst(predecessor, this, other);
             assert assertTrue(result, "not found in successors, predecessor: %s", predecessor);
             predecessor.updatePredecessor(this, other);
         }
@@ -627,13 +646,13 @@
     }
 
     public void replaceFirstSuccessor(Node oldSuccessor, Node newSuccessor) {
-        if (getNodeClass().getEdges(Successors).replaceFirst(this, oldSuccessor, newSuccessor)) {
+        if (nodeClass.getSuccessorEdges().replaceFirst(this, oldSuccessor, newSuccessor)) {
             updatePredecessor(oldSuccessor, newSuccessor);
         }
     }
 
     public void replaceFirstInput(Node oldInput, Node newInput) {
-        if (getNodeClass().getEdges(Inputs).replaceFirst(this, oldInput, newInput)) {
+        if (nodeClass.getInputEdges().replaceFirst(this, oldInput, newInput)) {
             updateUsages(oldInput, newInput);
         }
     }
@@ -651,7 +670,7 @@
         assert assertFalse(isDeleted(), "cannot clear inputs of deleted node");
 
         unregisterInputs();
-        getNodeClass().getEdges(Inputs).clear(this);
+        getNodeClass().getInputEdges().clear(this);
     }
 
     private boolean removeThisFromUsages(Node n) {
@@ -659,17 +678,14 @@
     }
 
     private void unregisterSuccessors() {
-        for (Node successor : successors()) {
-            assert assertTrue(successor.predecessor == this, "wrong predecessor in old successor (%s): %s", successor, successor.predecessor);
-            successor.predecessor = null;
-        }
+        this.acceptSuccessors(successor -> successor.predecessor = null);
     }
 
     public void clearSuccessors() {
         assert assertFalse(isDeleted(), "cannot clear successors of deleted node");
 
         unregisterSuccessors();
-        getNodeClass().getEdges(Successors).clear(this);
+        getNodeClass().getSuccessorEdges().clear(this);
     }
 
     private boolean checkDeletion() {
--- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java	Sun Feb 22 23:12:31 2015 +0100
+++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java	Sun Feb 22 23:44:37 2015 +0100
@@ -618,6 +618,14 @@
         return type == Edges.Type.Inputs ? inputs : successors;
     }
 
+    public Edges getInputEdges() {
+        return inputs;
+    }
+
+    public Edges getSuccessorEdges() {
+        return successors;
+    }
+
     /**
      * Initializes a fresh allocated node for which no constructor is called yet. Needed to
      * implement node factories in svm.
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java	Sun Feb 22 23:12:31 2015 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java	Sun Feb 22 23:44:37 2015 +0100
@@ -22,8 +22,6 @@
  */
 package com.oracle.graal.nodes;
 
-import static com.oracle.graal.graph.Edges.Type.*;
-
 import java.util.*;
 
 import com.oracle.graal.api.meta.*;
@@ -237,7 +235,7 @@
                 FixedWithNextNode falseNext = (FixedWithNextNode) falseSucc.next();
                 NodeClass<?> nodeClass = trueNext.getNodeClass();
                 if (trueNext.getClass() == falseNext.getClass()) {
-                    if (nodeClass.getEdges(Inputs).areEqualIn(trueNext, falseNext) && trueNext.valueEquals(falseNext)) {
+                    if (nodeClass.getInputEdges().areEqualIn(trueNext, falseNext) && trueNext.valueEquals(falseNext)) {
                         falseNext.replaceAtUsages(trueNext);
                         graph().removeFixed(falseNext);
                         GraphUtil.unlinkFixedNode(trueNext);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerDivNode.java	Sun Feb 22 23:12:31 2015 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerDivNode.java	Sun Feb 22 23:44:37 2015 +0100
@@ -22,8 +22,6 @@
  */
 package com.oracle.graal.nodes.calc;
 
-import static com.oracle.graal.graph.Edges.Type.*;
-
 import com.oracle.graal.api.code.*;
 import com.oracle.graal.compiler.common.type.*;
 import com.oracle.graal.graph.*;
@@ -96,7 +94,7 @@
 
         if (next() instanceof IntegerDivNode) {
             NodeClass<?> nodeClass = getNodeClass();
-            if (next().getClass() == this.getClass() && nodeClass.getEdges(Inputs).areEqualIn(this, next()) && valueEquals(next())) {
+            if (next().getClass() == this.getClass() && nodeClass.getInputEdges().areEqualIn(this, next()) && valueEquals(next())) {
                 return next();
             }
         }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/GraphUtil.java	Sun Feb 22 23:12:31 2015 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/GraphUtil.java	Sun Feb 22 23:44:37 2015 +0100
@@ -49,7 +49,7 @@
             // We reached a control flow end.
             AbstractEndNode end = (AbstractEndNode) node;
             killEnd(end, tool);
-        } else {
+        } else if (node instanceof FixedNode) {
             // Normal control flow node.
             /*
              * We do not take a successor snapshot because this iterator supports concurrent
@@ -116,11 +116,11 @@
         if (node != null && node.isAlive()) {
             node.unsafeDelete();
 
-            for (Node in : node.inputs()) {
+            node.acceptInputs(in -> {
                 if (in.isAlive() && in.hasNoUsages() && !(in instanceof FixedNode)) {
                     killWithUnusedFloatingInputs(in);
                 }
-            }
+            });
 
             ArrayList<Node> usageToKill = null;
             for (Node usage : node.usages()) {
--- a/graal/com.oracle.graal.replacements.test/src/com/oracle/graal/replacements/test/EdgesTest.java	Sun Feb 22 23:12:31 2015 +0100
+++ b/graal/com.oracle.graal.replacements.test/src/com/oracle/graal/replacements/test/EdgesTest.java	Sun Feb 22 23:44:37 2015 +0100
@@ -29,7 +29,6 @@
 import com.oracle.graal.api.meta.*;
 import com.oracle.graal.compiler.test.*;
 import com.oracle.graal.graph.*;
-import com.oracle.graal.graph.Edges.Type;
 import com.oracle.graal.nodeinfo.*;
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.StructuredGraph.AllowAssumptions;
@@ -74,7 +73,7 @@
         node.i1 = i1;
         node.i2 = i2;
         graph.add(node);
-        inputs = node.getNodeClass().getEdges(Type.Inputs);
+        inputs = node.getNodeClass().getInputEdges();
     }
 
     /**