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