# HG changeset patch # User Thomas Wuerthinger # Date 1429789031 -7200 # Node ID a11325faa4d9aa0adb85ed451c9925d9195f6600 # Parent 87aac173f09da16f10a421432863729e3ad7eb9c Distinguish ends in the scheduling phase that always have to be the last node from other ends. diff -r 87aac173f09d -r a11325faa4d9 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 Wed Apr 22 21:58:23 2015 +0200 +++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java Thu Apr 23 13:37:11 2015 +0200 @@ -314,7 +314,7 @@ } FixedNode endNode = b.getEndNode(); FixedNode fixedEndNode = null; - if (endNode instanceof ControlSplitNode || endNode instanceof AbstractEndNode) { + if (isFixedEnd(endNode)) { // Only if the end node is either a control split or an end node, we need to force it to // be the last node in the schedule. fixedEndNode = endNode; @@ -497,8 +497,10 @@ // Start analysis with control flow ends. for (Block b : cfg.postOrder()) { FixedNode endNode = b.getEndNode(); - stack.push(endNode); - nodeToBlock.set(endNode, b); + if (isFixedEnd(endNode)) { + stack.push(endNode); + nodeToBlock.set(endNode, b); + } } processStack(cfg, blockToNodes, nodeToBlock, visited, floatingReads, stack); @@ -545,8 +547,10 @@ // Add end nodes as the last nodes in each block. for (Block b : cfg.getBlocks()) { FixedNode endNode = b.getEndNode(); - if (endNode != b.getBeginNode()) { - addNode(blockToNodes, b, endNode); + if (isFixedEnd(endNode)) { + if (endNode != b.getBeginNode()) { + addNode(blockToNodes, b, endNode); + } } } @@ -561,6 +565,10 @@ assert MemoryScheduleVerification.check(cfg.getStartBlock(), blockToNodes); } + private static boolean isFixedEnd(FixedNode endNode) { + return endNode instanceof ControlSplitNode || endNode instanceof ControlSinkNode || endNode instanceof AbstractEndNode; + } + private static void resortEarliestWithinBlock(Block b, BlockMap> blockToNodes, NodeMap nodeToBlock, NodeBitMap unprocessed) { ArrayList watchList = new ArrayList<>(); List oldList = blockToNodes.get(b);