diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/qirinterface/IsExportableVisitor.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/qirinterface/IsExportableVisitor.java
index c87f05dd8342e8fa4a8bcc35cf3c50015d9e18c8..ffc2a2538ef78d3576673a2da8cd030104d96c14 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/qirinterface/IsExportableVisitor.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/qirinterface/IsExportableVisitor.java
@@ -98,6 +98,10 @@ public class IsExportableVisitor implements RSyntaxNodeVisitor<Boolean> {
     @Override
     public final Boolean visit(final RCallNode call) {
         final Arguments<RSyntaxNode> args = call.getArguments();
+        try {
+            return visitBuiltin(((LookupNode) call.getFunction()).getIdentifier());
+        } catch (RuntimeException e) {
+        }
         if (!call.getFunction().asRSyntaxNode().accept(this))
             return false;
         for (int i = 0; i < args.getLength(); i++)
@@ -109,13 +113,42 @@ public class IsExportableVisitor implements RSyntaxNodeVisitor<Boolean> {
     @Override
     public final Boolean visit(final RCallSpecialNode call) {
         final RSyntaxElement[] args = call.getSyntaxArguments();
-        // TODO: Handle builtin
+        if (!visitBuiltin(call.expectedFunction.getName()))
+            return false;
         for (int i = 0; i < args.length; i++)
             if (!((RSyntaxNode) args[i]).accept(this))
                 return false;
         return true;
     }
 
+    private final static Boolean visitBuiltin(final String name) {
+        switch (name) {
+            case "c":
+            case "$":
+            case "+":
+            case "-":
+            case "*":
+            case "/":
+            case "==":
+            case "!=":
+            case "&":
+            case "&&":
+            case "|":
+            case "||":
+            case "<=":
+            case "<":
+            case ">=":
+            case ">":
+            case "!":
+            case "(":
+                return true;
+            case "print":
+                return false;
+            default:
+                throw new RuntimeException("Unknown call special node: " + name);
+        }
+    }
+
     @Override
     public final Boolean visit(final ReplacementDispatchNode repl) {
         return repl.lhs.asRSyntaxNode().accept(this) && repl.rhs.asRSyntaxNode().accept(this);
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/qirinterface/QIRInterface.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/qirinterface/QIRInterface.java
index 9e22f84a4974638c5e3b32b5c2fea5207cdaf0c5..38208be03e37dad2080a5fec373e88c025633fff 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/qirinterface/QIRInterface.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/qirinterface/QIRInterface.java
@@ -286,7 +286,8 @@ public final class QIRInterface {
         } catch (UnsupportedOperationException e) {
             final SourceSection funSrc = fun.getCallTarget().getRootNode().getSourceSection();
             // TODO: Handle dependencies and exportability
-            return new QIRExportableTruffleNode(funSrc, "r", QIRInterface::execute, QIRInterface::apply, funSrc.getCharacters().toString());
+            return fun.getBody().accept(IsExportableVisitor.instance) ? new QIRExportableTruffleNode(funSrc, "r", QIRInterface::execute, QIRInterface::apply, funSrc.getCharacters().toString())
+                            : new QIRUnexportableTruffleNode(funSrc, "r", QIRInterface::execute, QIRInterface::apply, funSrc.getCharacters().toString());
         }
     }
 }
\ No newline at end of file