# HG changeset patch # User Lukas Stadler # Date 1418651699 -3600 # Node ID e04d70a4d3aed3e09ee36443dce1e2afb1c19e83 # Parent 8d8523ed37e361e2e3e07496911376ab17b69dc6 prefer profile methods during partial evaluation diff -r 8d8523ed37e3 -r e04d70a4d3ae graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SwitchNode.java --- 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()); } } diff -r 8d8523ed37e3 -r e04d70a4d3ae 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 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 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()) {