changeset 11320:80de3bbfa8b9

Truffle-DSL: fixed inconsistent children for polymorphic -> generic rewrites. (GRAAL-425)
author Christian Humer <christian.humer@gmail.com>
date Fri, 16 Aug 2013 14:00:17 +0200
parents 9f317a663366
children 77bf4af4cc94
files graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/PolymorphicTest.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeCodeGenerator.java
diffstat 2 files changed, 31 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/PolymorphicTest.java	Thu Aug 15 19:46:05 2013 +0200
+++ b/graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/PolymorphicTest.java	Fri Aug 16 14:00:17 2013 +0200
@@ -31,6 +31,7 @@
 import com.oracle.truffle.api.dsl.test.BinaryNodeTest.BinaryNode;
 import com.oracle.truffle.api.dsl.test.PolymorphicTestFactory.Node1Factory;
 import com.oracle.truffle.api.dsl.test.TypeSystemTest.TestRootNode;
+import com.oracle.truffle.api.dsl.test.TypeSystemTest.ValueNode;
 import com.oracle.truffle.api.nodes.*;
 import com.oracle.truffle.api.nodes.NodeInfo.Kind;
 
@@ -44,6 +45,8 @@
         assertEquals("(int,boolean)", executeWith(node, 42, false));
         assertEquals("(boolean,int)", executeWith(node, false, 42));
         assertEquals(Kind.SPECIALIZED, node.getNode().getClass().getAnnotation(NodeInfo.class).kind());
+        assertEquals(node.getNode(), node.getNode().getLeft().getParent());
+        assertEquals(node.getNode(), node.getNode().getRight().getParent());
     }
 
     @Test
@@ -52,6 +55,8 @@
         assertEquals("(int,boolean)", executeWith(node, 42, false));
         assertEquals("(int,int)", executeWith(node, 42, 42));
         assertEquals(Kind.POLYMORPHIC, node.getNode().getClass().getAnnotation(NodeInfo.class).kind());
+        assertEquals(node.getNode(), node.getNode().getLeft().getParent());
+        assertEquals(node.getNode(), node.getNode().getRight().getParent());
     }
 
     @Test
@@ -61,6 +66,8 @@
         assertEquals("(boolean,boolean)", executeWith(node, true, false));
         assertEquals("(int,int)", executeWith(node, 42, 42));
         assertEquals(Kind.POLYMORPHIC, node.getNode().getClass().getAnnotation(NodeInfo.class).kind());
+        assertEquals(node.getNode(), node.getNode().getLeft().getParent());
+        assertEquals(node.getNode(), node.getNode().getRight().getParent());
     }
 
     @Test
@@ -71,6 +78,8 @@
         assertEquals("(boolean,boolean)", executeWith(node, true, false));
         assertEquals("(int,int)", executeWith(node, 42, 42));
         assertEquals(Kind.GENERIC, node.getNode().getClass().getAnnotation(NodeInfo.class).kind());
+        assertEquals(node.getNode(), node.getNode().getLeft().getParent());
+        assertEquals(node.getNode(), node.getNode().getRight().getParent());
     }
 
     @Test
@@ -78,21 +87,30 @@
         TestRootNode<Node1> node = TestHelper.createRoot(Node1Factory.getInstance());
         assertEquals("(generic,generic)", executeWith(node, "", ""));
         assertEquals(Kind.GENERIC, node.getNode().getClass().getAnnotation(NodeInfo.class).kind());
+        assertEquals(node.getNode(), node.getNode().getLeft().getParent());
+        assertEquals(node.getNode(), node.getNode().getRight().getParent());
     }
 
     @Test
-    public void testGenericPolymorphic() {
+    public void testGenericPolymorphic1() {
         TestRootNode<Node1> node = TestHelper.createRoot(Node1Factory.getInstance());
         assertEquals("(boolean,int)", executeWith(node, false, 42));
-        assertEquals("(int,boolean)", executeWith(node, 42, false));
+        assertEquals("(boolean,boolean)", executeWith(node, false, false));
         assertEquals("(generic,generic)", executeWith(node, "", ""));
         assertEquals(Kind.GENERIC, node.getNode().getClass().getAnnotation(NodeInfo.class).kind());
+        /* Assertions for bug GRAAL-425 */
+        assertEquals(node.getNode(), node.getNode().getLeft().getParent());
+        assertEquals(node.getNode(), node.getNode().getRight().getParent());
     }
 
     @SuppressWarnings("unused")
     @PolymorphicLimit(3)
     abstract static class Node1 extends BinaryNode {
 
+        public abstract ValueNode getLeft();
+
+        public abstract ValueNode getRight();
+
         @Specialization(order = 1)
         String add(int left, int right) {
             return "(int,int)";
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeCodeGenerator.java	Thu Aug 15 19:46:05 2013 +0200
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeCodeGenerator.java	Fri Aug 16 14:00:17 2013 +0200
@@ -1769,6 +1769,12 @@
             CodeTreeBuilder builder = parent.create();
             builder.declaration(getContext().getTruffleTypes().getNode(), "root", currentNode);
             builder.startIf().string(currentNode).string(".next0 != null").end().startBlock();
+            /*
+             * Communicates to the caller of executeAndSpecialize that it was rewritten to generic.
+             * Its important that this is used instead of the currentNode since the caller is this.
+             * CurrentNode may not be this anymore at this place.
+             */
+            builder.statement("this.next0 = null");
             builder.tree(createFindRoot(builder, node, false));
             builder.end();
             builder.end();
@@ -2502,9 +2508,10 @@
 
             builder.startIf().string("depth > ").string(String.valueOf(node.getPolymorphicDepth())).end();
             builder.startBlock();
-            String message = ("Polymorphic limit reached (" + node.getPolymorphicDepth() + ")");
+            String message = "Polymorphic limit reached (" + node.getPolymorphicDepth() + ")";
+            String castRoot = "(" + baseClassName(node) + ") root";
             builder.tree(createGenericInvoke(builder, node.getGenericPolymorphicSpecialization(), node.getGenericSpecialization(),
-                            createReplaceCall(builder, node.getGenericSpecialization(), "root", "this", message), null));
+                            createReplaceCall(builder, node.getGenericSpecialization(), "root", castRoot, message), null));
             builder.end();
 
             builder.startElseBlock();
@@ -2521,7 +2528,9 @@
 
             builder.declaration(node.getGenericSpecialization().getReturnType().getType(), "result", specializeCall.getRoot());
 
+            builder.startIf().string("this.next0 != null").end().startBlock();
             builder.startStatement().string("(").cast(nodePolymorphicClassName(node, node.getGenericPolymorphicSpecialization())).string("root).optimizeTypes()").end();
+            builder.end();
 
             if (Utils.isVoid(builder.findMethod().getReturnType())) {
                 builder.returnStatement();