changeset 18815:c4469ca2a822

Move back to an approach where NodeClass is cached in each Node instance.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Sun, 11 Jan 2015 00:00:37 +0100
parents cf984e876194
children 972009398b30
files graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java
diffstat 1 files changed, 16 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- 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<Edges.Type> edgesToCopy) {
+    private void copyOrClearEdgesForClone(Node newNode, Edges.Type type, EnumSet<Edges.Type> 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<Edges.Type> 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<Object, Object> getDebugProperties(Map<Object, Object> 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));
         }