diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/GetCallerFrameNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/GetCallerFrameNode.java
index fde5609e43395c48c0144a55ba92c565903a6f87..d90108207ac6ecb09aa382ea5f50503785661032 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/GetCallerFrameNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/GetCallerFrameNode.java
@@ -22,6 +22,7 @@
  */
 package com.oracle.truffle.r.nodes.function;
 
+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.frame.Frame;
@@ -54,7 +55,13 @@ public final class GetCallerFrameNode extends RBaseNode {
             return (MaterializedFrame) callerFrameObject;
         }
         if (callerFrameObject instanceof CallerFrameClosure) {
-            closureProfile.enter();
+            if (slowPathInitialized) {
+                closureProfile.enter();
+            } else {
+                // don't initialize the profile at the first call
+                CompilerDirectives.transferToInterpreterAndInvalidate();
+                slowPathInitialized = true;
+            }
             CallerFrameClosure closure = (CallerFrameClosure) callerFrameObject;
             RCaller parent = RArguments.getCall(frame);
             MaterializedFrame slowPathFrame = notifyCallers(closure, parent);
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/PromiseHelperNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/PromiseHelperNode.java
index 243858790910424768d6deb86ac0510659900f49..8e23d7679dba4b1a9c8bdaa364a9fdc75b49e1c5 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/PromiseHelperNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/PromiseHelperNode.java
@@ -158,14 +158,14 @@ public final class PromiseHelperNode extends RBaseNode {
         }
 
         int state = optStateProfile.profile(promise.getState());
-        if (PromiseState.isExplicit(state)) {
+        if (isExplicitProfile.profile(PromiseState.isExplicit(state))) {
             CompilerDirectives.transferToInterpreter();
             // reset profiles, this is very likely a one-time event
             isEvaluatedProfile = ConditionProfile.createBinaryProfile();
             optStateProfile = PrimitiveValueProfile.createEqualityProfile();
             return evaluateSlowPath(frame, promise);
         }
-        if (PromiseState.isDefaultOpt(state)) {
+        if (isDefaultOptProfile.profile(PromiseState.isDefaultOpt(state))) {
             return generateValueDefault(frame, promise);
         } else {
             return generateValueNonDefault(frame, state, (EagerPromise) promise);
@@ -320,7 +320,7 @@ public final class PromiseHelperNode extends RBaseNode {
      * <code>null</code>
      */
     public void materialize(RPromise promise) {
-        if (isDefaultOptProfile.profile(!PromiseState.isDefaultOpt(promise.getState()))) {
+        if (!isDefaultOptProfile.profile(PromiseState.isDefaultOpt(promise.getState()))) {
             EagerPromise eager = (EagerPromise) promise;
             eager.materialize();
         }
@@ -364,6 +364,7 @@ public final class PromiseHelperNode extends RBaseNode {
     private final ValueProfile valueProfile = ValueProfile.createClassProfile();
 
     // Eager
+    private final ConditionProfile isExplicitProfile = ConditionProfile.createBinaryProfile();
     private final ConditionProfile isDefaultOptProfile = ConditionProfile.createBinaryProfile();
     private final ConditionProfile isDeoptimizedProfile = ConditionProfile.createBinaryProfile();
     private final ValueProfile eagerValueProfile = ValueProfile.createClassProfile();
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/call/CallRFunctionBaseNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/call/CallRFunctionBaseNode.java
index 10aee1f08cfcc1f2abd4849015d564442c39037e..ab87ece2babdf11f2d5faffa3c765045f2b8c0cc 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/call/CallRFunctionBaseNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/call/CallRFunctionBaseNode.java
@@ -28,12 +28,14 @@ import com.oracle.truffle.api.Truffle;
 import com.oracle.truffle.api.frame.MaterializedFrame;
 import com.oracle.truffle.api.frame.VirtualFrame;
 import com.oracle.truffle.api.nodes.Node;
+import com.oracle.truffle.api.profiles.ConditionProfile;
 import com.oracle.truffle.r.runtime.CallerFrameClosure;
 
 public abstract class CallRFunctionBaseNode extends Node {
 
     protected final Assumption needsNoCallerFrame = Truffle.getRuntime().createAssumption("no caller frame");
     protected final CallerFrameClosure invalidateNoCallerFrame = new InvalidateNoCallerFrame(needsNoCallerFrame);
+    private final ConditionProfile topLevelProfile = ConditionProfile.createBinaryProfile();
     private static final CallerFrameClosure DUMMY = new DummyCallerFrameClosure();
 
     public boolean setNeedsCallerFrame() {
@@ -62,7 +64,7 @@ public abstract class CallRFunctionBaseNode extends Node {
         } else {
             if (callerFrame != null) {
                 return callerFrame;
-            } else if (topLevel) {
+            } else if (topLevelProfile.profile(topLevel)) {
                 return DUMMY;
             }
             return curFrame.materialize();
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/objects/ExecuteMethod.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/objects/ExecuteMethod.java
index baf6272c4fe748045beb93bf5c76293563c11db4..d61af375d2dabae17e033939d8cc032bba146cc1 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/objects/ExecuteMethod.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/objects/ExecuteMethod.java
@@ -14,6 +14,7 @@ package com.oracle.truffle.r.nodes.objects;
 
 import com.oracle.truffle.api.CompilerDirectives;
 import com.oracle.truffle.api.frame.VirtualFrame;
+import com.oracle.truffle.api.profiles.ValueProfile;
 import com.oracle.truffle.r.nodes.access.variables.LocalReadVariableNode;
 import com.oracle.truffle.r.nodes.access.variables.ReadVariableNode;
 import com.oracle.truffle.r.nodes.function.CallMatcherNode;
@@ -37,12 +38,15 @@ final class ExecuteMethod extends RBaseNode {
     @Child private CollectArgumentsNode collectArgs;
     @Child private CallMatcherNode callMatcher;
 
+    private final ValueProfile functionProfile = ValueProfile.createClassProfile();
+    private final ValueProfile signatureProfile = ValueProfile.createIdentityProfile();
+
     public Object executeObject(VirtualFrame frame, RFunction fdef, String fname) {
         if (collectArgs == null) {
             CompilerDirectives.transferToInterpreterAndInvalidate();
             collectArgs = insert(CollectArgumentsNodeGen.create());
         }
-        ArgumentsSignature signature = RArguments.getSignature(frame);
+        ArgumentsSignature signature = signatureProfile.profile(RArguments.getSignature(frame, functionProfile));
 
         // Collect arguments; we cannot use the arguments of the original call because there might
         // be overriding default arguments.