Mercurial > hg > graal-compiler
changeset 21086:0a3bc68fc3a7
Fix a bug in the schedule phase connected with data dependencies on a block end node that is not a control split node.
author | Thomas Wuerthinger <thomas.wuerthinger@oracle.com> |
---|---|
date | Wed, 22 Apr 2015 15:36:38 +0200 |
parents | a671d592a8da |
children | 056f90577ed1 |
files | graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java |
diffstat | 1 files changed, 11 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java Tue Apr 21 01:27:08 2015 +0200 +++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java Wed Apr 22 15:36:38 2015 +0200 @@ -313,8 +313,14 @@ } } FixedNode endNode = b.getEndNode(); + FixedNode fixedEndNode = null; + if (endNode instanceof ControlSplitNode || endNode instanceof AbstractEndNode) { + // 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; + } for (Node n : earliestSorting) { - if (n != endNode) { + if (n != fixedEndNode) { if (n instanceof FixedNode) { assert nodeMap.get(n) == b; checkWatchList(b, nodeMap, unprocessed, result, watchList, n); @@ -337,11 +343,11 @@ assert nodeMap.get(n) == b; assert !(n instanceof FixedNode); if (unprocessed.isMarked(n)) { - sortIntoList(n, b, result, nodeMap, unprocessed, endNode); + sortIntoList(n, b, result, nodeMap, unprocessed, fixedEndNode); } } - if (unprocessed.isMarked(endNode)) { + if (endNode != null && unprocessed.isMarked(endNode)) { sortIntoList(endNode, b, result, nodeMap, unprocessed, null); } @@ -679,7 +685,8 @@ inputEarliest = nodeToBlock.get(((ControlSplitNode) input).getPrimarySuccessor()); } else { assert inputEarliest.getSuccessorCount() == 1; - inputEarliest = inputEarliest.getSuccessors().get(0); + assert !(input instanceof AbstractEndNode); + // Keep regular inputEarliest } } if (earliest.getDominatorDepth() < inputEarliest.getDominatorDepth()) {