OSDN Git Service

Fixed a bug where we were tail calling objc_autorelease causing an object to not...
authorMichael Gottesman <mgottesman@apple.com>
Sat, 12 Jan 2013 01:25:15 +0000 (01:25 +0000)
committerMichael Gottesman <mgottesman@apple.com>
Sat, 12 Jan 2013 01:25:15 +0000 (01:25 +0000)
commite8c161a92451ad38919525ea73ae3c6936c24bdf
tree1a695f9d0bcb9c782436b4beb22561336436da3d
parentec3199f675b17b12fd779df557c6bff25aa4e862
Fixed a bug where we were tail calling objc_autorelease causing an object to not be placed into an autorelease pool.

The reason that this occurs is that tail calling objc_autorelease eventually
tail calls -[NSObject autorelease] which supports fast autorelease. This can
cause us to violate the semantic gaurantees of __autoreleasing variables that
assignment to an __autoreleasing variables always yields an object that is
placed into the innermost autorelease pool.

The fix included in this patch works by:

1. In the peephole optimization function OptimizeIndividualFunctions, always
remove tail call from objc_autorelease.
2. Whenever we convert to/from an objc_autorelease, set/unset the tail call
keyword as appropriate.

*NOTE* I also handled the case where objc_autorelease is converted in
OptimizeReturns to an autoreleaseRV which still violates the ARC semantics. I
will be removing that in a later patch and I wanted to make sure that the tree
is in a consistent state vis-a-vis ARC always.

Additionally some test cases are provided and all tests that have tail call marked
objc_autorelease keywords have been modified so that tail call has been removed.

*NOTE* One test fails due to a separate bug that I am going to commit soon. Thus
I marked the check line TMP: instead of CHECK: so make check does not fail.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@172287 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Transforms/Scalar/ObjCARC.cpp
test/Transforms/ObjCARC/basic.ll
test/Transforms/ObjCARC/contract.ll
test/Transforms/ObjCARC/move-and-form-retain-autorelease.ll
test/Transforms/ObjCARC/rv.ll
test/Transforms/ObjCARC/tail-call-invariant-enforcement.ll [new file with mode: 0644]