changeset 18716:d1826470d1ec

continuously update method queue in PartialEvaluator.expandTree
author Lukas Stadler <lukas.stadler@oracle.com>
date Thu, 18 Dec 2014 14:48:22 +0100
parents ba61e58aafbc
children 305e6a73117d
files graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java
diffstat 1 files changed, 18 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java	Thu Dec 18 01:32:15 2014 -0800
+++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java	Thu Dec 18 14:48:22 2014 +0100
@@ -35,6 +35,7 @@
 import com.oracle.graal.debug.Debug.Scope;
 import com.oracle.graal.debug.internal.*;
 import com.oracle.graal.graph.*;
+import com.oracle.graal.graph.Graph.Mark;
 import com.oracle.graal.graph.Node;
 import com.oracle.graal.loop.*;
 import com.oracle.graal.nodes.CallTargetNode.InvokeKind;
@@ -229,19 +230,26 @@
         ResolvedJavaType profileClass = metaAccess.lookupJavaType(NodeCloneable.class);
         do {
             changedInIteration = false;
-            for (MethodCallTargetNode methodCallTargetNode : graph.getNodes(MethodCallTargetNode.class)) {
-                InvokeKind kind = methodCallTargetNode.invokeKind();
-                if (kind == InvokeKind.Static || kind == InvokeKind.Special) {
-                    ValueNode receiver = methodCallTargetNode.receiver();
-                    if (receiver != null && receiver.isConstant() && profileClass.isAssignableFrom(receiver.stamp().javaType(metaAccess))) {
-                        queue.addFirst(methodCallTargetNode);
-                    } else {
-                        queue.addLast(methodCallTargetNode);
+
+            Mark mark = null;
+            while (true) {
+
+                for (MethodCallTargetNode methodCallTargetNode : graph.getNewNodes(mark).filter(MethodCallTargetNode.class)) {
+                    InvokeKind kind = methodCallTargetNode.invokeKind();
+                    if (kind == InvokeKind.Static || kind == InvokeKind.Special) {
+                        ValueNode receiver = methodCallTargetNode.receiver();
+                        if (receiver != null && receiver.isConstant() && profileClass.isAssignableFrom(receiver.stamp().javaType(metaAccess))) {
+                            queue.addFirst(methodCallTargetNode);
+                        } else {
+                            queue.addLast(methodCallTargetNode);
+                        }
                     }
                 }
-            }
+                mark = graph.getMark();
 
-            while (!queue.isEmpty()) {
+                if (queue.isEmpty()) {
+                    break;
+                }
                 MethodCallTargetNode methodCallTargetNode = queue.removeFirst();
                 if (!methodCallTargetNode.isAlive()) {
                     continue;