changeset 16922:0ea0c4133b78

Truffle-DSL: fixed polymorphic to monomorphic transition. It remained polymorphic in some cases.
author Christian Humer <christian.humer@gmail.com>
date Mon, 25 Aug 2014 16:30:40 +0200
parents f5541b01f374
children 93e061157811 5ed920f3aa18
files graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/ContainsTest.java graal/com.oracle.truffle.api.dsl/src/com/oracle/truffle/api/dsl/internal/DSLShare.java
diffstat 2 files changed, 46 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/ContainsTest.java	Mon Aug 25 15:56:32 2014 +0200
+++ b/graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/ContainsTest.java	Mon Aug 25 16:30:40 2014 +0200
@@ -23,6 +23,8 @@
 package com.oracle.truffle.api.dsl.test;
 
 import static com.oracle.truffle.api.dsl.test.TestHelper.*;
+import static org.hamcrest.CoreMatchers.*;
+import static org.junit.Assert.*;
 
 import org.junit.*;
 
@@ -32,6 +34,7 @@
 import com.oracle.truffle.api.dsl.test.ContainsTestFactory.Contains2Factory;
 import com.oracle.truffle.api.dsl.test.ContainsTestFactory.Contains3Factory;
 import com.oracle.truffle.api.dsl.test.ContainsTestFactory.Contains4Factory;
+import com.oracle.truffle.api.dsl.test.ContainsTestFactory.PolymorphicToMonomorphic0Factory;
 import com.oracle.truffle.api.dsl.test.TestHelper.ExecutionListener;
 import com.oracle.truffle.api.dsl.test.TypeSystemTest.TestRootNode;
 import com.oracle.truffle.api.dsl.test.TypeSystemTest.ValueNode;
@@ -600,4 +603,41 @@
         }
     }
 
+    @Test
+    public void testPolymorphicToMonomorphic0() {
+        TestRootNode<PolymorphicToMonomorphic0> root = createRoot(PolymorphicToMonomorphic0Factory.getInstance());
+        assertThat((int) executeWith(root, 1), is(1));
+        assertThat((int) executeWith(root, 2), is(2));
+        assertThat((int) executeWith(root, 3), is(3));
+        assertThat(root.getNode().getCost(), is(NodeCost.MONOMORPHIC));
+    }
+
+    @NodeChild("a")
+    static class PolymorphicToMonomorphic0 extends ValueNode {
+
+        boolean isOne(int a) {
+            return a == 1;
+        }
+
+        boolean isTwo(int a) {
+            return a == 2;
+        }
+
+        @Specialization(guards = "isOne")
+        int do1(int a) {
+            return a;
+        }
+
+        @Specialization(guards = "isTwo")
+        int do2(int a) {
+            return a;
+        }
+
+        @Specialization(contains = {"do1", "do2"})
+        int do3(int a) {
+            return a;
+        }
+
+    }
+
 }
--- a/graal/com.oracle.truffle.api.dsl/src/com/oracle/truffle/api/dsl/internal/DSLShare.java	Mon Aug 25 15:56:32 2014 +0200
+++ b/graal/com.oracle.truffle.api.dsl/src/com/oracle/truffle/api/dsl/internal/DSLShare.java	Mon Aug 25 16:30:40 2014 +0200
@@ -99,21 +99,17 @@
     public static <T extends Node & DSLNode> T rewriteToPolymorphic(Node oldNode, DSLNode uninitializedDSL, T polymorphic, DSLNode currentCopy, DSLNode newNodeDSL, String message) {
         assert getNext(oldNode) == null;
         assert getPrevious(oldNode) == null;
+        assert newNodeDSL != null;
 
         Node uninitialized = (Node) uninitializedDSL;
         Node newNode = (Node) newNodeDSL;
         polymorphic.adoptChildren0(oldNode, (Node) currentCopy);
 
         updateSourceSection(oldNode, uninitialized);
-        if (newNode == null) {
-            // fallback
-            currentCopy.adoptChildren0(null, uninitialized);
-        } else {
-            // new specialization
-            updateSourceSection(oldNode, newNode);
-            newNodeDSL.adoptChildren0(null, uninitialized);
-            currentCopy.adoptChildren0(null, newNode);
-        }
+        // new specialization
+        updateSourceSection(oldNode, newNode);
+        newNodeDSL.adoptChildren0(null, uninitialized);
+        currentCopy.adoptChildren0(null, newNode);
 
         oldNode.replace(polymorphic, message);
 
@@ -165,7 +161,7 @@
         assert prev.getCost() == NodeCost.POLYMORPHIC;
 
         updateSourceSection(prev, newNode);
-        if (depth == 0) {
+        if (depth <= 1) {
             newNode.adoptChildren0(prev, null);
             return prev.replace(newNode, "Polymorphic to monomorphic.");
         } else {