changeset 21065:986f1c0d6f55

Truffle-DSL: do not generate polymorphic nodes for nodes with all parameters evaluated in all execute methods.
author Christian Humer <christian.humer@oracle.com>
date Fri, 17 Apr 2015 16:18:17 +0200
parents 28117ede7606
children 82539241ff38
files graal/com.oracle.truffle.api.dsl/src/com/oracle/truffle/api/dsl/internal/SpecializationNode.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeGenFactory.java
diffstat 2 files changed, 20 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.truffle.api.dsl/src/com/oracle/truffle/api/dsl/internal/SpecializationNode.java	Tue Apr 21 10:32:52 2015 +0200
+++ b/graal/com.oracle.truffle.api.dsl/src/com/oracle/truffle/api/dsl/internal/SpecializationNode.java	Fri Apr 17 16:18:17 2015 +0200
@@ -504,7 +504,15 @@
         if (merged == generated) {
             // new node
             if (start.count() == 2) {
-                insertAt(start, start.createPolymorphic(), "insert polymorphic");
+                SpecializationNode polymorphic = start.createPolymorphic();
+                /*
+                 * For nodes with all parameters evaluated in the execute method we do not need a
+                 * polymorphic node. the generated code returns null in createPolymorphic in this
+                 * case.
+                 */
+                if (polymorphic != null) {
+                    insertAt(start, polymorphic, "insert polymorphic");
+                }
             }
             SpecializationNode current = start;
             while (current != null && current.index < generated.index) {
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeGenFactory.java	Tue Apr 21 10:32:52 2015 +0200
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeGenFactory.java	Fri Apr 17 16:18:17 2015 +0200
@@ -420,6 +420,17 @@
     }
 
     private boolean needsPolymorphic() {
+        int signatureSize = node.getSignatureSize();
+        boolean allEvaluated = true;
+        for (ExecutableTypeData type : usedTypes) {
+            if (type.getEvaluatedCount() != signatureSize) {
+                allEvaluated = false;
+            }
+        }
+        if (allEvaluated) {
+            return false;
+        }
+
         if (reachableSpecializations.size() != 1) {
             return true;
         }