summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms
diff options
context:
space:
mode:
authorMichael Gottesman <mgottesman@apple.com>2013-06-21 05:42:08 +0000
committerMichael Gottesman <mgottesman@apple.com>2013-06-21 05:42:08 +0000
commit4773a10cfbaefad4166edb836dcf29946e82e5e8 (patch)
tree89b62696d95c9639c5b1e09c4acb2abb50550d86 /llvm/lib/Transforms
parente1713e5fcffa616ceb0331de2eb708a807c063d0 (diff)
downloadbcm5719-llvm-4773a10cfbaefad4166edb836dcf29946e82e5e8.tar.gz
bcm5719-llvm-4773a10cfbaefad4166edb836dcf29946e82e5e8.zip
[objcarcopts] Refactor out the RRInfo merging code from PtrState into RRInfo::Merge.
I also added some comments and performed minor code cleanups. llvm-svn: 184528
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r--llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp45
1 files changed, 28 insertions, 17 deletions
diff --git a/llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp b/llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp
index fc5cf4e8646..a66771a479b 100644
--- a/llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp
+++ b/llvm/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);
}
}
OpenPOWER on IntegriCloud