# HG changeset patch # User Christian Humer # Date 1377870952 -7200 # Node ID a317acdd5f2c3aba38e61a0142e167a2f25f5b26 # Parent f33beed55ddc75d157c15397286443319af1ef84 Truffle-DSL: fixed a bug in else connections of generic generated methods. diff -r f33beed55ddc -r a317acdd5f2c graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/SpecializationGroupingTest.java --- a/graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/SpecializationGroupingTest.java Fri Aug 30 15:55:22 2013 +0200 +++ b/graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/SpecializationGroupingTest.java Fri Aug 30 15:55:52 2013 +0200 @@ -27,6 +27,7 @@ import com.oracle.truffle.api.*; import com.oracle.truffle.api.dsl.*; import com.oracle.truffle.api.dsl.test.SpecializationGroupingTestFactory.TestElseConnectionBug1Factory; +import com.oracle.truffle.api.dsl.test.SpecializationGroupingTestFactory.TestElseConnectionBug2Factory; import com.oracle.truffle.api.dsl.test.SpecializationGroupingTestFactory.TestGroupingFactory; import com.oracle.truffle.api.dsl.test.TypeSystemTest.SimpleTypes; import com.oracle.truffle.api.dsl.test.TypeSystemTest.TestRootNode; @@ -200,6 +201,39 @@ } + @Test + public void testElseConnectionBug2() { + TestHelper.assertRuns(TestElseConnectionBug2Factory.getInstance(), 42, TestHelper.array(42)); + } + + @SuppressWarnings("unused") + @NodeChild + public abstract static class TestElseConnectionBug2 extends ValueNode { + + @Specialization(order = 2, guards = "guard0") + public int doGuard0(int value) { + throw new AssertionError(); + } + + @Specialization(order = 3, guards = "guard1") + public int doGuard1(int value) { + throw new AssertionError(); + } + + @Specialization(order = 4, guards = "!guard0") + public int doUninitialized(int value) { + return value; + } + + boolean guard0(int value) { + return false; + } + + boolean guard1(int value) { + return false; + } + } + private static class MockAssumption implements Assumption { int checked; diff -r f33beed55ddc -r a317acdd5f2c graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/SpecializationGroup.java --- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/SpecializationGroup.java Fri Aug 30 15:55:22 2013 +0200 +++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/SpecializationGroup.java Fri Aug 30 15:55:52 2013 +0200 @@ -110,17 +110,18 @@ } private GuardData findNegatedGuardInPrevious(GuardData guard) { - SpecializationGroup previous = this; - while ((previous = previous.getPreviousGroup()) != null) { - List elseConnectedGuards = previous.getElseConnectableGuards(); + SpecializationGroup previous = this.getPreviousGroup(); + if (previous == null) { + return null; + } + List elseConnectedGuards = previous.getElseConnectableGuards(); - if (previous == null || previous.getGuards().size() != elseConnectedGuards.size() + 1) { - return null; - } - GuardData previousGuard = previous.getGuards().get(elseConnectedGuards.size()); - if (guard.getMethod().equals(previousGuard.getMethod()) && guard.isNegated() != previousGuard.isNegated()) { - return guard; - } + if (previous == null || previous.getGuards().size() != elseConnectedGuards.size() + 1) { + return null; + } + GuardData previousGuard = previous.getGuards().get(elseConnectedGuards.size()); + if (guard.getMethod().equals(previousGuard.getMethod()) && guard.isNegated() != previousGuard.isNegated()) { + return guard; } return null; }