changeset 10795:6ac4cac7431f

Truffle: detect inlined recursive calls and introduce depth limit
author Andreas Woess <andreas.woess@jku.at>
date Wed, 17 Jul 2013 14:52:24 +0200
parents 3fe325c3f31c
children b84bb0de0092
files graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/OptimizedCallTarget.java graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCompilerOptions.java
diffstat 2 files changed, 25 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/OptimizedCallTarget.java	Wed Jul 17 14:14:52 2013 +0200
+++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/OptimizedCallTarget.java	Wed Jul 17 14:52:24 2013 +0200
@@ -265,7 +265,7 @@
 
             public boolean isWorthInlining(InlinableCallSiteInfo callSite) {
                 return callSite.getInlineNodeCount() <= TruffleInliningMaxCalleeSize.getValue() && callSite.getInlineNodeCount() + callerNodeCount <= TruffleInliningMaxCallerSize.getValue() &&
-                                callSite.getCallCount() > 0;
+                                callSite.getCallCount() > 0 && callSite.getRecursiveDepth() < TruffleInliningMaxRecursiveDepth.getValue();
             }
 
             public double metric(InlinableCallSiteInfo callSite) {
@@ -294,11 +294,33 @@
             private final InlinableCallSite callSite;
             private final int callCount;
             private final int nodeCount;
+            private final int recursiveDepth;
 
             public InlinableCallSiteInfo(InlinableCallSite callSite) {
                 this.callSite = callSite;
                 this.callCount = callSite.getCallCount();
                 this.nodeCount = NodeUtil.countNodes(callSite.getInlineTree());
+                this.recursiveDepth = calculateRecursiveDepth();
+            }
+
+            public int getRecursiveDepth() {
+                return recursiveDepth;
+            }
+
+            private int calculateRecursiveDepth() {
+                int depth = 0;
+                Node parent = ((Node) callSite).getParent();
+                while (!(parent instanceof RootNode)) {
+                    assert parent != null;
+                    if (parent instanceof InlinedCallSite && ((InlinedCallSite) parent).getCallTarget() == callSite.getCallTarget()) {
+                        depth++;
+                    }
+                    parent = parent.getParent();
+                }
+                if (((RootNode) parent).getCallTarget() == callSite.getCallTarget()) {
+                    depth++;
+                }
+                return depth;
             }
 
             public InlinableCallSite getCallSite() {
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCompilerOptions.java	Wed Jul 17 14:14:52 2013 +0200
+++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCompilerOptions.java	Wed Jul 17 14:52:24 2013 +0200
@@ -61,6 +61,8 @@
     public static final OptionValue<Integer> TruffleInliningMaxCallerSize = new OptionValue<>(300);
     @Option(help = "")
     public static final OptionValue<Integer> TruffleInliningMaxCalleeSize = new OptionValue<>(62);
+    @Option(help = "")
+    public static final OptionValue<Integer> TruffleInliningMaxRecursiveDepth = new OptionValue<>(2);
 
     // tracing
     @Option(help = "")