summaryrefslogtreecommitdiffstats
path: root/clang/lib/Analysis/RegionStore.cpp
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2009-12-03 03:27:11 +0000
committerTed Kremenek <kremenek@apple.com>2009-12-03 03:27:11 +0000
commite5716cbae7f67cabc64edccfdaf02ef64115fd4a (patch)
tree21e2b46b97a101edb51aeacea1becf800fb6c293 /clang/lib/Analysis/RegionStore.cpp
parente692f7c30965a3634d2b8ca8c3a2dcf885f49396 (diff)
downloadbcm5719-llvm-e5716cbae7f67cabc64edccfdaf02ef64115fd4a.tar.gz
bcm5719-llvm-e5716cbae7f67cabc64edccfdaf02ef64115fd4a.zip
Add batch version of 'StoreManager::InvalidateRegion()' for invalidating multiple regions as once. After adopting this in the CFRefCount::EvalCall(), we see a reduction in analysis time of 1.5% when analyzing all of SQLite3.
llvm-svn: 90405
Diffstat (limited to 'clang/lib/Analysis/RegionStore.cpp')
-rw-r--r--clang/lib/Analysis/RegionStore.cpp32
1 files changed, 21 insertions, 11 deletions
diff --git a/clang/lib/Analysis/RegionStore.cpp b/clang/lib/Analysis/RegionStore.cpp
index e645172a5b6..170abc8fe6f 100644
--- a/clang/lib/Analysis/RegionStore.cpp
+++ b/clang/lib/Analysis/RegionStore.cpp
@@ -269,7 +269,15 @@ public:
const GRState *InvalidateRegion(const GRState *state, const MemRegion *R,
const Expr *E, unsigned Count,
- InvalidatedSymbols *IS);
+ InvalidatedSymbols *IS) {
+ return RegionStoreManager::InvalidateRegions(state, &R, &R+1, E, Count, IS);
+ }
+
+ const GRState *InvalidateRegions(const GRState *state,
+ const MemRegion * const *Begin,
+ const MemRegion * const *End,
+ const Expr *E, unsigned Count,
+ InvalidatedSymbols *IS);
private:
void RemoveSubRegionBindings(RegionBindings &B, const MemRegion *R,
@@ -460,16 +468,14 @@ void RegionStoreManager::RemoveSubRegionBindings(RegionBindings &B,
B = RBFactory.Remove(B, R);
}
-const GRState *RegionStoreManager::InvalidateRegion(const GRState *state,
- const MemRegion *R,
- const Expr *Ex,
- unsigned Count,
- InvalidatedSymbols *IS) {
+const GRState *RegionStoreManager::InvalidateRegions(const GRState *state,
+ const MemRegion * const *I,
+ const MemRegion * const *E,
+ const Expr *Ex,
+ unsigned Count,
+ InvalidatedSymbols *IS) {
ASTContext& Ctx = StateMgr.getContext();
- // Strip away casts.
- R = R->StripCasts();
-
// Get the mapping of regions -> subregions.
llvm::OwningPtr<RegionStoreSubRegionMap>
SubRegions(getRegionStoreSubRegionMap(state->getStore()));
@@ -478,10 +484,14 @@ const GRState *RegionStoreManager::InvalidateRegion(const GRState *state,
llvm::DenseMap<const MemRegion *, unsigned> Visited;
llvm::SmallVector<const MemRegion *, 10> WorkList;
- WorkList.push_back(R);
+
+ for ( ; I != E; ++I) {
+ // Strip away casts.
+ WorkList.push_back((*I)->StripCasts());
+ }
while (!WorkList.empty()) {
- R = WorkList.back();
+ const MemRegion *R = WorkList.back();
WorkList.pop_back();
// Have we visited this region before?
OpenPOWER on IntegriCloud