diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/base/AsCharacter.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/base/AsCharacter.java
index f2b2288083a168291224df9659f5c6286e21a6fe..67cc41df091bd9fe03e108e2cb2781abbe407094 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/base/AsCharacter.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/base/AsCharacter.java
@@ -131,6 +131,7 @@ public abstract class AsCharacter extends RBuiltinNode {
     public Object doObject(VirtualFrame frame, RAbstractVector vector) {
         controlVisibility();
         if (dcn == null) {
+            CompilerDirectives.transferToInterpreterAndInvalidate();
             dcn = insert(DispatchedCallNode.create("as.character", RRuntime.USE_METHOD, this.getSuppliedArgsNames()));
         }
         try {
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/base/EncodeString.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/base/EncodeString.java
index 2712f920c4177c205ed2c086f807425b44bcf4ba..e63fb15f8b69b5b4cc829632d01c94471823235c 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/base/EncodeString.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/base/EncodeString.java
@@ -13,6 +13,7 @@ package com.oracle.truffle.r.nodes.builtin.base;
 import com.oracle.truffle.api.CompilerDirectives.SlowPath;
 import com.oracle.truffle.api.dsl.*;
 import com.oracle.truffle.api.frame.*;
+import com.oracle.truffle.api.utilities.*;
 import com.oracle.truffle.r.nodes.*;
 import com.oracle.truffle.r.nodes.builtin.*;
 import com.oracle.truffle.r.nodes.unary.*;
@@ -32,6 +33,7 @@ public abstract class EncodeString extends RBuiltinNode {
     }
 
     private final NACheck na = NACheck.create();
+    private BranchProfile everSeenNA = new BranchProfile();
 
     @CreateCast("arguments")
     public RNode[] castArguments(RNode[] arguments) {
@@ -86,6 +88,7 @@ public abstract class EncodeString extends RBuiltinNode {
         for (int i = 0; i < x.getLength(); ++i) {
             String currentEl = x.getDataAt(i);
             if (RRuntime.isNA(currentEl)) {
+                everSeenNA.enter();
                 if (quoteEl.isEmpty()) {
                     currentEl = concat("<", currentEl, ">");
                 }
@@ -106,6 +109,7 @@ public abstract class EncodeString extends RBuiltinNode {
         for (int i = 0; i < x.getLength(); ++i) {
             final String currentEl = x.getDataAt(i);
             if (RRuntime.isNA(currentEl)) {
+                everSeenNA.enter();
                 result[i] = currentEl;
             } else {
                 result[i] = format(concat("%-", maxElWidth, "s"), concat(quoteEl, currentEl, quoteEl));
@@ -123,8 +127,9 @@ public abstract class EncodeString extends RBuiltinNode {
         for (int i = 0; i < x.getLength(); ++i) {
             String currentEl = x.getDataAt(i);
             if (RRuntime.isNA(currentEl)) {
+                everSeenNA.enter();
                 if (quoteEl.isEmpty()) {
-                    currentEl = "<" + currentEl + ">";
+                    currentEl = concat("<", currentEl, ">");
                 }
                 result[i] = format(concat("%", maxElWidth, "s"), currentEl);
             } else {
@@ -143,6 +148,7 @@ public abstract class EncodeString extends RBuiltinNode {
         for (int i = 0; i < x.getLength(); ++i) {
             final String currentEl = x.getDataAt(i);
             if (RRuntime.isNA(currentEl)) {
+                everSeenNA.enter();
                 result[i] = currentEl;
             } else {
                 result[i] = format(concat("%", maxElWidth, "s"), concat(quoteEl, currentEl, quoteEl));
@@ -164,6 +170,7 @@ public abstract class EncodeString extends RBuiltinNode {
             final String curEl = x.getDataAt(i);
             int totalPadding = padding - curEl.length();
             if (RRuntime.isNA(curEl)) {
+                everSeenNA.enter();
                 if (quoteEl.isEmpty()) {
                     // Accounting for <> in <NA>
                     totalPadding -= 2;
@@ -189,6 +196,7 @@ public abstract class EncodeString extends RBuiltinNode {
         for (int i = 0; i < x.getLength(); ++i) {
             final String curEl = x.getDataAt(i);
             if (RRuntime.isNA(curEl)) {
+                everSeenNA.enter();
                 result[i] = curEl;
             } else {
                 final int totalPadding = padding - curEl.length();
@@ -216,12 +224,13 @@ public abstract class EncodeString extends RBuiltinNode {
     }
 
     @SlowPath
-    private static String addPadding(final String el, final int leftPadding, final int rightPadding, final String quoteEl) {
+    private String addPadding(final String el, final int leftPadding, final int rightPadding, final String quoteEl) {
         final StringBuffer sb = new StringBuffer();
         for (int j = 0; j < leftPadding; ++j) {
             sb.append(" ");
         }
         if (RRuntime.isNA(el)) {
+            everSeenNA.enter();
             if (quoteEl.isEmpty()) {
                 sb.append("<");
                 sb.append(el);
@@ -248,9 +257,10 @@ public abstract class EncodeString extends RBuiltinNode {
         for (int i = 0; i < x.getLength(); ++i) {
             final String currentEl = x.getDataAt(i);
             if (RRuntime.isNA(currentEl)) {
+                everSeenNA.enter();
                 result[i] = new String(currentEl);
             } else {
-                result[i] = quoteEl + currentEl + quoteEl;
+                result[i] = concat(quoteEl, currentEl, quoteEl);
             }
         }
         return RDataFactory.createStringVector(result, RDataFactory.COMPLETE_VECTOR);
@@ -264,9 +274,10 @@ public abstract class EncodeString extends RBuiltinNode {
         for (int i = 0; i < x.getLength(); ++i) {
             final String currentEl = x.getDataAt(i);
             if (RRuntime.isNA(currentEl)) {
+                everSeenNA.enter();
                 result[i] = currentEl;
             } else {
-                result[i] = quoteEl + currentEl + quoteEl;
+                result[i] = concat(quoteEl, currentEl, quoteEl);
             }
         }
         return RDataFactory.createStringVector(result, na.neverSeenNA());