From ba612b71fb3132cd28649eb1a306bc14ab3759cb Mon Sep 17 00:00:00 2001
From: Adam Welc <adam.welc@oracle.com>
Date: Fri, 13 Jun 2014 16:09:27 +0200
Subject: [PATCH] Replaced RCallNode with DirectCallNode which removed the need
 for interpreting the recursive calls.

---
 .../truffle/r/nodes/builtin/base/Recall.java      | 15 +++++++--------
 1 file changed, 7 insertions(+), 8 deletions(-)

diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/base/Recall.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/base/Recall.java
index c42cfb1d2a..b209728e6f 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/base/Recall.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/base/Recall.java
@@ -26,6 +26,7 @@ import static com.oracle.truffle.r.nodes.builtin.RBuiltinKind.*;
 
 import com.oracle.truffle.api.*;
 import com.oracle.truffle.api.frame.*;
+import com.oracle.truffle.api.nodes.*;
 import com.oracle.truffle.r.nodes.*;
 import com.oracle.truffle.r.nodes.builtin.*;
 import com.oracle.truffle.r.nodes.builtin.RBuiltin.*;
@@ -44,7 +45,8 @@ public class Recall extends RCustomBuiltinNode {
         return PARAMETER_NAMES;
     }
 
-    @Child private RCallNode callNode;
+    @Child protected CallArgumentsNode args;
+    @Child private DirectCallNode callNode;
 
     public Recall(RBuiltinNode prev) {
         super(prev);
@@ -53,11 +55,6 @@ public class Recall extends RCustomBuiltinNode {
     @Override
     public Object execute(VirtualFrame frame) {
         controlVisibility();
-        // Recall is now only used in a massively recursive benchmark (b25.prog-3) and cannot be
-        // compiled (Truffle eventually barfs trying to inline that many calls). Possibilities for
-        // making this problem less severe is to perhaps inline only to a certain call depth and
-        // then go back to interpretation.
-        CompilerDirectives.transferToInterpreterAndInvalidate();
         RFunction function = RArguments.getFunction(frame);
         if (function == null) {
             CompilerDirectives.transferToInterpreter();
@@ -65,10 +62,12 @@ public class Recall extends RCustomBuiltinNode {
         }
         if (callNode == null) {
             CompilerDirectives.transferToInterpreterAndInvalidate();
-            callNode = insert(RCallNode.createCall(null, CallArgumentsNode.createUnnamed(createArgs(arguments[0]))));
+            callNode = Truffle.getRuntime().createDirectCallNode(function.getTarget());
+            args = CallArgumentsNode.createUnnamed(createArgs(arguments[0]));
             arguments[0] = null;
         }
-        return callNode.execute(frame, function);
+        Object[] argsObject = RArguments.create(function, args.executeArray(frame));
+        return callNode.call(frame, argsObject);
     }
 
     private static RNode[] createArgs(RNode argNode) {
-- 
GitLab