]> granicus.if.org Git - llvm/commitdiff
Add nonlazybind to objc_retain/objc_release when converting from intrinsics.
authorPete Cooper <peter_cooper@apple.com>
Tue, 18 Dec 2018 22:31:34 +0000 (22:31 +0000)
committerPete Cooper <peter_cooper@apple.com>
Tue, 18 Dec 2018 22:31:34 +0000 (22:31 +0000)
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

lib/CodeGen/PreISelIntrinsicLowering.cpp
test/Transforms/PreISelIntrinsicLowering/objc-arc.ll

index cd15f6b7fcb9d163c53ed1767346f7419ae3b08a..3689dab2331064cb6b869f937b85cc7aadb79a01 100644 (file)
@@ -57,7 +57,8 @@ static bool lowerLoadRelative(Function &F) {
   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 @@ static bool lowerObjCCall(Function &F, const char *NewFn) {
   // 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 @@ static bool lowerIntrinsics(Module &M) {
       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");
index be852dfe37fe4ac21bfad00654b908285abbfde0..235ef65beee266a5295e302dd81aa84a0006b79c 100644 (file)
@@ -279,3 +279,8 @@ declare i8* @llvm.objc.unretainedPointer(i8*)
 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 }