diff options
| author | Ted Kremenek <kremenek@apple.com> | 2012-12-07 06:49:27 +0000 |
|---|---|---|
| committer | Ted Kremenek <kremenek@apple.com> | 2012-12-07 06:49:27 +0000 |
| commit | f19db16b0e9129a25eaf36557e8bdf064cdd1891 (patch) | |
| tree | 58e3af7ffe0ee7c8fa5d95285e4af5f75a62de23 | |
| parent | 97030e0c0e528c7653c2f3ad8e467e4ed82b9d4b (diff) | |
| download | bcm5719-llvm-f19db16b0e9129a25eaf36557e8bdf064cdd1891.tar.gz bcm5719-llvm-f19db16b0e9129a25eaf36557e8bdf064cdd1891.zip | |
Further reduce analysis time by 0.2% on a heavy Objective-C example by avoiding over-eager canonicalization of clusters.
llvm-svn: 169586
| -rw-r--r-- | clang/lib/StaticAnalyzer/Core/RegionStore.cpp | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/RegionStore.cpp b/clang/lib/StaticAnalyzer/Core/RegionStore.cpp index bf8dcf018d8..c0ed95f5676 100644 --- a/clang/lib/StaticAnalyzer/Core/RegionStore.cpp +++ b/clang/lib/StaticAnalyzer/Core/RegionStore.cpp @@ -131,7 +131,8 @@ void BindingKey::dump() const { // Actual Store type. //===----------------------------------------------------------------------===// -typedef llvm::ImmutableMap<BindingKey, SVal> ClusterBindings; +typedef llvm::ImmutableMap<BindingKey, SVal> ClusterBindings; +typedef llvm::ImmutableMapRef<BindingKey, SVal> ClusterBindingsRef; typedef llvm::ImmutableMap<const MemRegion *, ClusterBindings> RegionBindings; @@ -705,7 +706,7 @@ RegionStoreManager::removeSubRegionBindings(RegionBindingsRef B, if (!Cluster) return B; - ClusterBindings Result = *Cluster; + ClusterBindingsRef Result(*Cluster, CBFactory); // It is safe to iterate over the bindings as they are being changed // because they are in an ImmutableMap. @@ -722,7 +723,7 @@ RegionStoreManager::removeSubRegionBindings(RegionBindingsRef B, NextKey.getOffset() - SRKey.getOffset() < Length) { // Case 1: The next binding is inside the region we're invalidating. // Remove it. - Result = CBFactory.remove(Result, NextKey); + Result = Result.remove(NextKey); } else if (NextKey.getOffset() == SRKey.getOffset()) { // Case 2: The next binding is at the same offset as the region we're @@ -732,7 +733,7 @@ RegionStoreManager::removeSubRegionBindings(RegionBindingsRef B, // FIXME: This is probably incorrect; consider invalidating an outer // struct whose first field is bound to a LazyCompoundVal. if (NextKey.isDirect()) - Result = CBFactory.remove(Result, NextKey); + Result = Result.remove(NextKey); } } else if (NextKey.hasSymbolicOffset()) { @@ -743,13 +744,13 @@ RegionStoreManager::removeSubRegionBindings(RegionBindingsRef B, // we'll be conservative and remove it. if (NextKey.isDirect()) if (isCompatibleWithFields(NextKey, FieldsInSymbolicSubregions)) - Result = CBFactory.remove(Result, NextKey); + Result = Result.remove(NextKey); } else if (const SubRegion *BaseSR = dyn_cast<SubRegion>(Base)) { // Case 4: The next key is symbolic, but we changed a known // super-region. In this case the binding is certainly no longer valid. if (R == Base || BaseSR->isSubRegionOf(R)) if (isCompatibleWithFields(NextKey, FieldsInSymbolicSubregions)) - Result = CBFactory.remove(Result, NextKey); + Result = Result.remove(NextKey); } } } @@ -758,11 +759,11 @@ RegionStoreManager::removeSubRegionBindings(RegionBindingsRef B, // we don't treat the base region as uninitialized anymore. // FIXME: This isn't very precise; see the example in the loop. if (HasSymbolicOffset) - Result = CBFactory.add(Result, SRKey, UnknownVal()); + Result = Result.add(SRKey, UnknownVal()); if (Result.isEmpty()) return B.remove(ClusterHead); - return B.add(ClusterHead, Result); + return B.add(ClusterHead, Result.asImmutableMap()); } namespace { |

