Mercurial > hg > graal-compiler
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()) {