diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/AccessArgumentNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/AccessArgumentNode.java
index 1a429c573ebff80811f76d01390c7ddaec2dd03e..6abe44bf87025ba374fdee50f41b3416ea4e6f31 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/AccessArgumentNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/AccessArgumentNode.java
@@ -162,10 +162,11 @@ public final class AccessArgumentNode extends RNode {
 
     private boolean checkInsertOptDefaultArg() {
         if (optDefaultArgNode == null) {
+            CompilerDirectives.transferToInterpreterAndInvalidate();
+
             RNode defaultArg = formals.getDefaultArgument(index);
             RNode arg = (RNode) RASTUtils.unwrap(defaultArg);
 
-            CompilerDirectives.transferToInterpreterAndInvalidate();
             // TODO: all tests pass without it but perhaps we should "re-wrap" promises here?
             if (isOptimizableDefault(arg)) {
                 optDefaultArgNode = new OptVariableDefaultPromiseNode(factory, (ReadVariableNode) RASTUtils.cloneNode(arg), ArgumentStatePush.INVALID_INDEX);
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 06593f0cd3b723173cda71c2377d482b23d90489..1e125cf6708eea51419ec0629fbffc4e4095c368 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
@@ -794,15 +794,19 @@ public abstract class RCallNode extends RNode implements RSyntaxNode, RSyntaxCal
             }
         }
 
-        protected PrepareArguments createArguments(RFunction function) {
+        protected PrepareArguments createArguments(RFunction function, boolean noOpt) {
             if (explicitArgs) {
                 return PrepareArguments.createExplicit(function);
             } else {
                 CallArgumentsNode args = originalCall.createArguments(dispatchTempIdentifiers, !function.isBuiltin(), true);
-                return PrepareArguments.create(function, args);
+                return PrepareArguments.create(function, args, noOpt);
             }
         }
 
+        protected PrepareArguments createArguments(RFunction function) {
+            return createArguments(function, false);
+        }
+
         @Specialization(limit = "CACHE_SIZE", guards = "function == cachedFunction")
         protected Object dispatch(VirtualFrame frame, @SuppressWarnings("unused") RFunction function, Object varArgs, Object s3Args, //
                         @Cached("function") RFunction cachedFunction, //
@@ -826,7 +830,7 @@ public abstract class RCallNode extends RNode implements RSyntaxNode, RSyntaxCal
             public Object execute(MaterializedFrame materializedFrame, RFunction function, Object varArgs, Object s3Args) {
                 if (cachedFunction != function) {
                     leafCall = insert(createCacheNode(function));
-                    prepareArguments = insert(createArguments(function));
+                    prepareArguments = insert(createArguments(function, true));
                 }
                 VirtualFrame frame = SubstituteVirtualFrame.create(materializedFrame);
                 Object[] orderedArguments = prepareArguments.execute(frame, (RArgsValuesAndNames) varArgs, originalCall);
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/call/PrepareArguments.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/call/PrepareArguments.java
index 2630a51f78a5d5e4a28cf2878fe0a7cdaaa1872c..d7bd5e7ee3c82cb6e62f2602a9b1e265b690dc1c 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/call/PrepareArguments.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/call/PrepareArguments.java
@@ -50,8 +50,8 @@ public abstract class PrepareArguments extends Node {
 
     public abstract Object[] execute(VirtualFrame frame, RArgsValuesAndNames varArgs, RCallNode call);
 
-    public static PrepareArguments create(RFunction function, CallArgumentsNode args) {
-        return new UninitializedPrepareArguments(function, args);
+    public static PrepareArguments create(RFunction function, CallArgumentsNode args, boolean noOpt) {
+        return new UninitializedPrepareArguments(function, args, noOpt);
     }
 
     public static PrepareArguments createExplicit(RFunction function) {
@@ -62,11 +62,13 @@ public abstract class PrepareArguments extends Node {
 
         private final RFunction function;
         private final CallArgumentsNode sourceArguments; // not used as a node
+        private final boolean noOpt;
         private int depth = CACHE_SIZE;
 
-        UninitializedPrepareArguments(RFunction function, CallArgumentsNode sourceArguments) {
+        UninitializedPrepareArguments(RFunction function, CallArgumentsNode sourceArguments, boolean noOpt) {
             this.function = function;
             this.sourceArguments = sourceArguments;
+            this.noOpt = noOpt;
         }
 
         @Override
@@ -74,7 +76,7 @@ public abstract class PrepareArguments extends Node {
             CompilerDirectives.transferToInterpreterAndInvalidate();
             PrepareArguments next;
             if (depth-- > 0) {
-                next = new CachedPrepareArguments(this, function, call, sourceArguments, varArgs == null ? null : varArgs.getSignature());
+                next = new CachedPrepareArguments(this, function, call, sourceArguments, varArgs == null ? null : varArgs.getSignature(), noOpt);
             } else {
                 next = new GenericPrepareArguments(function, sourceArguments);
             }
@@ -88,10 +90,10 @@ public abstract class PrepareArguments extends Node {
         @Children private final RNode[] matchedArguments;
         private final ArgumentsSignature cachedVarArgSignature;
 
-        CachedPrepareArguments(PrepareArguments next, RFunction function, RCallNode call, CallArgumentsNode args, ArgumentsSignature varArgSignature) {
+        CachedPrepareArguments(PrepareArguments next, RFunction function, RCallNode call, CallArgumentsNode args, ArgumentsSignature varArgSignature, boolean noOpt) {
             this.next = next;
             cachedVarArgSignature = varArgSignature;
-            matchedArguments = ArgumentMatcher.matchArguments(function, args.unrollArguments(varArgSignature), call, false);
+            matchedArguments = ArgumentMatcher.matchArguments(function, args.unrollArguments(varArgSignature), call, noOpt);
         }
 
         @Override