# HG changeset patch # User Thomas Wuerthinger # Date 1420930837 -3600 # Node ID c4469ca2a82201613e67fa47508dd955b0f010a8 # Parent cf984e876194b0bcc0f614469923e7280694a707 Move back to an approach where NodeClass is cached in each Node instance. diff -r cf984e876194 -r c4469ca2a822 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 Sat Jan 10 22:59:11 2015 +0100 +++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java Sun Jan 11 00:00:37 2015 +0100 @@ -190,12 +190,14 @@ Node[] extraUsages; private Node predecessor; + private NodeClass nodeClass; public static final int NODE_LIST = -2; public static final int NOT_ITERABLE = -1; public Node() { init(); + this.nodeClass = NodeClass.get(this.getClass()); } final void init() { @@ -603,7 +605,7 @@ } public final NodeClass getNodeClass() { - return NodeClass.get(getClass()); + return nodeClass; } public boolean isAllowedUsageType(InputType type) { @@ -812,15 +814,15 @@ * @param edgesToCopy if {@code type} is in this set, the edges are copied otherwise they are * cleared */ - private void copyOrClearEdgesForClone(NodeClass nodeClass, Node newNode, Edges.Type type, EnumSet edgesToCopy) { + private void copyOrClearEdgesForClone(Node newNode, Edges.Type type, EnumSet edgesToCopy) { if (edgesToCopy.contains(type)) { - nodeClass.getEdges(type).copy(this, newNode); + getNodeClass().getEdges(type).copy(this, newNode); } else { if (USE_UNSAFE_TO_CLONE) { // The direct edges are already null - nodeClass.getEdges(type).initializeLists(newNode, this); + getNodeClass().getEdges(type).initializeLists(newNode, this); } else { - nodeClass.getEdges(type).clear(newNode); + getNodeClass().getEdges(type).clear(newNode); } } } @@ -841,10 +843,10 @@ * @return the copy of this node */ final Node clone(Graph into, EnumSet edgesToCopy) { - NodeClass nodeClass = getNodeClass(); + final NodeClass nodeClassTmp = getNodeClass(); boolean useIntoLeafNodeCache = false; if (into != null) { - if (nodeClass.valueNumberable() && nodeClass.isLeafNode()) { + if (nodeClassTmp.valueNumberable() && nodeClassTmp.isLeafNode()) { useIntoLeafNodeCache = true; Node otherNode = into.findNodeInCache(this); if (otherNode != null) { @@ -857,17 +859,18 @@ try { if (USE_UNSAFE_TO_CLONE) { newNode = (Node) UnsafeAccess.unsafe.allocateInstance(getClass()); - nodeClass.getData().copy(this, newNode); - copyOrClearEdgesForClone(nodeClass, newNode, Inputs, edgesToCopy); - copyOrClearEdgesForClone(nodeClass, newNode, Successors, edgesToCopy); + newNode.nodeClass = nodeClassTmp; + nodeClassTmp.getData().copy(this, newNode); + copyOrClearEdgesForClone(newNode, Inputs, edgesToCopy); + copyOrClearEdgesForClone(newNode, Successors, edgesToCopy); } else { newNode = (Node) this.clone(); newNode.typeCacheNext = null; newNode.usage0 = null; newNode.usage1 = null; newNode.predecessor = null; - copyOrClearEdgesForClone(nodeClass, newNode, Inputs, edgesToCopy); - copyOrClearEdgesForClone(nodeClass, newNode, Successors, edgesToCopy); + copyOrClearEdgesForClone(newNode, Inputs, edgesToCopy); + copyOrClearEdgesForClone(newNode, Successors, edgesToCopy); } } catch (Exception e) { throw new GraalGraphInternalError(e).addContext(this); @@ -988,8 +991,7 @@ * @param map */ public Map getDebugProperties(Map map) { - NodeClass nodeClass = getNodeClass(); - Fields properties = nodeClass.getData(); + Fields properties = getNodeClass().getData(); for (int i = 0; i < properties.getCount(); i++) { map.put(properties.getName(i), properties.get(this, i)); }