diff options
author | Akira Hatanaka <ahatanaka@apple.com> | 2019-03-21 20:16:09 +0000 |
---|---|---|
committer | Akira Hatanaka <ahatanaka@apple.com> | 2019-03-21 20:16:09 +0000 |
commit | b576c77a9ead5cd523e48b49fc5e536800718912 (patch) | |
tree | 5e55c3ba38b9daec136d0960d8b18e220a226dd4 | |
parent | 3205dbb3f1f96e77e106f964dcf1b5f69fba4ecc (diff) | |
download | bcm5719-llvm-b576c77a9ead5cd523e48b49fc5e536800718912.tar.gz bcm5719-llvm-b576c77a9ead5cd523e48b49fc5e536800718912.zip |
Don't add a tail keyword to calls to ObjC runtime functions if the calls
are annotated with notail.
r356705 annotated calls to objc_retainAutoreleasedReturnValue with
notail on x86-64. This commit teaches ARC optimizer to check the notail
marker on the call before turning it into a tail call.
rdar://problem/38675807
llvm-svn: 356707
-rw-r--r-- | llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp | 2 | ||||
-rw-r--r-- | llvm/test/Transforms/ObjCARC/tail-call-invariant-enforcement.ll | 6 |
2 files changed, 6 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp b/llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp index 9572674f758..34de66f05fb 100644 --- a/llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp +++ b/llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp @@ -848,7 +848,7 @@ void ObjCARCOpt::OptimizeIndividualCalls(Function &F) { // For functions which can never be passed stack arguments, add // a tail keyword. - if (IsAlwaysTail(Class)) { + if (IsAlwaysTail(Class) && !cast<CallInst>(Inst)->isNoTailCall()) { Changed = true; LLVM_DEBUG( dbgs() << "Adding tail keyword to function since it can never be " diff --git a/llvm/test/Transforms/ObjCARC/tail-call-invariant-enforcement.ll b/llvm/test/Transforms/ObjCARC/tail-call-invariant-enforcement.ll index fcb28dd169c..b05a16d10c6 100644 --- a/llvm/test/Transforms/ObjCARC/tail-call-invariant-enforcement.ll +++ b/llvm/test/Transforms/ObjCARC/tail-call-invariant-enforcement.ll @@ -48,10 +48,12 @@ entry: ret i8* %x } -; Always tail call objc_retainAutoreleasedReturnValue. +; Always tail call objc_retainAutoreleasedReturnValue unless it's annotated with +; notail. ; CHECK: define i8* @test3(i8* %x) [[NUW]] { ; CHECK: %tmp0 = tail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %y) [[NUW]] ; CHECK: %tmp1 = tail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %z) [[NUW]] +; CHECK: %tmp2 = notail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %z2) [[NUW]] ; CHECK: } define i8* @test3(i8* %x) nounwind { entry: @@ -59,6 +61,8 @@ entry: %tmp0 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %y) %z = call i8* @tmp(i8* %x) %tmp1 = tail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %z) + %z2 = call i8* @tmp(i8* %x) + %tmp2 = notail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %z2) ret i8* %x } |