# HG changeset patch # User Erik Eckstein # Date 1400582337 -7200 # Node ID 6a6cb7f2db907fb797e49874a85394676071b2da # Parent bdf260d8e1639c9e0b8da7e6d444b988defc91b2 fix wrong handling of memory anti-dependencies in scheduler diff -r bdf260d8e163 -r 6a6cb7f2db90 graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/MemoryScheduleTest.java --- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/MemoryScheduleTest.java Mon May 19 17:21:30 2014 -0700 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/MemoryScheduleTest.java Tue May 20 12:38:57 2014 +0200 @@ -374,6 +374,30 @@ assertReadAndWriteInSameBlock(schedule, false); } + public static int testAntiDependencySnippet(int a) { + /* + * This read must not be scheduled after the following write. + */ + int res = container.a; + container.a = 10; + + /* + * Add some more basic blocks. + */ + if (a < 0) { + container.b = 20; + } + container.c = 30; + return res; + } + + @Test + public void testAntiDependency() { + SchedulePhase schedule = getFinalSchedule("testAntiDependencySnippet", TestMode.WITHOUT_FRAMESTATES); + assertDeepEquals(4, schedule.getCFG().getBlocks().size()); + assertReadBeforeAllWritesInStartBlock(schedule); + } + /** * testing scheduling within a block. */ @@ -574,6 +598,20 @@ assertTrue(!(inSame ^ schedule.getCFG().blockFor(read) == schedule.getCFG().blockFor(write))); } + private static void assertReadBeforeAllWritesInStartBlock(SchedulePhase schedule) { + boolean writeNodeFound = false; + boolean readNodeFound = false; + for (Node node : schedule.nodesFor(schedule.getCFG().getStartBlock())) { + if (node instanceof FloatingReadNode) { + assertTrue(!writeNodeFound); + readNodeFound = true; + } else if (node instanceof WriteNode) { + writeNodeFound = true; + } + } + assertTrue(readNodeFound); + } + private SchedulePhase getFinalSchedule(final String snippet, final TestMode mode) { return getFinalSchedule(snippet, mode, MemoryScheduling.OPTIMAL); } diff -r bdf260d8e163 -r 6a6cb7f2db90 graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java --- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java Mon May 19 17:21:30 2014 -0700 +++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java Tue May 20 12:38:57 2014 +0200 @@ -235,18 +235,17 @@ if (!foundExcludeNode && node == excludeNode) { foundExcludeNode = true; } - if (node == startNode) { - continue; + if (node != startNode) { + if (node instanceof MemoryCheckpoint.Single) { + LocationIdentity identity = ((MemoryCheckpoint.Single) node).getLocationIdentity(); + accm.add(identity); + } else if (node instanceof MemoryCheckpoint.Multi) { + for (LocationIdentity identity : ((MemoryCheckpoint.Multi) node).getLocationIdentities()) { + accm.add(identity); + } + } + assert MemoryCheckpoint.TypeAssertion.correctType(node); } - if (node instanceof MemoryCheckpoint.Single) { - LocationIdentity identity = ((MemoryCheckpoint.Single) node).getLocationIdentity(); - accm.add(identity); - } else if (node instanceof MemoryCheckpoint.Multi) { - for (LocationIdentity identity : ((MemoryCheckpoint.Multi) node).getLocationIdentities()) { - accm.add(identity); - } - } - assert MemoryCheckpoint.TypeAssertion.correctType(node); if (foundExcludeNode) { accm = set;