From 7dbbc2178fb487f3a8bff03a2c9e87f727bf2b98 Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Tue, 8 May 2012 21:49:51 +0000 Subject: [PATCH] When creating lazy bindings in RegionStore, propagate existing lazy bindings instead of creating new ones. This is a functionality optimization. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@156427 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/StaticAnalyzer/Core/RegionStore.cpp | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/lib/StaticAnalyzer/Core/RegionStore.cpp b/lib/StaticAnalyzer/Core/RegionStore.cpp index 1fec020623..bf79b9da0b 100644 --- a/lib/StaticAnalyzer/Core/RegionStore.cpp +++ b/lib/StaticAnalyzer/Core/RegionStore.cpp @@ -1427,12 +1427,30 @@ SVal RegionStoreManager::getBindingForLazySymbol(const TypedValueRegion *R) { SVal RegionStoreManager::getBindingForStruct(Store store, const TypedValueRegion* R) { assert(R->getValueType()->isStructureOrClassType()); + + // If we already have a lazy binding, don't create a new one. + RegionBindings B = GetRegionBindings(store); + BindingKey K = BindingKey::Make(R, BindingKey::Default); + if (const nonloc::LazyCompoundVal *V = + dyn_cast_or_null(lookup(B, K))) { + return *V; + } + return svalBuilder.makeLazyCompoundVal(StoreRef(store, *this), R); } -SVal RegionStoreManager::getBindingForArray(Store store, +SVal RegionStoreManager::getBindingForArray(Store store, const TypedValueRegion * R) { assert(Ctx.getAsConstantArrayType(R->getValueType())); + + // If we already have a lazy binding, don't create a new one. + RegionBindings B = GetRegionBindings(store); + BindingKey K = BindingKey::Make(R, BindingKey::Default); + if (const nonloc::LazyCompoundVal *V = + dyn_cast_or_null(lookup(B, K))) { + return *V; + } + return svalBuilder.makeLazyCompoundVal(StoreRef(store, *this), R); } -- 2.40.0