diff options
-rw-r--r-- | llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp | 13 | ||||
-rw-r--r-- | llvm/test/Transforms/PreISelIntrinsicLowering/objc-arc.ll | 5 |
2 files changed, 15 insertions, 3 deletions
diff --git a/llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp b/llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp index cd15f6b7fcb..3689dab2331 100644 --- a/llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp +++ b/llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp @@ -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"); diff --git a/llvm/test/Transforms/PreISelIntrinsicLowering/objc-arc.ll b/llvm/test/Transforms/PreISelIntrinsicLowering/objc-arc.ll index be852dfe37f..235ef65beee 100644 --- a/llvm/test/Transforms/PreISelIntrinsicLowering/objc-arc.ll +++ b/llvm/test/Transforms/PreISelIntrinsicLowering/objc-arc.ll @@ -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 } |