- Add MemRegion::getMemorySpace()
- Change implementation of MemRegion::hasStackStorage()/hasHeapStorage() to use
'getMemorySpace()'. This avoids a double traversal up the region hierarchy
and is simpler.
- Add MemRegion::hasHeapOrStackStorage() as a slightly more efficient
alternative to 'hasStackStorage() || hasHeapStorage()'.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@73977 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Analysis/MemRegion.cpp b/lib/Analysis/MemRegion.cpp
index f018c83..c8e0275 100644
--- a/lib/Analysis/MemRegion.cpp
+++ b/lib/Analysis/MemRegion.cpp
@@ -313,46 +313,41 @@
return getRegion<AllocaRegion>(E, cnt);
}
-bool MemRegion::hasStackStorage() const {
- // Only subregions can have stack storage.
+
+const MemSpaceRegion *MemRegion::getMemorySpace() const {
+ const MemRegion *R = this;
const SubRegion* SR = dyn_cast<SubRegion>(this);
-
- if (!SR)
- return false;
-
- MemSpaceRegion* S = getMemRegionManager()->getStackRegion();
while (SR) {
- const MemRegion *R = SR->getSuperRegion();
- if (R == S)
- return true;
-
- SR = dyn_cast<SubRegion>(R);
+ R = SR->getSuperRegion();
+ SR = dyn_cast<SubRegion>(R);
}
-
+
+ return dyn_cast<MemSpaceRegion>(R);
+}
+
+bool MemRegion::hasStackStorage() const {
+ if (const MemSpaceRegion *MS = getMemorySpace())
+ return MS == getMemRegionManager()->getStackRegion();
+
return false;
}
bool MemRegion::hasHeapStorage() const {
- // Only subregions can have stack storage.
- const SubRegion* SR = dyn_cast<SubRegion>(this);
-
- if (!SR)
- return false;
-
- MemSpaceRegion* H = getMemRegionManager()->getHeapRegion();
-
- while (SR) {
- const MemRegion *R = SR->getSuperRegion();
- if (R == H)
- return true;
-
- SR = dyn_cast<SubRegion>(R);
- }
+ if (const MemSpaceRegion *MS = getMemorySpace())
+ return MS == getMemRegionManager()->getHeapRegion();
return false;
}
+bool MemRegion::hasHeapOrStackStorage() const {
+ if (const MemSpaceRegion *MS = getMemorySpace()) {
+ MemRegionManager *Mgr = getMemRegionManager();
+ return MS == Mgr->getHeapRegion() || MS == Mgr->getStackRegion();
+ }
+ return false;
+}
+
//===----------------------------------------------------------------------===//
// View handling.
//===----------------------------------------------------------------------===//