comparison truffle/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/AssumptionsTest.java @ 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 60c68f691534
children
comparison
equal deleted inserted replaced
22520:20ce790acc30 22521:69e80ff8d725
23 package com.oracle.truffle.api.dsl.test; 23 package com.oracle.truffle.api.dsl.test;
24 24
25 import static com.oracle.truffle.api.dsl.test.TestHelper.createCallTarget; 25 import static com.oracle.truffle.api.dsl.test.TestHelper.createCallTarget;
26 import static com.oracle.truffle.api.dsl.test.TestHelper.getNode; 26 import static com.oracle.truffle.api.dsl.test.TestHelper.getNode;
27 import static org.junit.Assert.assertEquals; 27 import static org.junit.Assert.assertEquals;
28 import static org.junit.Assert.assertNotSame;
28 import static org.junit.Assert.fail; 29 import static org.junit.Assert.fail;
29 30
30 import java.util.HashMap; 31 import java.util.HashMap;
31 import java.util.Map; 32 import java.util.Map;
32 33
47 import com.oracle.truffle.api.dsl.test.AssumptionsTestFactory.FieldTestFactory; 48 import com.oracle.truffle.api.dsl.test.AssumptionsTestFactory.FieldTestFactory;
48 import com.oracle.truffle.api.dsl.test.AssumptionsTestFactory.MethodTestFactory; 49 import com.oracle.truffle.api.dsl.test.AssumptionsTestFactory.MethodTestFactory;
49 import com.oracle.truffle.api.dsl.test.AssumptionsTestFactory.MultipleAssumptionArraysTestFactory; 50 import com.oracle.truffle.api.dsl.test.AssumptionsTestFactory.MultipleAssumptionArraysTestFactory;
50 import com.oracle.truffle.api.dsl.test.AssumptionsTestFactory.MultipleAssumptionsTestFactory; 51 import com.oracle.truffle.api.dsl.test.AssumptionsTestFactory.MultipleAssumptionsTestFactory;
51 import com.oracle.truffle.api.dsl.test.AssumptionsTestFactory.NodeFieldTest2Factory; 52 import com.oracle.truffle.api.dsl.test.AssumptionsTestFactory.NodeFieldTest2Factory;
53 import com.oracle.truffle.api.dsl.test.AssumptionsTestFactory.RemoveAndCacheSpecializationTestFactory;
52 import com.oracle.truffle.api.dsl.test.AssumptionsTestFactory.RemoveSpecializationTestFactory; 54 import com.oracle.truffle.api.dsl.test.AssumptionsTestFactory.RemoveSpecializationTestFactory;
53 import com.oracle.truffle.api.dsl.test.AssumptionsTestFactory.StaticFieldTestFactory; 55 import com.oracle.truffle.api.dsl.test.AssumptionsTestFactory.StaticFieldTestFactory;
54 import com.oracle.truffle.api.dsl.test.TypeSystemTest.ValueNode; 56 import com.oracle.truffle.api.dsl.test.TypeSystemTest.ValueNode;
55 57
56 public class AssumptionsTest { 58 public class AssumptionsTest {
355 return false; 357 return false;
356 } 358 }
357 359
358 } 360 }
359 361
362 @Test
363 public void testAssumptionRemovesInvalidSpecializationBeforeNext() {
364 CallTarget root = createCallTarget(RemoveAndCacheSpecializationTestFactory.getInstance());
365 RemoveAndCacheSpecializationTest node = getNode(root);
366
367 assertEquals(1, root.call(1));
368 SpecializationNode start0 = ((SpecializedNode) node).getSpecializationNode();
369 assertEquals("ValidAssumptionNode_", start0.getClass().getSimpleName());
370
371 node.assumption1.invalidate();
372 // The specialization should be removed, and a new cached entry be inserted
373 assertEquals(2, root.call(2));
374 SpecializationNode start1 = ((SpecializedNode) node).getSpecializationNode();
375 assertNotSame(start0, start1);
376 assertEquals("ValidAssumptionNode_", start1.getClass().getSimpleName());
377 }
378
379 @NodeChild
380 @SuppressWarnings("unused")
381 static class RemoveAndCacheSpecializationTest extends ValueNode {
382
383 protected final Assumption assumption1 = Truffle.getRuntime().createAssumption();
384 protected final Assumption assumption2 = Truffle.getRuntime().createAssumption();
385
386 protected Assumption assumptionForValue(int value) {
387 return value == 1 ? assumption1 : assumption2;
388 }
389
390 @Specialization(guards = "value == cachedValue", assumptions = "assumptionForValue(cachedValue)", limit = "1")
391 int validAssumption(int value, @Cached("value") int cachedValue) {
392 return cachedValue;
393 }
394
395 @Specialization
396 int uncached(int value) {
397 return -1;
398 }
399
400 }
401
360 @NodeChild 402 @NodeChild
361 static class ErrorIncompatibleReturnType extends ValueNode { 403 static class ErrorIncompatibleReturnType extends ValueNode {
362 @ExpectError("Incompatible return type int. Assumptions must be assignable to Assumption or Assumption[].") 404 @ExpectError("Incompatible return type int. Assumptions must be assignable to Assumption or Assumption[].")
363 @Specialization(assumptions = "3") 405 @Specialization(assumptions = "3")
364 static int do1(int value) { 406 static int do1(int value) {