From d2c49ab726c20fd51a2c3df4689636a56812c355 Mon Sep 17 00:00:00 2001 From: Pete Cooper Date: Tue, 18 Dec 2018 22:31:34 +0000 Subject: [PATCH] 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 --- lib/CodeGen/PreISelIntrinsicLowering.cpp | 13 ++++++++++--- .../Transforms/PreISelIntrinsicLowering/objc-arc.ll | 5 +++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/lib/CodeGen/PreISelIntrinsicLowering.cpp b/lib/CodeGen/PreISelIntrinsicLowering.cpp index cd15f6b7fcb..3689dab2331 100644 --- a/lib/CodeGen/PreISelIntrinsicLowering.cpp +++ b/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(FCache)) + Fn->addFnAttr(Attribute::NonLazyBind); for (auto I = F.use_begin(), E = F.use_end(); I != E;) { auto *CI = dyn_cast(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/test/Transforms/PreISelIntrinsicLowering/objc-arc.ll b/test/Transforms/PreISelIntrinsicLowering/objc-arc.ll index be852dfe37f..235ef65beee 100644 --- a/test/Transforms/PreISelIntrinsicLowering/objc-arc.ll +++ b/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 } -- 2.50.1