changeset 10890:2cdd22e1ac5e

SchedulingPhase: check if fixed nodes have the same order before and after sorting a block
author Bernhard Urban <bernhard.urban@jku.at>
date Fri, 26 Jul 2013 20:18:40 +0200
parents a9225e3678aa
children 8c0ab217ed00
files graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java
diffstat 1 files changed, 23 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java	Fri Jul 26 19:49:36 2013 +0200
+++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java	Fri Jul 26 20:18:40 2013 +0200
@@ -515,9 +515,32 @@
             default:
                 throw new GraalInternalError("unknown scheduling strategy");
         }
+        assert sameOrderForFixedNodes(blockToNodesMap.get(b), sortedInstructions) : "fixed nodes in sorted block are not in the same order";
         blockToNodesMap.put(b, sortedInstructions);
     }
 
+    private static boolean sameOrderForFixedNodes(List<ScheduledNode> fixed, List<ScheduledNode> sorted) {
+        Iterator<ScheduledNode> fixedIterator = fixed.iterator();
+        Iterator<ScheduledNode> sortedIterator = sorted.iterator();
+
+        while (sortedIterator.hasNext()) {
+            ScheduledNode sortedCurrent = sortedIterator.next();
+            if (sortedCurrent instanceof FixedNode) {
+                if (!(fixedIterator.hasNext() && fixedIterator.next() == sortedCurrent)) {
+                    return false;
+                }
+            }
+        }
+
+        while (fixedIterator.hasNext()) {
+            if (fixedIterator.next() instanceof FixedNode) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
     /**
      * Sorts the nodes within a block by adding the nodes to a list in a post-order iteration over
      * all inputs. This means that a node is added to the list after all its inputs have been