- 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.
 //===----------------------------------------------------------------------===//