changeset 18678:e04d70a4d3ae

prefer profile methods during partial evaluation
author Lukas Stadler <lukas.stadler@oracle.com>
date Mon, 15 Dec 2014 14:54:59 +0100
parents 8d8523ed37e3
children b7d28233da5d
files graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SwitchNode.java graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java
diffstat 2 files changed, 20 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SwitchNode.java	Sat Dec 13 03:23:40 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SwitchNode.java	Mon Dec 15 14:54:59 2014 +0100
@@ -156,6 +156,6 @@
         if (defaultSuccessorIndex() == -1) {
             throw new GraalInternalError("unexpected");
         }
-        return defaultSuccessorIndex() == -1 ? null : successors.get(defaultSuccessorIndex());
+        return successors.get(defaultSuccessorIndex());
     }
 }
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java	Sat Dec 13 03:23:40 2014 +0100
+++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java	Mon Dec 15 14:54:59 2014 +0100
@@ -224,10 +224,29 @@
         PhaseContext phaseContext = new PhaseContext(providers, assumptions);
         boolean changed = false;
         boolean changedInIteration;
+        ArrayDeque<MethodCallTargetNode> queue = new ArrayDeque<>();
+        MetaAccessProvider metaAccess = providers.getMetaAccess();
+        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);
+                    }
+                }
+            }
+
+            while (!queue.isEmpty()) {
+                MethodCallTargetNode methodCallTargetNode = queue.removeFirst();
+                if (!methodCallTargetNode.isAlive()) {
+                    continue;
+                }
+                InvokeKind kind = methodCallTargetNode.invokeKind();
                 try (Indent id1 = Debug.logAndIndent("try inlining %s, kind = %s", methodCallTargetNode.targetMethod(), kind)) {
                     if (kind == InvokeKind.Static || kind == InvokeKind.Special) {
                         if ((TraceTruffleCompilationHistogram.getValue() || TraceTruffleCompilationDetails.getValue()) && kind == InvokeKind.Special && methodCallTargetNode.receiver().isConstant()) {