changeset 22521:69e80ff8d725

Add a higher-level test checking that invalid specializations are removed before insertion.
author Benoit Daloze <benoit.daloze@jku.at>
date Fri, 18 Dec 2015 17:00:32 +0100
parents 20ce790acc30
children cda3eebfa777
files truffle/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/AssumptionsTest.java
diffstat 1 files changed, 42 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/truffle/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/AssumptionsTest.java	Fri Dec 18 16:41:31 2015 +0100
+++ b/truffle/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/AssumptionsTest.java	Fri Dec 18 17:00:32 2015 +0100
@@ -25,6 +25,7 @@
 import static com.oracle.truffle.api.dsl.test.TestHelper.createCallTarget;
 import static com.oracle.truffle.api.dsl.test.TestHelper.getNode;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotSame;
 import static org.junit.Assert.fail;
 
 import java.util.HashMap;
@@ -49,6 +50,7 @@
 import com.oracle.truffle.api.dsl.test.AssumptionsTestFactory.MultipleAssumptionArraysTestFactory;
 import com.oracle.truffle.api.dsl.test.AssumptionsTestFactory.MultipleAssumptionsTestFactory;
 import com.oracle.truffle.api.dsl.test.AssumptionsTestFactory.NodeFieldTest2Factory;
+import com.oracle.truffle.api.dsl.test.AssumptionsTestFactory.RemoveAndCacheSpecializationTestFactory;
 import com.oracle.truffle.api.dsl.test.AssumptionsTestFactory.RemoveSpecializationTestFactory;
 import com.oracle.truffle.api.dsl.test.AssumptionsTestFactory.StaticFieldTestFactory;
 import com.oracle.truffle.api.dsl.test.TypeSystemTest.ValueNode;
@@ -357,6 +359,46 @@
 
     }
 
+    @Test
+    public void testAssumptionRemovesInvalidSpecializationBeforeNext() {
+        CallTarget root = createCallTarget(RemoveAndCacheSpecializationTestFactory.getInstance());
+        RemoveAndCacheSpecializationTest node = getNode(root);
+
+        assertEquals(1, root.call(1));
+        SpecializationNode start0 = ((SpecializedNode) node).getSpecializationNode();
+        assertEquals("ValidAssumptionNode_", start0.getClass().getSimpleName());
+
+        node.assumption1.invalidate();
+        // The specialization should be removed, and a new cached entry be inserted
+        assertEquals(2, root.call(2));
+        SpecializationNode start1 = ((SpecializedNode) node).getSpecializationNode();
+        assertNotSame(start0, start1);
+        assertEquals("ValidAssumptionNode_", start1.getClass().getSimpleName());
+    }
+
+    @NodeChild
+    @SuppressWarnings("unused")
+    static class RemoveAndCacheSpecializationTest extends ValueNode {
+
+        protected final Assumption assumption1 = Truffle.getRuntime().createAssumption();
+        protected final Assumption assumption2 = Truffle.getRuntime().createAssumption();
+
+        protected Assumption assumptionForValue(int value) {
+            return value == 1 ? assumption1 : assumption2;
+        }
+
+        @Specialization(guards = "value == cachedValue", assumptions = "assumptionForValue(cachedValue)", limit = "1")
+        int validAssumption(int value, @Cached("value") int cachedValue) {
+            return cachedValue;
+        }
+
+        @Specialization
+        int uncached(int value) {
+            return -1;
+        }
+
+    }
+
     @NodeChild
     static class ErrorIncompatibleReturnType extends ValueNode {
         @ExpectError("Incompatible return type int. Assumptions must be assignable to Assumption or Assumption[].")