Added a new ProgramPoint: PostPurgeDeadSymbols.  This new program point distinguishes between the cases when we just evaluated the transfer function of a Stmt* (PostStmt) or performed a load (PostLoad).  This solves a caching bug observed in a recent bug report.

llvm-svn: 52443
diff --git a/clang/lib/Analysis/GRCoreEngine.cpp b/clang/lib/Analysis/GRCoreEngine.cpp
index 05f9303..7c2ca0c 100644
--- a/clang/lib/Analysis/GRCoreEngine.cpp
+++ b/clang/lib/Analysis/GRCoreEngine.cpp
@@ -317,12 +317,30 @@
     Eng.WList->Enqueue(Succ, B, Idx+1);
 }
 
+static inline ProgramPoint GetPostLoc(Stmt* S, ProgramPoint::Kind K) {
+  switch (K) {
+    default:
+      assert(false && "Invalid PostXXXKind.");
+      
+    case ProgramPoint::PostStmtKind:
+      return PostStmt(S);
+      
+    case ProgramPoint::PostLoadKind:
+      return PostLoad(S);
+      
+    case ProgramPoint::PostPurgeDeadSymbolsKind:
+      return PostPurgeDeadSymbols(S);
+  }
+}
+
 ExplodedNodeImpl*
 GRStmtNodeBuilderImpl::generateNodeImpl(Stmt* S, void* State,
-                                        ExplodedNodeImpl* Pred, bool isLoad) {
+                                        ExplodedNodeImpl* Pred,
+                                        ProgramPoint::Kind K) {
   
   bool IsNew;
-  ProgramPoint Loc = isLoad ? PostLoad(S) : PostStmt(S);
+  ProgramPoint Loc = GetPostLoc(S, K);
+  
   ExplodedNodeImpl* N = Eng.G->getNodeImpl(Loc, State, &IsNew);
   N->addPredecessor(Pred);
   Deferred.erase(Pred);