diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/APerm.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/APerm.java
index c8bdd10f11b20611384f9ebe538b69db8e76fa49..ce7773cd0e722bf1364625862abc50595b80845f 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/APerm.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/APerm.java
@@ -162,7 +162,11 @@ public abstract class APerm extends RBuiltinNode.Arg3 {
         RList dimNames = getDimNamesNode.getDimNames(vector);
         if (setDimNamesProfile.profile(dimNames != null)) {
             if (setDimNames == null) {
+                CompilerDirectives.transferToInterpreterAndInvalidate();
                 setDimNames = insert(SetDimNamesAttributeNode.create());
+            }
+            if (extractListElement == null) {
+                CompilerDirectives.transferToInterpreterAndInvalidate();
                 extractListElement = insert(ExtractListElement.create());
             }
             Object[] permData = new Object[dimNames.getLength()];
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Eval.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Eval.java
index 906f67906eb3c1dad6bc7903825c1530c41e04e9..12c2f8e4103696ec9f8fdae8fc157655946cae49 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Eval.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Eval.java
@@ -33,6 +33,7 @@ import static com.oracle.truffle.r.runtime.RVisibility.CUSTOM;
 import static com.oracle.truffle.r.runtime.builtins.RBehavior.COMPLEX;
 import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.INTERNAL;
 
+import com.oracle.truffle.api.CompilerDirectives;
 import com.oracle.truffle.api.dsl.Cached;
 import com.oracle.truffle.api.dsl.Fallback;
 import com.oracle.truffle.api.dsl.Specialization;
@@ -142,6 +143,7 @@ public abstract class Eval extends RBuiltinNode.Arg3 {
 
         private void lazyCreateRList2EnvNode() {
             if (rList2EnvNode == null) {
+                CompilerDirectives.transferToInterpreterAndInvalidate();
                 rList2EnvNode = insert(RList2EnvNode.create());
             }
         }
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateComment.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateComment.java
index 1b796cf7b55f7c28d236089a3212dd6e2520b748..96098abefc211bb351b1eee2b3e7003c64030fde 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateComment.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateComment.java
@@ -26,6 +26,7 @@ import static com.oracle.truffle.r.runtime.RDispatch.INTERNAL_GENERIC;
 import static com.oracle.truffle.r.runtime.builtins.RBehavior.PURE;
 import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.INTERNAL;
 
+import com.oracle.truffle.api.CompilerDirectives;
 import com.oracle.truffle.api.dsl.Cached;
 import com.oracle.truffle.api.dsl.Specialization;
 import com.oracle.truffle.r.nodes.attributes.RemoveFixedAttributeNode;
@@ -60,6 +61,7 @@ public abstract class UpdateComment extends RBuiltinNode.Arg2 {
     @Specialization
     protected Object dim(RAbstractContainer container, RAbstractStringVector value) {
         if (setCommentAttrNode == null) {
+            CompilerDirectives.transferToInterpreterAndInvalidate();
             setCommentAttrNode = insert(createGetCommentAttrNode());
         }
         setCommentAttrNode.execute(container, value);
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/infix/Tilde.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/infix/Tilde.java
index e9df0bec503f95337e99373fc28bbea6d17039bf..e5366c429bcfca8aaab5c7cfd18b306064f37039 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/infix/Tilde.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/infix/Tilde.java
@@ -26,6 +26,7 @@ import static com.oracle.truffle.r.runtime.builtins.RBehavior.READS_FRAME;
 import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.PRIMITIVE;
 
 import com.oracle.truffle.api.CompilerAsserts;
+import com.oracle.truffle.api.CompilerDirectives;
 import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
 import com.oracle.truffle.api.dsl.Specialization;
 import com.oracle.truffle.api.frame.VirtualFrame;
@@ -77,6 +78,7 @@ public abstract class Tilde extends RBuiltinNode.Arg2 {
     protected RLanguage tilde(VirtualFrame frame, Object x, Object y) {
 
         if (setEnvAttrNode == null) {
+            CompilerDirectives.transferToInterpreterAndInvalidate();
             setEnvAttrNode = insert(createSetEnvAttrNode());
         }
 
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/FastRInterop.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/FastRInterop.java
index d7273682607ed2bd9e1daa9848bd489095bbed36..8148f31c79e9e386b732c148a50504d1332c1f8a 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/FastRInterop.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/FastRInterop.java
@@ -923,6 +923,7 @@ public class FastRInterop {
                         @Cached("createInvoke(args.getLength())") Node invokeNode) {
 
             if (getDataNode == null) {
+                CompilerDirectives.transferToInterpreterAndInvalidate();
                 getDataNode = insert(GetReadonlyData.ListData.create());
             }
 
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/helpers/BrowserInteractNode.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/helpers/BrowserInteractNode.java
index c5507805b9b2e72728bcb283e51625a1aae0a0d3..78e1c31a97edf0892f3a4415b17439f28a1e4cd7 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/helpers/BrowserInteractNode.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/helpers/BrowserInteractNode.java
@@ -131,6 +131,9 @@ public abstract class BrowserInteractNode extends Node {
                         break LW;
                     case "Q":
                         throw new JumpToTopLevelException();
+                    case "help":
+                        printHelp(ch);
+                        break;
                     case "where": {
                         if (currentCaller.getDepth() > 1) {
                             Object stack = Utils.createTraceback(0);
@@ -205,4 +208,15 @@ public abstract class BrowserInteractNode extends Node {
     private static String browserPrompt(int depth) {
         return "Browse[" + depth + "]> ";
     }
+
+    private static void printHelp(ConsoleIO out) {
+        out.println("n          next");
+        out.println("s          step into");
+        out.println("f          finish");
+        out.println("c or cont  continue");
+        out.println("Q          quit");
+        out.println("where      show stack");
+        out.println("help       show help");
+        out.println("<expr>     evaluate expression");
+    }
 }
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/helpers/DebugHandling.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/helpers/DebugHandling.java
index be71516f860f6787c10996a09aee8ef3cf117999..dee1f1b1ac133e00e3c25bba623712bdaedae82d 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/helpers/DebugHandling.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/helpers/DebugHandling.java
@@ -46,6 +46,7 @@ import com.oracle.truffle.r.nodes.control.AbstractLoopNode;
 import com.oracle.truffle.r.nodes.function.FunctionDefinitionNode;
 import com.oracle.truffle.r.nodes.instrumentation.RInstrumentation;
 import com.oracle.truffle.r.nodes.instrumentation.RSyntaxTags;
+import com.oracle.truffle.r.nodes.instrumentation.RSyntaxTags.LoopTag;
 import com.oracle.truffle.r.runtime.JumpToTopLevelException;
 import com.oracle.truffle.r.runtime.RArguments;
 import com.oracle.truffle.r.runtime.RDeparse;
@@ -515,7 +516,7 @@ public class DebugHandling {
         void setFinishing(AbstractLoopNode loopNode) {
             // Disable every statement listener except that for loopNode
             for (LoopStatementEventListener lser : loopStatementListeners) {
-                if (lser.getLoopNode() == loopNode) {
+                if (lser.handlesLoop(loopNode)) {
                     lser.setFinishing();
                 } else {
                     lser.disable();
@@ -708,24 +709,24 @@ public class DebugHandling {
          * The wrapper for the loop node is stable whereas the loop node itself will be replaced
          * with a specialized node.
          */
-        private final RSyntaxNode loopNode;
+        private final SourceSection loopSourceSection;
         private final FunctionStatementsEventListener fser;
 
         LoopStatementEventListener(FunctionDefinitionNode functionDefinitionNode, Object text, Object condition, RSyntaxNode loopNode, FunctionStatementsEventListener fser) {
             super(functionDefinitionNode, text, condition);
-            this.loopNode = loopNode;
+            this.loopSourceSection = loopNode.getSourceSection();
             this.fser = fser;
         }
 
         @Override
         public void onEnter(EventContext context, VirtualFrame frame) {
-            if (!disabled() && context.getInstrumentedNode() == loopNode) {
+            if (isEnabled(context)) {
                 super.onEnter(context, frame);
             }
         }
 
-        RSyntaxNode getLoopNode() {
-            return loopNode;
+        boolean handlesLoop(RSyntaxNode loop) {
+            return loopSourceSection != null && loopSourceSection.equals(loop.getSourceSection());
         }
 
         void setFinishing() {
@@ -734,7 +735,7 @@ public class DebugHandling {
 
         @Override
         public void onReturnExceptional(EventContext context, VirtualFrame frame, Throwable exception) {
-            if (!disabled() && context.getInstrumentedNode() == loopNode) {
+            if (isEnabled(context)) {
                 CompilerDirectives.transferToInterpreter();
                 returnCleanup();
             }
@@ -742,12 +743,16 @@ public class DebugHandling {
 
         @Override
         public void onReturnValue(EventContext context, VirtualFrame frame, Object result) {
-            if (!disabled() && context.getInstrumentedNode() == loopNode) {
+            if (isEnabled(context)) {
                 CompilerDirectives.transferToInterpreter();
                 returnCleanup();
             }
         }
 
+        private boolean isEnabled(EventContext ctx) {
+            return !disabled() && loopSourceSection != null && loopSourceSection.equals(ctx.getInstrumentedNode().getSourceSection());
+        }
+
         private void returnCleanup() {
             if (finishing) {
                 finishing = false;
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/attributes/SpecialAttributesFunctions.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/attributes/SpecialAttributesFunctions.java
index bec22d65269c1232586d6a49194c628a18d0ba53..9065b89e74f397e6f32b6da70e6924e22a20495a 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/attributes/SpecialAttributesFunctions.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/attributes/SpecialAttributesFunctions.java
@@ -664,7 +664,7 @@ public final class SpecialAttributesFunctions {
 
         public final boolean isSquareMatrix(RAbstractVector vector) {
             RIntVector dims = (RIntVector) execute(vector);
-            if (nullDimsProfile.profile(dims == null) || dims.getLength() < 2) {
+            if (nullDimsProfile.profile(dims == null) || dims.getLength() != 2) {
                 return false;
             }
             return dims.getDataAt(0) == dims.getDataAt(1);
@@ -926,8 +926,15 @@ public final class SpecialAttributesFunctions {
 
         public void initAttributes(RAbstractContainer x, RAbstractContainer source) {
             if (getDimNode == null) {
+                CompilerDirectives.transferToInterpreterAndInvalidate();
                 getDimNode = insert(GetDimAttributeNode.create());
+            }
+            if (getNamesNode == null) {
+                CompilerDirectives.transferToInterpreterAndInvalidate();
                 getNamesNode = insert(GetNamesAttributeNode.create());
+            }
+            if (getDimNamesNode == null) {
+                CompilerDirectives.transferToInterpreterAndInvalidate();
                 getDimNamesNode = insert(GetDimNamesAttributeNode.create());
             }
             this.initAttributes(x, getDimNode.getDimensions(source), getNamesNode.getNames(source), getDimNamesNode.getDimNames(source));
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/RCallNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/RCallNode.java
index 19b503bd6b756266d92e884834bccd76bbdbe6fb..523058ffd6b058f24a4720446968dcfb7b271776 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/RCallNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/RCallNode.java
@@ -31,6 +31,7 @@ import com.oracle.truffle.api.CompilerDirectives;
 import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
 import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
 import com.oracle.truffle.api.RootCallTarget;
+import com.oracle.truffle.api.Truffle;
 import com.oracle.truffle.api.dsl.Cached;
 import com.oracle.truffle.api.dsl.Fallback;
 import com.oracle.truffle.api.dsl.NodeChild;
@@ -62,6 +63,8 @@ import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
 import com.oracle.truffle.r.nodes.builtin.RBuiltinRootNode;
 import com.oracle.truffle.r.nodes.function.PromiseHelperNode.PromiseCheckHelperNode;
 import com.oracle.truffle.r.nodes.function.RCallNodeGen.FunctionDispatchNodeGen;
+import com.oracle.truffle.r.nodes.function.RCallNodeGen.SendForeignExecuteMessageNodeGen;
+import com.oracle.truffle.r.nodes.function.RCallNodeGen.SendForeignInvokeMessageNodeGen;
 import com.oracle.truffle.r.nodes.function.S3FunctionLookupNode.Result;
 import com.oracle.truffle.r.nodes.function.call.CallRFunctionNode;
 import com.oracle.truffle.r.nodes.function.call.PrepareArguments;
@@ -555,12 +558,8 @@ public abstract class RCallNode extends RCallBaseNode implements RSyntaxNode, RS
     }
 
     protected abstract static class ForeignCall extends LeafCallNode {
-
-        @Child protected CallArgumentsNode arguments;
-        @Child protected Node messageNode;
-        @Child protected Foreign2R foreign2RNode;
-        @Child protected R2Foreign r2ForeignNode;
-        @CompilationFinal protected int foreignCallArgCount;
+        @Child private CallArgumentsNode arguments;
+        @Child private Foreign2R foreign2RNode;
 
         protected ForeignCall(RCallNode originalCall, CallArgumentsNode arguments) {
             super(originalCall);
@@ -568,75 +567,121 @@ public abstract class RCallNode extends RCallBaseNode implements RSyntaxNode, RS
         }
 
         protected Object[] evaluateArgs(VirtualFrame frame) {
-            Object[] argumentsArray = originalCall.explicitArgs != null ? ((RArgsValuesAndNames) originalCall.explicitArgs.execute(frame)).getArguments()
+            return originalCall.explicitArgs != null ? ((RArgsValuesAndNames) originalCall.explicitArgs.execute(frame)).getArguments()
                             : arguments.evaluateFlattenObjects(frame, originalCall.lookupVarArgs(frame));
-            if (r2ForeignNode == null) {
-                r2ForeignNode = insert(R2Foreign.create());
-            }
-            for (int i = 0; i < argumentsArray.length; i++) {
-                argumentsArray[i] = r2ForeignNode.execute(argumentsArray[i]);
+        }
+
+        protected Foreign2R getForeign2RNode() {
+            if (foreign2RNode == null) {
+                CompilerDirectives.transferToInterpreterAndInvalidate();
+                foreign2RNode = insert(Foreign2R.create());
             }
-            return argumentsArray;
+            return foreign2RNode;
         }
     }
 
-    /**
-     * Calls a foreign function using message EXECUTE.
-     */
     protected static final class ForeignExecute extends ForeignCall {
+        @Child private SendForeignExecuteMessage sendExecuteMessage = SendForeignExecuteMessageNodeGen.create();
 
         protected ForeignExecute(RCallNode originalCall, CallArgumentsNode arguments) {
             super(originalCall, arguments);
         }
 
-        protected Object execute(VirtualFrame frame, TruffleObject function) {
-            Object[] argumentsArray = evaluateArgs(frame);
-            if (messageNode == null || foreignCallArgCount != argumentsArray.length) {
+        public Object execute(VirtualFrame frame, TruffleObject function) {
+            return getForeign2RNode().execute(sendExecuteMessage.execute(function, evaluateArgs(frame)));
+        }
+    }
+
+    protected static final class ForeignInvoke extends ForeignCall {
+        @Child private SendForeignInvokeMessage sendInvokeMessage = SendForeignInvokeMessageNodeGen.create();
+
+        protected ForeignInvoke(RCallNode originalCall, CallArgumentsNode arguments) {
+            super(originalCall, arguments);
+        }
+
+        public Object execute(VirtualFrame frame, DeferredFunctionValue function) {
+            return getForeign2RNode().execute(sendInvokeMessage.execute(function, evaluateArgs(frame)));
+        }
+    }
+
+    protected abstract static class SendForeignMessageBase extends Node {
+        @Child private R2Foreign r2ForeignNode;
+
+        @ExplodeLoop
+        protected Object[] args2Foreign(Object[] args) {
+            if (r2ForeignNode == null) {
                 CompilerDirectives.transferToInterpreterAndInvalidate();
-                messageNode = insert(Message.createExecute(argumentsArray.length).createNode());
-                foreignCallArgCount = argumentsArray.length;
-                foreign2RNode = insert(Foreign2R.create());
+                r2ForeignNode = insert(R2Foreign.create());
             }
+            for (int i = 0; i < args.length; i++) {
+                args[i] = r2ForeignNode.execute(args[i]);
+            }
+            return args;
+        }
+    }
 
+    /**
+     * Calls a foreign function using message EXECUTE.
+     */
+    protected abstract static class SendForeignExecuteMessage extends SendForeignMessageBase {
+
+        public abstract Object execute(TruffleObject function, Object[] args);
+
+        protected static Node createMessageNode(int argsLen) {
+            return Message.createExecute(argsLen).createNode();
+        }
+
+        @Specialization(guards = "argumentsArray.length == foreignCallArgCount", limit = "8")
+        protected Object doCached(TruffleObject function, Object[] argumentsArray,
+                        @Cached("createMessageNode(argumentsArray.length)") Node messageNode,
+                        @Cached("argumentsArray.length") @SuppressWarnings("unused") int foreignCallArgCount) {
             try {
-                Object result = ForeignAccess.sendExecute(messageNode, function, argumentsArray);
-                return foreign2RNode.execute(result);
+                return ForeignAccess.sendExecute(messageNode, function, args2Foreign(argumentsArray));
             } catch (ArityException | UnsupportedMessageException | UnsupportedTypeException e) {
                 CompilerDirectives.transferToInterpreter();
                 RInternalError.reportError(e);
                 throw RError.interopError(RError.findParentRBase(this), e, function);
             }
         }
+
+        @Specialization(replaces = "doCached")
+        @TruffleBoundary
+        protected Object doGeneric(TruffleObject function, Object[] argumentsArray) {
+            return doCached(function, argumentsArray, createMessageNode(argumentsArray.length), argumentsArray.length);
+        }
     }
 
     /**
      * Calls a foreign function using message INVOKE.
      */
-    protected static final class ForeignInvoke extends ForeignCall {
+    protected abstract static class SendForeignInvokeMessage extends SendForeignMessageBase {
 
-        protected ForeignInvoke(RCallNode originalCall, CallArgumentsNode arguments) {
-            super(originalCall, arguments);
+        public abstract Object execute(DeferredFunctionValue function, Object[] args);
+
+        protected static Node createMessageNode(int argsLen) {
+            return Message.createInvoke(argsLen).createNode();
         }
 
-        protected Object execute(VirtualFrame frame, DeferredFunctionValue lhs) {
+        @Specialization(guards = "argumentsArray.length == foreignCallArgCount", limit = "8")
+        protected Object doCached(DeferredFunctionValue lhs, Object[] argumentsArray,
+                        @Cached("createMessageNode(argumentsArray.length)") Node messageNode,
+                        @Cached("argumentsArray.length") @SuppressWarnings("unused") int foreignCallArgCount) {
             TruffleObject receiver = lhs.getLHSReceiver();
             String member = lhs.getLHSMember();
-            Object[] argumentsArray = evaluateArgs(frame);
-            if (messageNode == null || foreignCallArgCount != argumentsArray.length) {
-                messageNode = insert(Message.createInvoke(argumentsArray.length).createNode());
-                foreignCallArgCount = argumentsArray.length;
-                foreign2RNode = insert(Foreign2R.create());
-            }
-
             try {
-                Object result = ForeignAccess.sendInvoke(messageNode, receiver, member, argumentsArray);
-                return foreign2RNode.execute(result);
+                return ForeignAccess.sendInvoke(messageNode, receiver, member, args2Foreign(argumentsArray));
             } catch (ArityException | UnsupportedMessageException | UnsupportedTypeException | UnknownIdentifierException e) {
                 CompilerDirectives.transferToInterpreter();
                 RInternalError.reportError(e);
                 throw RError.interopError(RError.findParentRBase(this), e, receiver);
             }
         }
+
+        @Specialization(replaces = "doCached")
+        @TruffleBoundary
+        protected Object doGeneric(DeferredFunctionValue lhs, Object[] argumentsArray) {
+            return doCached(lhs, argumentsArray, createMessageNode(argumentsArray.length), argumentsArray.length);
+        }
     }
 
     protected ForeignExecute createForeignCall() {
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/RCallSpecialNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/RCallSpecialNode.java
index 98a793a0147a1f032e48fafd264fc5299d5874e0..1fb0b4db04f3c0d4883439cf8239325a0f7f1a43 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/RCallSpecialNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/RCallSpecialNode.java
@@ -22,6 +22,7 @@
  */
 package com.oracle.truffle.r.nodes.function;
 
+import com.oracle.truffle.api.CompilerAsserts;
 import com.oracle.truffle.api.CompilerDirectives;
 import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
 import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
@@ -319,6 +320,7 @@ public final class RCallSpecialNode extends RCallBaseNode implements RSyntaxNode
     @Override
     public Node deepCopy() {
         assert !inReplace && callSpecialParent == null && ignoredArguments.length == 0;
+        CompilerAsserts.neverPartOfCompilation();
         RCallSpecialNode node = (RCallSpecialNode) RContext.getASTBuilder().process(this).asRNode();
         node.functionNode = node.insert(node.functionNode);
         node.special = node.insert(node.special);
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/signature/MissingNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/signature/MissingNode.java
index 98aff46476a515d2deaa16bbf3bb93892e17639f..d3dca941dc26c6011f9429e249080cb95be636b5 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/signature/MissingNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/signature/MissingNode.java
@@ -212,8 +212,10 @@ public final class MissingNode extends OperatorNode {
                 throw error(Message.INVALID_USE, "missing");
             }
             if (ArgumentsSignature.VARARG_NAME.equals(identifier)) {
+                CompilerDirectives.transferToInterpreterAndInvalidate();
                 readVarArgs = insert(LocalReadVariableNode.create(ArgumentsSignature.VARARG_NAME, false));
             } else {
+                CompilerDirectives.transferToInterpreterAndInvalidate();
                 level = insert(new MissingCheckLevel(identifier, 0));
             }
         }
diff --git a/mx.fastr/suite.py b/mx.fastr/suite.py
index 75301404a2b7ecf7fa910c6160472f49a0425b15..1300d03106e023e3d43c21d76a5e32a5b1000631 100644
--- a/mx.fastr/suite.py
+++ b/mx.fastr/suite.py
@@ -7,7 +7,7 @@ suite = {
             {
                "name" : "truffle",
                "subdir" : True,
-               "version" : "e140680ae7ebc4329e5cd96889258a75b6987dfe",
+               "version" : "b1c4af13e75d2dc839b5050ba020356ec1602788",
                "urls" : [
                     {"url" : "https://github.com/graalvm/graal", "kind" : "git"},
                     {"url" : "https://curio.ssw.jku.at/nexus/content/repositories/snapshots", "kind" : "binary"},