# HG changeset patch # User Thomas Wuerthinger # Date 1424645077 -3600 # Node ID 353669a8428748d4e4a3b1aa5d0901931fb74b8c # Parent f98e2f0c35d85c4323c22e7e159130aa5cfe2424 Utilities Node#acceptInputs and Node#acceptSuccessors. diff -r f98e2f0c35d8 -r 353669a84287 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/match/MatchRuleRegistry.java --- 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 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); diff -r f98e2f0c35d8 -r 353669a84287 graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Edges.java --- 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 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 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++; + } + } } diff -r f98e2f0c35d8 -r 353669a84287 graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Graph.java --- 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; } diff -r f98e2f0c35d8 -r 353669a84287 graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java --- 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 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 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() { diff -r f98e2f0c35d8 -r 353669a84287 graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java --- 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. diff -r f98e2f0c35d8 -r 353669a84287 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java --- 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); diff -r f98e2f0c35d8 -r 353669a84287 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerDivNode.java --- 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(); } } diff -r f98e2f0c35d8 -r 353669a84287 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/GraphUtil.java --- 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 usageToKill = null; for (Node usage : node.usages()) { diff -r f98e2f0c35d8 -r 353669a84287 graal/com.oracle.graal.replacements.test/src/com/oracle/graal/replacements/test/EdgesTest.java --- 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(); } /**