diff options
author | Michael Gottesman <mgottesman@apple.com> | 2013-06-21 05:42:08 +0000 |
---|---|---|
committer | Michael Gottesman <mgottesman@apple.com> | 2013-06-21 05:42:08 +0000 |
commit | 817ef2d78e9ea9671ebd50913f9a0baf3ad70d93 (patch) | |
tree | 76175750d54f0f951f3f9e943f4da8e403c5bd28 /lib | |
parent | de26195f3c09f7815161037b3227c34c6cc0afdb (diff) | |
download | llvm-817ef2d78e9ea9671ebd50913f9a0baf3ad70d93.tar.gz llvm-817ef2d78e9ea9671ebd50913f9a0baf3ad70d93.tar.bz2 llvm-817ef2d78e9ea9671ebd50913f9a0baf3ad70d93.tar.xz |
[objcarcopts] Refactor out the RRInfo merging code from PtrState into RRInfo::Merge.
I also added some comments and performed minor code cleanups.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@184528 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Transforms/ObjCARC/ObjCARCOpts.cpp | 45 |
1 files changed, 28 insertions, 17 deletions
diff --git a/lib/Transforms/ObjCARC/ObjCARCOpts.cpp b/lib/Transforms/ObjCARC/ObjCARCOpts.cpp index fc5cf4e864..a66771a479 100644 --- a/lib/Transforms/ObjCARC/ObjCARCOpts.cpp +++ b/lib/Transforms/ObjCARC/ObjCARCOpts.cpp @@ -465,6 +465,10 @@ namespace { void clear(); + /// Conservatively merge the two RRInfo. Returns true if a partial merge has + /// occured, false otherwise. + bool Merge(const RRInfo &Other); + bool IsTrackingImpreciseReleases() { return ReleaseMetadata != 0; } @@ -480,6 +484,29 @@ void RRInfo::clear() { CFGHazardAfflicted = false; } +bool RRInfo::Merge(const RRInfo &Other) { + // Conservatively merge the ReleaseMetadata information. + if (ReleaseMetadata != Other.ReleaseMetadata) + ReleaseMetadata = 0; + + // Conservatively merge the boolean state. + KnownSafe &= Other.KnownSafe; + IsTailCallRelease &= Other.IsTailCallRelease; + CFGHazardAfflicted |= Other.CFGHazardAfflicted; + + // Merge the call sets. + Calls.insert(Other.Calls.begin(), Other.Calls.end()); + + // Merge the insert point sets. If there are any differences, + // that makes this a partial merge. + bool Partial = ReverseInsertPts.size() != Other.ReverseInsertPts.size(); + for (SmallPtrSet<Instruction *, 2>::const_iterator + I = Other.ReverseInsertPts.begin(), + E = Other.ReverseInsertPts.end(); I != E; ++I) + Partial |= ReverseInsertPts.insert(*I); + return Partial; +} + namespace { /// \brief This class summarizes several per-pointer runtime properties which /// are propogated through the flow graph. @@ -557,23 +584,7 @@ PtrState::Merge(const PtrState &Other, bool TopDown) { // mixing them is unsafe. ClearSequenceProgress(); } else { - // Conservatively merge the ReleaseMetadata information. - if (RRI.ReleaseMetadata != Other.RRI.ReleaseMetadata) - RRI.ReleaseMetadata = 0; - - RRI.KnownSafe = RRI.KnownSafe && Other.RRI.KnownSafe; - RRI.IsTailCallRelease = RRI.IsTailCallRelease && - Other.RRI.IsTailCallRelease; - RRI.Calls.insert(Other.RRI.Calls.begin(), Other.RRI.Calls.end()); - RRI.CFGHazardAfflicted |= Other.RRI.CFGHazardAfflicted; - - // Merge the insert point sets. If there are any differences, - // that makes this a partial merge. - Partial = RRI.ReverseInsertPts.size() != Other.RRI.ReverseInsertPts.size(); - for (SmallPtrSet<Instruction *, 2>::const_iterator - I = Other.RRI.ReverseInsertPts.begin(), - E = Other.RRI.ReverseInsertPts.end(); I != E; ++I) - Partial |= RRI.ReverseInsertPts.insert(*I); + Partial = RRI.Merge(Other.RRI); } } |