diff options
author | Dan Gohman <gohman@apple.com> | 2012-03-23 18:09:00 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2012-03-23 18:09:00 +0000 |
commit | 6fedb3c4016b8f706c472280a3a9b22430c73ef4 (patch) | |
tree | 6378ff2f28b76416921bf2d085a9d94a489c03da /lib/Transforms/Scalar/ObjCARC.cpp | |
parent | fbab4a8c8a142502b7cdeb7112366f8560a94cec (diff) | |
download | external_llvm-6fedb3c4016b8f706c472280a3a9b22430c73ef4.zip external_llvm-6fedb3c4016b8f706c472280a3a9b22430c73ef4.tar.gz external_llvm-6fedb3c4016b8f706c472280a3a9b22430c73ef4.tar.bz2 |
Don't convert objc_retainAutoreleasedReturnValue to objc_retain if it
is retaining the return value of an invoke that it immediately follows.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@153344 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Scalar/ObjCARC.cpp')
-rw-r--r-- | lib/Transforms/Scalar/ObjCARC.cpp | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/lib/Transforms/Scalar/ObjCARC.cpp b/lib/Transforms/Scalar/ObjCARC.cpp index b5f9171..ab8cd44 100644 --- a/lib/Transforms/Scalar/ObjCARC.cpp +++ b/lib/Transforms/Scalar/ObjCARC.cpp @@ -2143,17 +2143,26 @@ ObjCARCOpt::OptimizeRetainCall(Function &F, Instruction *Retain) { /// return true. bool ObjCARCOpt::OptimizeRetainRVCall(Function &F, Instruction *RetainRV) { - // Check for the argument being from an immediately preceding call. + // Check for the argument being from an immediately preceding call or invoke. Value *Arg = GetObjCArg(RetainRV); CallSite CS(Arg); - if (Instruction *Call = CS.getInstruction()) + if (Instruction *Call = CS.getInstruction()) { if (Call->getParent() == RetainRV->getParent()) { BasicBlock::iterator I = Call; ++I; while (isNoopInstruction(I)) ++I; if (&*I == RetainRV) return false; + } else if (InvokeInst *II = dyn_cast<InvokeInst>(Call)) { + BasicBlock *RetainRVParent = RetainRV->getParent(); + if (II->getNormalDest() == RetainRVParent) { + BasicBlock::iterator I = RetainRVParent->begin(); + while (isNoopInstruction(I)) ++I; + if (&*I == RetainRV) + return false; + } } + } // Check for being preceded by an objc_autoreleaseReturnValue on the same // pointer. In this case, we can delete the pair. |