changeset 11193:6879565ee10b

Truffle-DSL: Fixed the second specialization is unreachable if two specializations have the exactly same signature (also guards) and are ordered next to each other.
author Christian Humer <christian.humer@gmail.com>
date Thu, 01 Aug 2013 20:52:03 +0200
parents 0460c44aef60
children 14d5ff4683e0
files graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeParser.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/SpecializationData.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/template/TemplateMethod.java
diffstat 3 files changed, 33 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeParser.java	Thu Aug 01 20:48:56 2013 +0200
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeParser.java	Thu Aug 01 20:52:03 2013 +0200
@@ -665,6 +665,7 @@
         }
 
         // calculate reachability
+        SpecializationData prev = null;
         int specializationCount = 0;
         boolean reachable = true;
         for (SpecializationData specialization : specializations) {
@@ -672,7 +673,9 @@
                 specialization.setReachable(true);
                 continue;
             }
-            if (!reachable && specialization.getMethod() != null) {
+            if (prev != null && prev.equalsGuards(specialization) && prev.getExceptions().isEmpty()) {
+                specialization.addError("%s is not reachable.", specialization.isGeneric() ? "Generic" : "Specialization");
+            } else if (!reachable && specialization.getMethod() != null) {
                 specialization.addError("%s is not reachable.", specialization.isGeneric() ? "Generic" : "Specialization");
             }
             specialization.setReachable(reachable);
@@ -682,6 +685,7 @@
             if (!specialization.isGeneric()) {
                 specializationCount++;
             }
+            prev = specialization;
         }
 
         // initialize polymorphic depth
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/SpecializationData.java	Thu Aug 01 20:48:56 2013 +0200
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/SpecializationData.java	Thu Aug 01 20:52:03 2013 +0200
@@ -259,4 +259,11 @@
             getParameters().add(0, new ActualParameter(frameSpec, frameType, -1, false));
         }
     }
+
+    public boolean equalsGuards(SpecializationData specialization) {
+        if (assumptions.equals(specialization.getAssumptions()) && guards.equals(specialization.getGuards()) && getSignature().equalsParameters(specialization.getSignature())) {
+            return true;
+        }
+        return false;
+    }
 }
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/template/TemplateMethod.java	Thu Aug 01 20:48:56 2013 +0200
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/template/TemplateMethod.java	Thu Aug 01 20:52:03 2013 +0200
@@ -216,6 +216,20 @@
         return signature;
     }
 
+    public ActualParameter getSignatureParameter(int searchIndex) {
+        int index = 0;
+        for (ActualParameter parameter : getParameters()) {
+            if (!parameter.getSpecification().isSignature()) {
+                continue;
+            }
+            if (index == searchIndex) {
+                return parameter;
+            }
+            index++;
+        }
+        return null;
+    }
+
     public void updateSignature(Signature signature) {
         assert signature.size() >= 1;
         int signatureIndex = 0;
@@ -366,6 +380,13 @@
             return signature;
         }
 
+        public boolean equalsParameters(Signature other) {
+            if (size() != other.size()) {
+                return false;
+            }
+            return types.subList(1, types.size()).equals(other.types.subList(1, other.types.size()));
+        }
+
         @Override
         public boolean equals(Object obj) {
             if (obj instanceof Signature) {