diff graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeParser.java @ 10600:e93efe3ba5f4

Truffle-DSL: rewritten polymorphic optimization for simpler generated code.
author Christian Humer <christian.humer@gmail.com>
date Tue, 02 Jul 2013 14:51:05 +0200
parents 79041ab43660
children b8fe1fe004ec
line wrap: on
line diff
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeParser.java	Mon Jul 01 21:08:20 2013 +0200
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeParser.java	Tue Jul 02 14:51:05 2013 +0200
@@ -33,9 +33,10 @@
 import com.oracle.truffle.api.dsl.*;
 import com.oracle.truffle.api.nodes.*;
 import com.oracle.truffle.dsl.processor.*;
-import com.oracle.truffle.dsl.processor.node.NodeChildData.*;
+import com.oracle.truffle.dsl.processor.node.NodeChildData.Cardinality;
+import com.oracle.truffle.dsl.processor.node.NodeChildData.ExecutionKind;
 import com.oracle.truffle.dsl.processor.template.*;
-import com.oracle.truffle.dsl.processor.template.TemplateMethod.*;
+import com.oracle.truffle.dsl.processor.template.TemplateMethod.Signature;
 import com.oracle.truffle.dsl.processor.typesystem.*;
 
 public class NodeParser extends TemplateParser<NodeData> {
@@ -200,7 +201,7 @@
         for (NodeData splittedNode : nodes) {
             finalizeSpecializations(elements, splittedNode);
             verifyNode(splittedNode, elements);
-            splittedNode.setPolymorphicSpecializations(createPolymorphicSpecializations(splittedNode));
+            createPolymorphicSpecializations(splittedNode);
             assignShortCircuitsToSpecializations(splittedNode);
         }
 
@@ -212,13 +213,14 @@
         return node;
     }
 
-    private List<SpecializationData> createPolymorphicSpecializations(NodeData node) {
+    private void createPolymorphicSpecializations(NodeData node) {
         if (!node.needsRewrites(context) || node.getPolymorphicDepth() <= 1) {
-            return Collections.emptyList();
+            node.setPolymorphicSpecializations(Collections.<SpecializationData> emptyList());
+            return;
         }
 
         Signature genericSignature = node.getGenericSpecialization().getSignature();
-        Set<Signature> signatures = new HashSet<>();
+        Set<Signature> signatures = new TreeSet<>();
 
         for (SpecializationData specialization1 : node.getSpecializations()) {
             Signature signature = specialization1.getSignature();
@@ -247,8 +249,8 @@
         }
 
         List<Signature> sortedSignatures = new ArrayList<>(signatures);
-        Collections.sort(sortedSignatures);
 
+        SpecializationData polymorphicGeneric = null;
         List<SpecializationData> specializations = new ArrayList<>();
         SpecializationData generic = node.getGenericSpecialization();
         for (Signature signature : sortedSignatures) {
@@ -256,15 +258,15 @@
             specialization.forceFrame(context.getTruffleTypes().getFrame());
             specialization.setNode(node);
             specialization.updateSignature(signature);
+            specializations.add(specialization);
 
-            if (specialization.isGenericSpecialization(context)) {
-                specializations.add(0, specialization);
-            } else {
-                specializations.add(specialization);
+            if (genericSignature.equals(signature)) {
+                polymorphicGeneric = specialization;
             }
         }
 
-        return specializations;
+        node.setGenericPolymoprhicSpecialization(polymorphicGeneric);
+        node.setPolymorphicSpecializations(specializations);
     }
 
     private NodeData parseNodeData(TypeElement templateType, TypeMirror nodeType, List<? extends Element> elements, List<TypeElement> lookupTypes) {
@@ -1071,7 +1073,7 @@
     }
 
     private static Map<Integer, List<ExecutableTypeData>> groupExecutableTypes(List<ExecutableTypeData> executableTypes) {
-        Map<Integer, List<ExecutableTypeData>> groupedTypes = new HashMap<>();
+        Map<Integer, List<ExecutableTypeData>> groupedTypes = new TreeMap<>();
         for (ExecutableTypeData type : executableTypes) {
             int evaluatedCount = type.getEvaluatedCount();