Added a "ConstantNotEq" map to ValueState (and added necessary typedefs and factory objects to ValueStateManager).

llvm-svn: 46758
diff --git a/clang/Analysis/RValues.h b/clang/Analysis/RValues.h
index 9048c67..b5b7873 100644
--- a/clang/Analysis/RValues.h
+++ b/clang/Analysis/RValues.h
@@ -50,6 +50,12 @@
   
   bool isInitialized() const { return Data != (unsigned) ~0; }
   operator unsigned() const { assert (isInitialized()); return Data; }
+
+  void Profile(llvm::FoldingSetNodeID& ID) const { ID.AddInteger(Data); }
+
+  static inline void Profile(llvm::FoldingSetNodeID& ID, SymbolID X) {
+    X.Profile(ID);
+  }
 };
   
 class SymbolData {
diff --git a/clang/Analysis/ValueState.cpp b/clang/Analysis/ValueState.cpp
index 2166a86..9bd02a2 100644
--- a/clang/Analysis/ValueState.cpp
+++ b/clang/Analysis/ValueState.cpp
@@ -162,7 +162,8 @@
 ValueStateManager::getInitialState() {
 
   // Create a state with empty variable bindings.
-  ValueStateImpl StateImpl(VBFactory.GetEmptyMap());
+  ValueStateImpl StateImpl(VBFactory.GetEmptyMap(),
+                           CNEFactory.GetEmptyMap());
   
   return getPersistentState(StateImpl);
 }
diff --git a/clang/Analysis/ValueState.h b/clang/Analysis/ValueState.h
index 57d80e9..984901f 100644
--- a/clang/Analysis/ValueState.h
+++ b/clang/Analysis/ValueState.h
@@ -114,7 +114,10 @@
 //===----------------------------------------------------------------------===//
 
 namespace vstate {
+  typedef llvm::ImmutableSet<llvm::APSInt*> IntSetTy;
+  
   typedef llvm::ImmutableMap<VarBindKey,RValue> VariableBindingsTy;  
+  typedef llvm::ImmutableMap<SymbolID,IntSetTy> ConstantNotEqTy;
 }
 
 /// ValueStateImpl - This class encapsulates the actual data values for
@@ -123,19 +126,27 @@
 ///  "persistent" in a FoldingSet its values will never change.
 struct ValueStateImpl : public llvm::FoldingSetNode {
   vstate::VariableBindingsTy VariableBindings;
+  vstate::ConstantNotEqTy    ConstantNotEq;
   
-  ValueStateImpl(vstate::VariableBindingsTy VB)
-    : VariableBindings(VB) {}
+  /// This ctor is used when creating the first ValueStateImpl object.
+  ValueStateImpl(vstate::VariableBindingsTy VB, vstate::ConstantNotEqTy CNE)
+    : VariableBindings(VB), ConstantNotEq(CNE) {}
   
+  /// Copy ctor - We must explicitly define this or else the "Next" ptr
+  ///  in FoldingSetNode will also get copied.
   ValueStateImpl(const ValueStateImpl& RHS)
     : llvm::FoldingSetNode(),
-      VariableBindings(RHS.VariableBindings) {} 
-    
+      VariableBindings(RHS.VariableBindings),
+      ConstantNotEq(RHS.ConstantNotEq) {} 
   
+  /// Profile - Profile the contents of a ValueStateImpl object for use
+  ///  in a FoldingSet.
   static void Profile(llvm::FoldingSetNodeID& ID, const ValueStateImpl& V) {
     V.VariableBindings.Profile(ID);
   }
-  
+
+  /// Profile - Used to profile the contents of this object for inclusion
+  ///  in a FoldingSet.
   void Profile(llvm::FoldingSetNodeID& ID) const {
     Profile(ID, *this);
   }
@@ -159,12 +170,16 @@
   // Accessors.
   
   ValueStateImpl* getImpl() const { return Data; }
-  
-  // Iterators.
+
+
+  // Binding maps typedefs.
   
   typedef vstate::VariableBindingsTy VariableBindingsTy;
-  typedef VariableBindingsTy::iterator vb_iterator;
-  
+  typedef vstate::ConstantNotEqTy    ConstantNotEqTy;
+
+  // Iterators.
+
+  typedef VariableBindingsTy::iterator vb_iterator;  
   vb_iterator begin() { return Data->VariableBindings.begin(); }
   vb_iterator end() { return Data->VariableBindings.end(); }
   
@@ -199,6 +214,10 @@
 
 private:
   ValueState::VariableBindingsTy::Factory VBFactory;
+  ValueState::ConstantNotEqTy::Factory    CNEFactory;
+  
+  /// StateSet - FoldingSet containing all the states created for analyzing
+  ///  a particular function.  This is used to unique states.
   llvm::FoldingSet<ValueStateImpl> StateSet;
 
   /// ValueMgr - Object that manages the data for all created RValues.