diff options
author | Michael Gottesman <mgottesman@apple.com> | 2013-04-05 22:54:28 +0000 |
---|---|---|
committer | Michael Gottesman <mgottesman@apple.com> | 2013-04-05 22:54:28 +0000 |
commit | e7ce2b3f75da1cdb657753592b73cda4252817ef (patch) | |
tree | 6240c62d8501c2d82056ecb9c9fc624089b779fe /test/Other/Inputs | |
parent | 2e80991a7712d51f7637513703fc896f93eea252 (diff) | |
download | external_llvm-e7ce2b3f75da1cdb657753592b73cda4252817ef.zip external_llvm-e7ce2b3f75da1cdb657753592b73cda4252817ef.tar.gz external_llvm-e7ce2b3f75da1cdb657753592b73cda4252817ef.tar.bz2 |
Properly model precise lifetime when given an incomplete dataflow sequence.
The normal dataflow sequence in the ARC optimizer consists of the following
states:
Retain -> CanRelease -> Use -> Release
The optimizer before this patch stored the uses that determine the lifetime of
the retainable object pointer when it bottom up hits a retain or when top down
it hits a release. This is correct for an imprecise lifetime scenario since what
we are trying to do is remove retains/releases while making sure that no
``CanRelease'' (which is usually a call) deallocates the given pointer before we
get to the ``Use'' (since that would cause a segfault).
If we are considering the precise lifetime scenario though, this is not
correct. In such a situation, we *DO* care about the previous sequence, but
additionally, we wish to track the uses resulting from the following incomplete
sequences:
Retain -> CanRelease -> Release (TopDown)
Retain <- Use <- Release (BottomUp)
*NOTE* This patch looks large but the most of it consists of updating
test cases. Additionally this fix exposed an additional bug. I removed
the test case that expressed said bug and will recommit it with the fix
in a little bit.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@178921 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Other/Inputs')
0 files changed, 0 insertions, 0 deletions