Index: include/clang/Analysis/PathSensitive/Store.h
===================================================================
--- include/clang/Analysis/PathSensitive/Store.h	(revision 58789)
+++ include/clang/Analysis/PathSensitive/Store.h	(working copy)
@@ -104,6 +104,10 @@
   
   /// iterBindings - Iterate over the bindings in the Store.
   virtual void iterBindings(Store store, BindingsHandler& f) = 0;  
+
+  virtual const GRState* setExtent(const GRState* state, const VarDecl* D) {
+    return state;
+  }
 };
   
 StoreManager* CreateBasicStoreManager(GRStateManager& StMgr);
Index: include/clang/Analysis/PathSensitive/GRState.h
===================================================================
--- include/clang/Analysis/PathSensitive/GRState.h	(revision 58789)
+++ include/clang/Analysis/PathSensitive/GRState.h	(working copy)
@@ -325,6 +325,7 @@
   LiveVariables& getLiveVariables() { return Liveness; }
   llvm::BumpPtrAllocator& getAllocator() { return Alloc; }
   MemRegionManager& getRegionManager() { return StoreMgr->getRegionManager(); }
+  StoreManager& getStoreManager() { return *StoreMgr; }
 
   typedef StoreManager::DeadSymbolsTy DeadSymbolsTy;
 
Index: include/clang/Analysis/PathSensitive/MemRegion.h
===================================================================
--- include/clang/Analysis/PathSensitive/MemRegion.h	(revision 58795)
+++ include/clang/Analysis/PathSensitive/MemRegion.h	(working copy)
@@ -405,7 +405,7 @@
 /// (a region).  Sizes are in bits.  RegionExtent is essentially a variant with
 /// three subclasses: UnknownExtent, FixedExtent, and SymbolicExtent.
 
-class RegionExtent {
+class RegionExtent : public llvm::FoldingSetNode {
 public:
   enum Kind { Unknown = 0, Fixed = 0, Sym = 1 };
 
@@ -487,6 +487,7 @@
 class MemRegionManager {
   llvm::BumpPtrAllocator& A;
   llvm::FoldingSet<MemRegion> Regions;
+  llvm::FoldingSet<RegionExtent> Extents;
   
   MemSpaceRegion* globals;
   MemSpaceRegion* stack;
@@ -561,6 +562,8 @@
 
   bool hasStackStorage(const MemRegion* R);
   
+  const RegionExtent* getExtent(const llvm::APSInt& I);
+  
 private:
   MemSpaceRegion* LazyAllocate(MemSpaceRegion*& region);
 };
Index: lib/Analysis/MemRegion.cpp
===================================================================
--- lib/Analysis/MemRegion.cpp	(revision 58789)
+++ lib/Analysis/MemRegion.cpp	(working copy)
@@ -396,3 +396,19 @@
   
   return false;
 }
+
+const RegionExtent* MemRegionManager::getExtent(const llvm::APSInt& I) {
+  FixedExtent Tmp(I);
+  llvm::FoldingSetNodeID ID;
+  Tmp.Profile(ID);
+
+  void* InsertPos;
+  RegionExtent* Ext = Extents.FindNodeOrInsertPos(ID, InsertPos);
+  if (!Ext) {
+    Ext = (RegionExtent*) A.Allocate<RegionExtent>();
+    new (Ext) FixedExtent(I);
+    Extents.InsertNode(Ext, InsertPos);
+  }
+
+  return Ext;
+}
Index: lib/Analysis/RegionStore.cpp
===================================================================
--- lib/Analysis/RegionStore.cpp	(revision 58789)
+++ lib/Analysis/RegionStore.cpp	(working copy)
@@ -16,6 +16,7 @@
 //===----------------------------------------------------------------------===//
 #include "clang/Analysis/PathSensitive/MemRegion.h"
 #include "clang/Analysis/PathSensitive/GRState.h"
+#include "clang/Analysis/PathSensitive/GRStateTrait.h"
 #include "clang/Analysis/Analyses/LiveVariables.h"
 
 #include "llvm/ADT/ImmutableMap.h"
@@ -26,6 +27,20 @@
 
 typedef llvm::ImmutableMap<const MemRegion*, SVal> RegionBindingsTy;
 
+typedef 
+llvm::ImmutableMap<const MemRegion*, const RegionExtent*> RegionExtentsTy;
+
+// GDM index tag.
+static int RegionExtentsTyIndex = 0;
+
+namespace clang {
+template<> struct GRStateTrait<RegionExtentsTy> 
+  : public GRStatePartialTrait<RegionExtentsTy> {
+
+  static void* GDMIndex() { return &RegionExtentsTyIndex; }
+};
+} // end namespace clang
+
 namespace {
 
 class VISIBILITY_HIDDEN RegionStoreManager : public StoreManager {
@@ -100,6 +115,8 @@
    return RegionBindingsTy(static_cast<const RegionBindingsTy::TreeTy*>(store));
   }
 
+  const GRState* setExtent(const GRState* state, const VarDecl* D);
+
   void print(Store store, std::ostream& Out, const char* nl, const char *sep);
 
   void iterBindings(Store store, BindingsHandler& f) {
@@ -424,6 +441,23 @@
   return store;
 }
 
+const GRState* RegionStoreManager::setExtent(const GRState* state, 
+                                             const VarDecl* D) {
+  // Get the extent.
+  QualType T = D->getType();
+  uint64_t Size = getContext().getTypeSize(T);
+  const llvm::APSInt& I = getBasicVals().getValue(Size, 64, true);
+  const RegionExtent* Ext = MRMgr.getExtent(I);
+
+  // Get the region.
+  SVal V = StateMgr.GetLValue(state, D);
+  const MemRegion* R = cast<loc::MemRegionVal>(V).getRegion();
+
+  // Set the extent.
+  GRStateRef StRef(state, StateMgr);
+  return StRef.set<RegionExtentsTy>(R, Ext);
+}
+
 void RegionStoreManager::print(Store store, std::ostream& Out, 
                                const char* nl, const char *sep) {
   llvm::raw_os_ostream OS(Out);
Index: lib/Analysis/GRExprEngine.cpp
===================================================================
--- lib/Analysis/GRExprEngine.cpp	(revision 58789)
+++ lib/Analysis/GRExprEngine.cpp	(working copy)
@@ -1628,6 +1628,7 @@
   for (NodeSet::iterator I=Tmp.begin(), E=Tmp.end(); I!=E; ++I) {
     const GRState* St = GetState(*I);
     St = StateMgr.BindDecl(St, VD, Ex, Builder->getCurrentBlockCount());
+    St = StateMgr.getStoreManager().setExtent(St, VD);
     MakeNode(Dst, DS, *I, St);
   }
 }
