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) {