Add nonlazybind to objc_retain/objc_release when converting from intrinsics.

For performance reasons, clang set nonlazybind on these functions.  Now that we
are using intrinsics instead of runtime calls, we should set this attribute when
creating the runtime functions.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@349558 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/PreISelIntrinsicLowering.cpp b/lib/CodeGen/PreISelIntrinsicLowering.cpp
index cd15f6b..3689dab 100644
--- a/lib/CodeGen/PreISelIntrinsicLowering.cpp
+++ b/lib/CodeGen/PreISelIntrinsicLowering.cpp
@@ -57,7 +57,8 @@
   return Changed;
 }
 
-static bool lowerObjCCall(Function &F, const char *NewFn) {
+static bool lowerObjCCall(Function &F, const char *NewFn,
+                          bool setNonLazyBind = false) {
   if (F.use_empty())
     return false;
 
@@ -65,6 +66,12 @@
   // program already contains a function with this name.
   Module *M = F.getParent();
   Constant* FCache = M->getOrInsertFunction(NewFn, F.getFunctionType());
+  
+  // If we have Native ARC, set nonlazybind attribute for these APIs for
+  // performance.
+  if (setNonLazyBind)
+    if (Function* Fn = dyn_cast<Function>(FCache))
+      Fn->addFnAttr(Attribute::NonLazyBind);
 
   for (auto I = F.use_begin(), E = F.use_end(); I != E;) {
     auto *CI = dyn_cast<CallInst>(I->getUser());
@@ -125,10 +132,10 @@
       Changed |= lowerObjCCall(F, "objc_moveWeak");
       break;
     case Intrinsic::objc_release:
-      Changed |= lowerObjCCall(F, "objc_release");
+      Changed |= lowerObjCCall(F, "objc_release", true);
       break;
     case Intrinsic::objc_retain:
-      Changed |= lowerObjCCall(F, "objc_retain");
+      Changed |= lowerObjCCall(F, "objc_retain", true);
       break;
     case Intrinsic::objc_retainAutorelease:
       Changed |= lowerObjCCall(F, "objc_retainAutorelease");
diff --git a/test/Transforms/PreISelIntrinsicLowering/objc-arc.ll b/test/Transforms/PreISelIntrinsicLowering/objc-arc.ll
index be852df..235ef65 100644
--- a/test/Transforms/PreISelIntrinsicLowering/objc-arc.ll
+++ b/test/Transforms/PreISelIntrinsicLowering/objc-arc.ll
@@ -279,3 +279,8 @@
 declare i8* @llvm.objc.retain.autorelease(i8*)
 declare i32 @llvm.objc.sync.enter(i8*)
 declare i32 @llvm.objc.sync.exit(i8*)
+
+; CHECK: declare void @objc_release(i8*) [[NLB:#[0-9]+]]
+; CHECK: declare i8* @objc_retain(i8*) [[NLB]]
+
+; CHECK: attributes [[NLB]] = { nonlazybind }