# HG changeset patch # User Andreas Woess # Date 1374065544 -7200 # Node ID 6ac4cac7431fe2fe5441ae2f9806f8a6a2d27bfd # Parent 3fe325c3f31cbe3cfd5777d2e81225bb21bdb46d Truffle: detect inlined recursive calls and introduce depth limit diff -r 3fe325c3f31c -r 6ac4cac7431f 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 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() { diff -r 3fe325c3f31c -r 6ac4cac7431f graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCompilerOptions.java --- 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 TruffleInliningMaxCallerSize = new OptionValue<>(300); @Option(help = "") public static final OptionValue TruffleInliningMaxCalleeSize = new OptionValue<>(62); + @Option(help = "") + public static final OptionValue TruffleInliningMaxRecursiveDepth = new OptionValue<>(2); // tracing @Option(help = "")