changeset 20130:8dc73c226c63

Truffle: cache NodeClass lookup in Node.
author Christian Humer <christian.humer@gmail.com>
date Thu, 02 Apr 2015 01:26:31 +0200
parents 5b7db8941fd7
children 4b12d5355811
files graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/builtins/SLDisableSplittingBuiltin.java graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/builtins/SLGetOptionBuiltin.java graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/builtins/SLGraalRuntimeBuiltin.java graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/debug/TraceCompilationASTListener.java graal/com.oracle.truffle.api.dsl/src/com/oracle/truffle/api/dsl/internal/SpecializationNode.java graal/com.oracle.truffle.api/src/com/oracle/truffle/api/instrument/impl/DefaultASTPrinter.java graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/GraphPrintVisitor.java graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/Node.java graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeClass.java graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeFieldAccessor.java graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeUtil.java graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/serial/PostOrderDeserializer.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/NodeParser.java graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/instrument/SLASTPrinter.java
diffstat 14 files changed, 45 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/builtins/SLDisableSplittingBuiltin.java	Thu Apr 02 01:22:41 2015 +0200
+++ b/graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/builtins/SLDisableSplittingBuiltin.java	Thu Apr 02 01:26:31 2015 +0200
@@ -23,8 +23,8 @@
 package com.oracle.graal.truffle.test.builtins;
 
 import com.oracle.graal.truffle.*;
+import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
 import com.oracle.truffle.api.*;
-import com.oracle.truffle.api.CompilerDirectives.*;
 import com.oracle.truffle.api.dsl.*;
 import com.oracle.truffle.api.nodes.*;
 import com.oracle.truffle.sl.nodes.*;
--- a/graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/builtins/SLGetOptionBuiltin.java	Thu Apr 02 01:22:41 2015 +0200
+++ b/graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/builtins/SLGetOptionBuiltin.java	Thu Apr 02 01:26:31 2015 +0200
@@ -24,7 +24,7 @@
 
 import com.oracle.graal.options.*;
 import com.oracle.graal.truffle.*;
-import com.oracle.truffle.api.CompilerDirectives.*;
+import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
 import com.oracle.truffle.api.dsl.*;
 import com.oracle.truffle.api.nodes.*;
 
--- a/graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/builtins/SLGraalRuntimeBuiltin.java	Thu Apr 02 01:22:41 2015 +0200
+++ b/graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/builtins/SLGraalRuntimeBuiltin.java	Thu Apr 02 01:26:31 2015 +0200
@@ -26,7 +26,7 @@
 
 import com.oracle.graal.truffle.*;
 import com.oracle.truffle.api.*;
-import com.oracle.truffle.api.CompilerDirectives.*;
+import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
 import com.oracle.truffle.api.frame.*;
 import com.oracle.truffle.api.nodes.*;
 import com.oracle.truffle.api.source.*;
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/debug/TraceCompilationASTListener.java	Thu Apr 02 01:22:41 2015 +0200
+++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/debug/TraceCompilationASTListener.java	Thu Apr 02 01:26:31 2015 +0200
@@ -64,7 +64,7 @@
                     p.println(node.getClass().getSimpleName());
                 } else {
                     String fieldName = "unknownField";
-                    NodeFieldAccessor[] fields = NodeClass.get(parent.getClass()).getFields();
+                    NodeFieldAccessor[] fields = NodeClass.get(parent).getFields();
                     for (NodeFieldAccessor field : fields) {
                         Object value = field.loadValue(parent);
                         if (value == node) {
--- a/graal/com.oracle.truffle.api.dsl/src/com/oracle/truffle/api/dsl/internal/SpecializationNode.java	Thu Apr 02 01:22:41 2015 +0200
+++ b/graal/com.oracle.truffle.api.dsl/src/com/oracle/truffle/api/dsl/internal/SpecializationNode.java	Thu Apr 02 01:26:31 2015 +0200
@@ -79,7 +79,7 @@
     }
 
     private static void updateRootImpl(SpecializationNode start, Node node) {
-        NodeFieldAccessor[] fields = NodeClass.get(start.getClass()).getFields();
+        NodeFieldAccessor[] fields = NodeClass.get(start).getFields();
         for (int i = fields.length - 1; i >= 0; i--) {
             NodeFieldAccessor f = fields[i];
             if (f.getName().equals("root")) {
--- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/instrument/impl/DefaultASTPrinter.java	Thu Apr 02 01:22:41 2015 +0200
+++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/instrument/impl/DefaultASTPrinter.java	Thu Apr 02 01:26:31 2015 +0200
@@ -76,7 +76,7 @@
 
         ArrayList<NodeFieldAccessor> childFields = new ArrayList<>();
 
-        for (NodeFieldAccessor field : NodeClass.get(node.getClass()).getFields()) {
+        for (NodeFieldAccessor field : NodeClass.get(node).getFields()) {
             if (field.getKind() == NodeFieldKind.CHILD || field.getKind() == NodeFieldKind.CHILDREN) {
                 childFields.add(field);
             } else if (field.getKind() == NodeFieldKind.DATA) {
--- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/GraphPrintVisitor.java	Thu Apr 02 01:22:41 2015 +0200
+++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/GraphPrintVisitor.java	Thu Apr 02 01:26:31 2015 +0200
@@ -262,7 +262,7 @@
     }
 
     private void readNodeProperties(Node node) {
-        NodeFieldAccessor[] fields = NodeClass.get(node.getClass()).getFields();
+        NodeFieldAccessor[] fields = node.getNodeClass().getFields();
         for (NodeFieldAccessor field : fields) {
             if (field.getKind() == NodeFieldKind.DATA) {
                 String key = field.getName();
@@ -339,7 +339,7 @@
 
     private static LinkedHashMap<String, Node> findNamedNodeChildren(Node node) {
         LinkedHashMap<String, Node> nodes = new LinkedHashMap<>();
-        NodeClass nodeClass = NodeClass.get(node.getClass());
+        NodeClass nodeClass = node.getNodeClass();
 
         for (NodeFieldAccessor field : nodeClass.getFields()) {
             NodeFieldKind kind = field.getKind();
--- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/Node.java	Thu Apr 02 01:22:41 2015 +0200
+++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/Node.java	Thu Apr 02 01:26:31 2015 +0200
@@ -40,6 +40,7 @@
  */
 public abstract class Node implements NodeInterface, Cloneable {
 
+    private final NodeClass nodeClass;
     @CompilationFinal private Node parent;
     @CompilationFinal private SourceSection sourceSection;
 
@@ -66,6 +67,7 @@
     protected Node(SourceSection sourceSection) {
         CompilerAsserts.neverPartOfCompilation();
         this.sourceSection = sourceSection;
+        this.nodeClass = NodeClass.get(getClass());
         if (TruffleOptions.TraceASTJSON) {
             JSONHelper.dumpNewNode(this);
         }
@@ -88,6 +90,10 @@
         this.sourceSection = section;
     }
 
+    NodeClass getNodeClass() {
+        return nodeClass;
+    }
+
     /**
      * Returns a rough estimate for the cost of this {@link Node}. This estimate can be used by
      * runtime systems or guest languages to implement heuristics based on Truffle ASTs. This method
@@ -344,7 +350,7 @@
     public final Iterable<Node> getChildren() {
         return new Iterable<Node>() {
             public Iterator<Node> iterator() {
-                return NodeUtil.makeIterator(Node.this);
+                return nodeClass.makeIterator(Node.this);
             }
         };
     }
--- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeClass.java	Thu Apr 02 01:22:41 2015 +0200
+++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeClass.java	Thu Apr 02 01:26:31 2015 +0200
@@ -54,6 +54,7 @@
     private final NodeFieldAccessor[] fields;
     // Separate arrays for the frequently accessed fields.
     private final NodeFieldAccessor parentField;
+    private final NodeFieldAccessor nodeClassField;
     private final NodeFieldAccessor[] childFields;
     private final NodeFieldAccessor[] childrenFields;
     private final NodeFieldAccessor[] cloneableFields;
@@ -64,9 +65,14 @@
         return nodeClasses.get(clazz);
     }
 
+    public static NodeClass get(Node clazz) {
+        return clazz.getNodeClass();
+    }
+
     public NodeClass(Class<? extends Node> clazz) {
         List<NodeFieldAccessor> fieldsList = new ArrayList<>();
         NodeFieldAccessor parentFieldTmp = null;
+        NodeFieldAccessor nodeClassFieldTmp = null;
         List<NodeFieldAccessor> childFieldList = new ArrayList<>();
         List<NodeFieldAccessor> childrenFieldList = new ArrayList<>();
         List<NodeFieldAccessor> cloneableFieldList = new ArrayList<>();
@@ -81,6 +87,10 @@
                 assert Node.class.isAssignableFrom(field.getType());
                 nodeField = NodeFieldAccessor.create(NodeFieldKind.PARENT, field);
                 parentFieldTmp = nodeField;
+            } else if (field.getDeclaringClass() == Node.class && field.getName().equals("nodeClass")) {
+                assert NodeClass.class.isAssignableFrom(field.getType());
+                nodeField = NodeFieldAccessor.create(NodeFieldKind.NODE_CLASS, field);
+                nodeClassFieldTmp = nodeField;
             } else if (field.getAnnotation(Child.class) != null) {
                 checkChildField(field);
                 nodeField = NodeFieldAccessor.create(NodeFieldKind.CHILD, field);
@@ -103,6 +113,7 @@
         }
 
         this.fields = fieldsList.toArray(new NodeFieldAccessor[fieldsList.size()]);
+        this.nodeClassField = nodeClassFieldTmp;
         this.parentField = parentFieldTmp;
         this.childFields = childFieldList.toArray(new NodeFieldAccessor[childFieldList.size()]);
         this.childrenFields = childrenFieldList.toArray(new NodeFieldAccessor[childrenFieldList.size()]);
@@ -110,6 +121,10 @@
         this.clazz = clazz;
     }
 
+    public NodeFieldAccessor getNodeClassField() {
+        return nodeClassField;
+    }
+
     public NodeFieldAccessor[] getCloneableFields() {
         return cloneableFields;
     }
--- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeFieldAccessor.java	Thu Apr 02 01:22:41 2015 +0200
+++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeFieldAccessor.java	Thu Apr 02 01:26:31 2015 +0200
@@ -38,6 +38,8 @@
 public abstract class NodeFieldAccessor {
 
     public static enum NodeFieldKind {
+        /** The reference to the {@link NodeClass}. */
+        NODE_CLASS,
         /** The single {@link Node#getParent() parent} field. */
         PARENT,
         /** A field annotated with {@link Child}. */
--- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeUtil.java	Thu Apr 02 01:22:41 2015 +0200
+++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeUtil.java	Thu Apr 02 01:26:31 2015 +0200
@@ -54,7 +54,7 @@
     }
 
     static Iterator<Node> makeIterator(Node node) {
-        return NodeClass.get(node.getClass()).makeIterator(node);
+        return node.getNodeClass().makeIterator(node);
     }
 
     public static Iterator<Node> makeRecursiveIterator(Node node) {
@@ -132,7 +132,7 @@
 
     static Node deepCopyImpl(Node orig) {
         final Node clone = orig.copy();
-        NodeClass nodeClass = NodeClass.get(clone.getClass());
+        NodeClass nodeClass = clone.getNodeClass();
 
         nodeClass.getParentField().putObject(clone, null);
 
@@ -169,7 +169,7 @@
 
     public static List<Node> findNodeChildren(Node node) {
         List<Node> nodes = new ArrayList<>();
-        NodeClass nodeClass = NodeClass.get(node.getClass());
+        NodeClass nodeClass = node.getNodeClass();
 
         for (NodeFieldAccessor nodeField : nodeClass.getChildFields()) {
             Object child = nodeField.getObject(node);
@@ -197,7 +197,7 @@
     }
 
     public static boolean replaceChild(Node parent, Node oldChild, Node newChild) {
-        NodeClass nodeClass = NodeClass.get(parent.getClass());
+        NodeClass nodeClass = parent.getNodeClass();
 
         for (NodeFieldAccessor nodeField : nodeClass.getChildFields()) {
             if (nodeField.getObject(parent) == oldChild) {
@@ -252,7 +252,7 @@
      */
     public static NodeFieldAccessor findChildField(Node parent, Node child) {
         assert child != null;
-        NodeClass parentNodeClass = NodeClass.get(parent.getClass());
+        NodeClass parentNodeClass = parent.getNodeClass();
 
         for (NodeFieldAccessor field : parentNodeClass.getChildFields()) {
             if (field.getObject(parent) == child) {
@@ -302,7 +302,7 @@
      */
     public static boolean forEachChild(Node parent, NodeVisitor visitor) {
         Objects.requireNonNull(visitor);
-        NodeClass parentNodeClass = NodeClass.get(parent.getClass());
+        NodeClass parentNodeClass = parent.getNodeClass();
 
         for (NodeFieldAccessor field : parentNodeClass.getChildFields()) {
             Object child = field.getObject(parent);
@@ -564,7 +564,7 @@
     }
 
     private static String getNodeFieldName(Node parent, Node node, String defaultName) {
-        NodeFieldAccessor[] fields = NodeClass.get(parent.getClass()).getFields();
+        NodeFieldAccessor[] fields = parent.getNodeClass().getFields();
         for (NodeFieldAccessor field : fields) {
             Object value = field.loadValue(parent);
             if (field.getKind() == NodeFieldKind.CHILD && value == node) {
@@ -644,7 +644,7 @@
         ArrayList<NodeFieldAccessor> childFields = new ArrayList<>();
         String sep = "";
         p.print("(");
-        for (NodeFieldAccessor field : NodeClass.get(node.getClass()).getFields()) {
+        for (NodeFieldAccessor field : NodeClass.get(node).getFields()) {
             if (field.getKind() == NodeFieldKind.CHILD || field.getKind() == NodeFieldKind.CHILDREN) {
                 childFields.add(field);
             } else if (field.getKind() == NodeFieldKind.DATA) {
--- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/serial/PostOrderDeserializer.java	Thu Apr 02 01:22:41 2015 +0200
+++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/serial/PostOrderDeserializer.java	Thu Apr 02 01:26:31 2015 +0200
@@ -257,7 +257,9 @@
 
     private static Node updateParent(Node parent, Node child) {
         if (child != null) {
-            NodeClass.get(child.getClass()).getParentField().putObject(child, parent);
+            NodeClass nodeClass = NodeClass.get(child.getClass());
+            nodeClass.getNodeClassField().putObject(child, nodeClass);
+            nodeClass.getParentField().putObject(child, parent);
         }
         return child;
     }
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/NodeParser.java	Thu Apr 02 01:22:41 2015 +0200
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/NodeParser.java	Thu Apr 02 01:26:31 2015 +0200
@@ -32,6 +32,7 @@
 
 import com.oracle.truffle.api.*;
 import com.oracle.truffle.api.dsl.*;
+import com.oracle.truffle.api.dsl.NodeField;
 import com.oracle.truffle.api.nodes.*;
 import com.oracle.truffle.dsl.processor.*;
 import com.oracle.truffle.dsl.processor.expression.*;
--- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/instrument/SLASTPrinter.java	Thu Apr 02 01:22:41 2015 +0200
+++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/instrument/SLASTPrinter.java	Thu Apr 02 01:26:31 2015 +0200
@@ -28,7 +28,7 @@
 import com.oracle.truffle.api.instrument.*;
 import com.oracle.truffle.api.instrument.impl.*;
 import com.oracle.truffle.api.nodes.*;
-import com.oracle.truffle.api.nodes.NodeUtil.NodeFieldKind;
+import com.oracle.truffle.api.nodes.NodeFieldAccessor.NodeFieldKind;
 
 /**
  * SLASTPrinter is used to print for SL's internal Truffle AST. This is used by