llvm-6502/test/Transforms/ObjCARC
Michael Gottesman e8c161a924 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
2013-01-12 01:25:15 +00:00
..
apelim.ll
basic.ll Fixed a bug where we were tail calling objc_autorelease causing an object to not be placed into an autorelease pool. 2013-01-12 01:25:15 +00:00
cfg-hazards.ll
contract-marker.ll
contract-storestrong-ivar.ll
contract-storestrong.ll
contract-testcases.ll
contract.ll Fixed a bug where we were tail calling objc_autorelease causing an object to not be placed into an autorelease pool. 2013-01-12 01:25:15 +00:00
empty-block.ll
escape.ll
expand.ll
gvn.ll
invoke.ll
lit.local.cfg
move-and-form-retain-autorelease.ll Fixed a bug where we were tail calling objc_autorelease causing an object to not be placed into an autorelease pool. 2013-01-12 01:25:15 +00:00
move-and-merge-autorelease.ll
nested.ll
no-objc-arc-exceptions.ll
path-overflow.ll
pointer-types.ll
post-inlining.ll
pr12270.ll Tests: rewrite 'opt ... %s' to 'opt ... < %s' so that opt does not emit a ModuleID 2012-12-30 02:33:22 +00:00
retain-block-alloca.ll
retain-block-load.ll
retain-block-side-effects.ll
retain-block.ll
retain-not-declared.ll
rle-s2l.ll
rv.ll Fixed a bug where we were tail calling objc_autorelease causing an object to not be placed into an autorelease pool. 2013-01-12 01:25:15 +00:00
split-backedge.ll
tail-call-invariant-enforcement.ll Fixed a bug where we were tail calling objc_autorelease causing an object to not be placed into an autorelease pool. 2013-01-12 01:25:15 +00:00
weak-contract.ll
weak-copies.ll
weak-dce.ll
weak.ll