Mercurial > hg > truffle
changeset 19759:39315508f1b6
Truffle: cache trivial node counts per call target.
author | Christian Humer <christian.humer@gmail.com> |
---|---|
date | Tue, 10 Mar 2015 19:44:56 +0100 |
parents | f682b9e6ca07 |
children | b30764a083b7 69b7ad0a3fda |
files | graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/DefaultTruffleSplittingStrategy.java graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/DefaultTruffleSplittingStrategyNew.java graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/OptimizedCallTarget.java graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleInlining.java graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/debug/AbstractDebugCompilationListener.java |
diffstat | 5 files changed, 31 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/DefaultTruffleSplittingStrategy.java Tue Mar 10 19:38:07 2015 +0100 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/DefaultTruffleSplittingStrategy.java Tue Mar 10 19:44:56 2015 +0100 @@ -62,7 +62,7 @@ return false; } OptimizedCallTarget splitTarget = call.getCallTarget(); - int nodeCount = splitTarget.countNonTrivialNodes(false); + int nodeCount = splitTarget.countNonTrivialNodes(); if (nodeCount > TruffleCompilerOptions.TruffleSplittingMaxCalleeSize.getValue()) { return false; }
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/DefaultTruffleSplittingStrategyNew.java Tue Mar 10 19:38:07 2015 +0100 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/DefaultTruffleSplittingStrategyNew.java Tue Mar 10 19:44:56 2015 +0100 @@ -55,7 +55,7 @@ if (TruffleCompilerOptions.TruffleSplittingAggressive.getValue()) { return true; } - int size = call.getCallTarget().countNonTrivialNodes(false); + int size = call.getCallTarget().countNonTrivialNodes(); if (size > TruffleCompilerOptions.TruffleSplittingMaxCalleeSize.getValue()) { return false; }
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/OptimizedCallTarget.java Tue Mar 10 19:38:07 2015 +0100 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/OptimizedCallTarget.java Tue Mar 10 19:44:56 2015 +0100 @@ -71,6 +71,7 @@ private TruffleStamp argumentStamp = DefaultTruffleStamp.getInstance(); private TruffleInlining inlining; + private int cachedNonTrivialNodeCount = -1; /** * When this call target is inlined, the inlining {@link InstalledCode} registers this @@ -298,6 +299,7 @@ if (isValid()) { this.runtime.invalidateInstalledCode(this, source, reason); } + cachedNonTrivialNodeCount = -1; } public TruffleInlining getInlining() { @@ -480,8 +482,17 @@ return StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, 0), false); } - public int countNonTrivialNodes(final boolean inlined) { - return (int) nodeStream(inlined).filter(e -> e != null && !e.getCost().isTrivial()).count(); + public final int countNonTrivialNodes() { + if (cachedNonTrivialNodeCount == -1) { + cachedNonTrivialNodeCount = calculateNonTrivialNodesImpl(); + } + return cachedNonTrivialNodeCount; + } + + private int calculateNonTrivialNodesImpl() { + NonTrivialNodeCountVisitor visitor = new NonTrivialNodeCountVisitor(); + getRootNode().accept(visitor); + return visitor.nodeCount; } public Map<String, Object> getDebugProperties() { @@ -517,4 +528,17 @@ return context.getCompilerOptions(); } + private static final class NonTrivialNodeCountVisitor implements NodeVisitor { + + public int nodeCount; + + public boolean visit(Node node) { + if (!node.getCost().isTrivial()) { + nodeCount++; + } + return true; + } + + } + }
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleInlining.java Tue Mar 10 19:38:07 2015 +0100 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleInlining.java Tue Mar 10 19:44:56 2015 +0100 @@ -43,7 +43,7 @@ } private static List<TruffleInliningDecision> createDecisions(OptimizedCallTarget sourceTarget, TruffleInliningPolicy policy, CompilerOptions options) { - int nodeCount = sourceTarget.countNonTrivialNodes(false); + int nodeCount = sourceTarget.countNonTrivialNodes(); List<TruffleInliningDecision> exploredCallSites = exploreCallSites(new ArrayList<>(Arrays.asList(sourceTarget)), nodeCount, policy); return decideInlining(exploredCallSites, policy, nodeCount, options); } @@ -66,7 +66,7 @@ List<TruffleInliningDecision> childCallSites = Collections.emptyList(); double frequency = calculateFrequency(parentTarget, callNode); - int nodeCount = callNode.getCurrentCallTarget().countNonTrivialNodes(false); + int nodeCount = callNode.getCurrentCallTarget().countNonTrivialNodes(); boolean recursive = isRecursiveStack(callStack); int deepNodeCount = nodeCount;
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/debug/AbstractDebugCompilationListener.java Tue Mar 10 19:38:07 2015 +0100 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/debug/AbstractDebugCompilationListener.java Tue Mar 10 19:44:56 2015 +0100 @@ -101,7 +101,7 @@ } public static void addASTSizeProperty(OptimizedCallTarget target, Map<String, Object> properties) { - int nodeCount = target.countNonTrivialNodes(false); + int nodeCount = target.countNonTrivialNodes(); int deepNodeCount = nodeCount; TruffleInlining inlining = target.getInlining(); if (inlining != null) {