diff options
| author | Michael Gottesman <mgottesman@apple.com> | 2013-04-03 02:57:24 +0000 |
|---|---|---|
| committer | Michael Gottesman <mgottesman@apple.com> | 2013-04-03 02:57:24 +0000 |
| commit | b8c8836594f75280ff7f632846e8f48c027afabe (patch) | |
| tree | e48a0f7bae0b62904eebb6f457f2a8e37e0bf4b1 /llvm/lib | |
| parent | bcd06c0220b2e3524aeefa4a7bf8f7f8d83db706 (diff) | |
| download | bcm5719-llvm-b8c8836594f75280ff7f632846e8f48c027afabe.tar.gz bcm5719-llvm-b8c8836594f75280ff7f632846e8f48c027afabe.zip | |
Remove an optimization where we were changing an objc_autorelease into an objc_autoreleaseReturnValue.
The semantics of ARC implies that a pointer passed into an objc_autorelease
must live until some point (potentially down the stack) where an
autorelease pool is popped. On the other hand, an
objc_autoreleaseReturnValue just signifies that the object must live
until the end of the given function at least.
Thus objc_autorelease is stronger than objc_autoreleaseReturnValue in
terms of the semantics of ARC* implying that performing the given
strength reduction without any knowledge of how this relates to
the autorelease pool pop that is further up the stack violates the
semantics of ARC.
*Even though objc_autoreleaseReturnValue if you know that no RV
optimization will occur is more computationally expensive.
llvm-svn: 178612
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp | 17 |
1 files changed, 1 insertions, 16 deletions
diff --git a/llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp b/llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp index a956caeffe0..5ac8c8e6c27 100644 --- a/llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp +++ b/llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp @@ -1440,8 +1440,7 @@ void ObjCARCOpt::OptimizeIndividualCalls(Function &F) { break; } - // objc_autorelease(x), objc_autoreleaseRV -> objc_release(x) if x is - // otherwise unused. + // objc_autorelease(x) -> objc_release(x) if x is otherwise unused. if (IsAutorelease(Class) && Inst->use_empty()) { CallInst *Call = cast<CallInst>(Inst); const Value *Arg = Call->getArgOperand(0); @@ -2861,20 +2860,6 @@ void ObjCARCOpt::OptimizeReturns(Function &F) { DependingInstructions.clear(); Visited.clear(); - // Convert the autorelease to an autoreleaseRV, since it's - // returning the value. - if (AutoreleaseClass == IC_Autorelease) { - DEBUG(dbgs() << "ObjCARCOpt::OptimizeReturns: Converting autorelease " - "=> autoreleaseRV since it's returning a value.\n" - " In: " << *Autorelease - << "\n"); - Autorelease->setCalledFunction(getAutoreleaseRVCallee(F.getParent())); - DEBUG(dbgs() << " Out: " << *Autorelease - << "\n"); - Autorelease->setTailCall(); // Always tail call autoreleaseRV. - AutoreleaseClass = IC_AutoreleaseRV; - } - // Check that there is nothing that can affect the reference // count between the retain and the call. // Note that Retain need not be in BB. |

