Mercurial > hg > truffle
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;