Mercurial > hg > truffle
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[].")