diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/variables/ReadVariableNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/variables/ReadVariableNode.java
index 1c285abc055ca078db13f624a67bfba1b2a70202..ab2b4c006230fb741e1bfb08cffdf2a5eca09059 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/variables/ReadVariableNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/variables/ReadVariableNode.java
@@ -48,7 +48,6 @@ import com.oracle.truffle.api.profiles.ValueProfile;
 import com.oracle.truffle.api.source.SourceSection;
 import com.oracle.truffle.r.nodes.RASTUtils;
 import com.oracle.truffle.r.nodes.function.PromiseHelperNode;
-import com.oracle.truffle.r.runtime.AnonymousFrameVariable;
 import com.oracle.truffle.r.runtime.ArgumentsSignature;
 import com.oracle.truffle.r.runtime.FastROptions;
 import com.oracle.truffle.r.runtime.RArguments;
@@ -173,7 +172,7 @@ public final class ReadVariableNode extends RSourceSectionNode implements RSynta
 
     @Override
     public boolean isSyntax() {
-        return identifier instanceof String && !AnonymousFrameVariable.isAnonymous(identifierAsString);
+        return identifier instanceof String;
     }
 
     @Override
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/ArgumentMatcher.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/ArgumentMatcher.java
index 73dded63d284599fb6fdd1606af7dd5c288d10da..b8344ee25ab1045b6bf7252beb3c11bf68d23007 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/ArgumentMatcher.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/ArgumentMatcher.java
@@ -37,6 +37,7 @@ import com.oracle.truffle.api.nodes.Node;
 import com.oracle.truffle.r.nodes.RRootNode;
 import com.oracle.truffle.r.nodes.access.ConstantNode;
 import com.oracle.truffle.r.nodes.function.PromiseNode.VarArgNode;
+import com.oracle.truffle.r.parser.tools.EvaluatedArgumentsVisitor;
 import com.oracle.truffle.r.runtime.ArgumentsSignature;
 import com.oracle.truffle.r.runtime.RArguments;
 import com.oracle.truffle.r.runtime.RBuiltinKind;
@@ -404,7 +405,7 @@ public class ArgumentMatcher {
             return PromiseNode.createInlined(suppliedArg, formals.getInternalDefaultArgumentAt(formalIndex), builtin == null || builtin.getKind() == RBuiltinKind.PRIMITIVE);
         } else {
             Closure closure = closureCache.getOrCreateClosure(suppliedArg);
-            boolean forcedEager = fastPath != null && fastPath.forcedEagerPromise(formalIndex);
+            boolean forcedEager = fastPath != null && fastPath.forcedEagerPromise(formalIndex) && EvaluatedArgumentsVisitor.isSimpleArgument(suppliedArg.asRSyntaxNode());
             return PromiseNode.create(RPromiseFactory.create(PromiseType.ARG_SUPPLIED, closure), noOpt, forcedEager);
         }
     }
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/PromiseNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/PromiseNode.java
index 587e2b44b7ab8da7e0c26ec99177935995efd9df..6ac7ddfe4ce481d5338754363a36094085fdc0e0 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/PromiseNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/PromiseNode.java
@@ -43,6 +43,7 @@ import com.oracle.truffle.r.nodes.function.PromiseHelperNode.PromiseCheckHelperN
 import com.oracle.truffle.r.nodes.function.opt.OptConstantPromiseNode;
 import com.oracle.truffle.r.nodes.function.opt.OptForcedEagerPromiseNode;
 import com.oracle.truffle.r.nodes.function.opt.OptVariablePromiseBaseNode;
+import com.oracle.truffle.r.parser.tools.EvaluatedArgumentsVisitor;
 import com.oracle.truffle.r.runtime.ArgumentsSignature;
 import com.oracle.truffle.r.runtime.RInternalError;
 import com.oracle.truffle.r.runtime.RSerialize.State;
@@ -108,7 +109,7 @@ public abstract class PromiseNode extends RNode {
         if (arg instanceof WrapArgumentNode && ((WrapArgumentNode) arg).modeChange()) {
             wrapIndex = ((WrapArgumentNode) arg).getIndex();
         }
-        if (forcedEager) {
+        if (forcedEager && EvaluatedArgumentsVisitor.isSimpleArgument(expr.asRSyntaxNode())) {
             return new OptForcedEagerPromiseNode(factory, wrapIndex);
         } else {
             Object optimizableConstant = getOptimizableConstant(expr);
diff --git a/com.oracle.truffle.r.parser/src/com/oracle/truffle/r/parser/tools/EvaluatedArgumentsVisitor.java b/com.oracle.truffle.r.parser/src/com/oracle/truffle/r/parser/tools/EvaluatedArgumentsVisitor.java
index ea785a9f2be2a0a841e1a26eb3b4212e1ed80682..e247d0d082ad8f2005ffbdae7823ac6fdc357c02 100644
--- a/com.oracle.truffle.r.parser/src/com/oracle/truffle/r/parser/tools/EvaluatedArgumentsVisitor.java
+++ b/com.oracle.truffle.r.parser/src/com/oracle/truffle/r/parser/tools/EvaluatedArgumentsVisitor.java
@@ -190,4 +190,26 @@ public final class EvaluatedArgumentsVisitor extends RSyntaxVisitor<Info> {
             return new EvaluatedArgumentsFastPath(forcedArguments);
         }
     }
+
+    public static boolean isSimpleArgument(RSyntaxElement node) {
+        if (node instanceof RSyntaxCall) {
+            RSyntaxCall call = (RSyntaxCall) node;
+            RSyntaxElement lhs = call.getSyntaxLHS();
+            if (lhs instanceof RSyntaxLookup) {
+                if (wellKnownFunctions.contains(((RSyntaxLookup) lhs).getIdentifier())) {
+                    for (RSyntaxElement arg : call.getSyntaxArguments()) {
+                        if (!isSimpleArgument(arg)) {
+                            return false;
+                        }
+                    }
+                    return true;
+                }
+            }
+        } else if (node instanceof RSyntaxLookup) {
+            return true;
+        } else if (node instanceof RSyntaxConstant) {
+            return true;
+        }
+        return false;
+    }
 }