# HG changeset patch # User Christian Humer # Date 1426013096 -3600 # Node ID 39315508f1b6d6e4b05d6e98205ec6f31b7d50c7 # Parent f682b9e6ca07c30969ea2f2f5e02139272b933fa Truffle: cache trivial node counts per call target. diff -r f682b9e6ca07 -r 39315508f1b6 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/DefaultTruffleSplittingStrategy.java --- 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; } diff -r f682b9e6ca07 -r 39315508f1b6 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/DefaultTruffleSplittingStrategyNew.java --- 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; } diff -r f682b9e6ca07 -r 39315508f1b6 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/OptimizedCallTarget.java --- 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 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; + } + + } + } diff -r f682b9e6ca07 -r 39315508f1b6 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleInlining.java --- 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 createDecisions(OptimizedCallTarget sourceTarget, TruffleInliningPolicy policy, CompilerOptions options) { - int nodeCount = sourceTarget.countNonTrivialNodes(false); + int nodeCount = sourceTarget.countNonTrivialNodes(); List exploredCallSites = exploreCallSites(new ArrayList<>(Arrays.asList(sourceTarget)), nodeCount, policy); return decideInlining(exploredCallSites, policy, nodeCount, options); } @@ -66,7 +66,7 @@ List 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; diff -r f682b9e6ca07 -r 39315508f1b6 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/debug/AbstractDebugCompilationListener.java --- 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 properties) { - int nodeCount = target.countNonTrivialNodes(false); + int nodeCount = target.countNonTrivialNodes(); int deepNodeCount = nodeCount; TruffleInlining inlining = target.getInlining(); if (inlining != null) {