diff options
Diffstat (limited to 'llvm')
| -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 } |

