Mercurial > hg > truffle
diff graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/ContainsTest.java @ 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 | d834f85ac8a1 |
children | c88ab4f1f04a |
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; + } + + } + }