# HG changeset patch # User Lukas Stadler # Date 1418910502 -3600 # Node ID d1826470d1ecd9310fc2c47234d5c5e622ce579e # Parent ba61e58aafbc41049ff1b878c24ae7a972397515 continuously update method queue in PartialEvaluator.expandTree diff -r ba61e58aafbc -r d1826470d1ec graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java --- 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;