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()) {