[llvm-branch-commits] [llvm-branch] r109613 - in /llvm/branches/Apple/williamson/lib/Analysis: ScalarEvolution.cpp ScalarEvolution.cpp.orig

Daniel Dunbar daniel at zuster.org
Wed Jul 28 11:40:50 PDT 2010


Author: ddunbar
Date: Wed Jul 28 13:40:50 2010
New Revision: 109613

URL: http://llvm.org/viewvc/llvm-project?rev=109613&view=rev
Log:
Merge r109570:
--
Author: Dan Gohman <gohman at apple.com>
Date:   Wed Jul 28 01:09:07 2010 +0000

    Make SCEVCallbackVH::allUsesReplacedWith update the old SCEVUnknown
    object, as it may still be referenced by SCEVs not cleaned up by the
    use list traversal.

    Also, in ScalarEvolution::forgetValue, only check for a SCEVUnknown
    object for the original value, not for any value in the use list,
    because other SCEVUnknown values aren't necessary obsolete at that
    point.

Modified:
    llvm/branches/Apple/williamson/lib/Analysis/ScalarEvolution.cpp
    llvm/branches/Apple/williamson/lib/Analysis/ScalarEvolution.cpp.orig

Modified: llvm/branches/Apple/williamson/lib/Analysis/ScalarEvolution.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/Apple/williamson/lib/Analysis/ScalarEvolution.cpp?rev=109613&r1=109612&r2=109613&view=diff
==============================================================================
--- llvm/branches/Apple/williamson/lib/Analysis/ScalarEvolution.cpp (original)
+++ llvm/branches/Apple/williamson/lib/Analysis/ScalarEvolution.cpp Wed Jul 28 13:40:50 2010
@@ -3660,6 +3660,26 @@
 /// changed a value in a way that may effect its value, or which may
 /// disconnect it from a def-use chain linking it to a loop.
 void ScalarEvolution::forgetValue(Value *V) {
+  // If there's a SCEVUnknown tying this value into the SCEV
+  // space, remove it from the folding set map. The SCEVUnknown
+  // object and any other SCEV objects which reference it
+  // (transitively) remain allocated, effectively leaked until
+  // the underlying BumpPtrAllocator is freed.
+  //
+  // This permits SCEV pointers to be used as keys in maps
+  // such as the ValuesAtScopes map.
+  FoldingSetNodeID ID;
+  ID.AddInteger(scUnknown);
+  ID.AddPointer(V);
+  void *IP;
+  if (SCEV *S = UniqueSCEVs.FindNodeOrInsertPos(ID, IP)) {
+    UniqueSCEVs.RemoveNode(S);
+
+    // This isn't necessary, but we might as well remove the
+    // value from the ValuesAtScopes map too.
+    ValuesAtScopes.erase(S);
+  }
+
   Instruction *I = dyn_cast<Instruction>(V);
   if (!I) return;
 
@@ -3681,26 +3701,6 @@
         ConstantEvolutionLoopExitValue.erase(PN);
     }
 
-    // If there's a SCEVUnknown tying this value into the SCEV
-    // space, remove it from the folding set map. The SCEVUnknown
-    // object and any other SCEV objects which reference it
-    // (transitively) remain allocated, effectively leaked until
-    // the underlying BumpPtrAllocator is freed.
-    //
-    // This permits SCEV pointers to be used as keys in maps
-    // such as the ValuesAtScopes map.
-    FoldingSetNodeID ID;
-    ID.AddInteger(scUnknown);
-    ID.AddPointer(I);
-    void *IP;
-    if (SCEV *S = UniqueSCEVs.FindNodeOrInsertPos(ID, IP)) {
-      UniqueSCEVs.RemoveNode(S);
-
-      // This isn't necessary, but we might as well remove the
-      // value from the ValuesAtScopes map too.
-      ValuesAtScopes.erase(S);
-    }
-
     PushDefUseChildren(I, Worklist);
   }
 }
@@ -5686,15 +5686,32 @@
   // this now dangles!
 }
 
-void ScalarEvolution::SCEVCallbackVH::allUsesReplacedWith(Value *) {
+void ScalarEvolution::SCEVCallbackVH::allUsesReplacedWith(Value *V) {
   assert(SE && "SCEVCallbackVH called with a null ScalarEvolution!");
 
+  Value *Old = getValPtr();
+
+  // If there's a SCEVUnknown tying this value into the SCEV
+  // space, replace the SCEVUnknown's value with the new value
+  // for the benefit of any SCEVs still referencing it, and
+  // and remove it from the folding set map so that new scevs
+  // don't reference it.
+  FoldingSetNodeID ID;
+  ID.AddInteger(scUnknown);
+  ID.AddPointer(Old);
+  void *IP;
+  if (SCEVUnknown *S = cast_or_null<SCEVUnknown>(
+        SE->UniqueSCEVs.FindNodeOrInsertPos(ID, IP))) {
+    S->V = V;
+    SE->UniqueSCEVs.RemoveNode(S);
+    SE->ValuesAtScopes.erase(S);
+  }
+
   // Forget all the expressions associated with users of the old value,
   // so that future queries will recompute the expressions using the new
   // value.
   SmallVector<User *, 16> Worklist;
   SmallPtrSet<User *, 8> Visited;
-  Value *Old = getValPtr();
   for (Value::use_iterator UI = Old->use_begin(), UE = Old->use_end();
        UI != UE; ++UI)
     Worklist.push_back(*UI);

Modified: llvm/branches/Apple/williamson/lib/Analysis/ScalarEvolution.cpp.orig
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/Apple/williamson/lib/Analysis/ScalarEvolution.cpp.orig?rev=109613&r1=109612&r2=109613&view=diff
==============================================================================
--- llvm/branches/Apple/williamson/lib/Analysis/ScalarEvolution.cpp.orig (original)
+++ llvm/branches/Apple/williamson/lib/Analysis/ScalarEvolution.cpp.orig Wed Jul 28 13:40:50 2010
@@ -5695,7 +5695,6 @@
   SmallVector<User *, 16> Worklist;
   SmallPtrSet<User *, 8> Visited;
   Value *Old = getValPtr();
-  bool DeleteOld = false;
   for (Value::use_iterator UI = Old->use_begin(), UE = Old->use_end();
        UI != UE; ++UI)
     Worklist.push_back(*UI);
@@ -5703,10 +5702,8 @@
     User *U = Worklist.pop_back_val();
     // Deleting the Old value will cause this to dangle. Postpone
     // that until everything else is done.
-    if (U == Old) {
-      DeleteOld = true;
+    if (U == Old)
       continue;
-    }
     if (!Visited.insert(U))
       continue;
     if (PHINode *PN = dyn_cast<PHINode>(U))
@@ -5716,14 +5713,11 @@
          UI != UE; ++UI)
       Worklist.push_back(*UI);
   }
-  // Delete the Old value if it (indirectly) references itself.
-  if (DeleteOld) {
-    if (PHINode *PN = dyn_cast<PHINode>(Old))
-      SE->ConstantEvolutionLoopExitValue.erase(PN);
-    SE->Scalars.erase(Old);
-    // this now dangles!
-  }
-  // this may dangle!
+  // Delete the Old value.
+  if (PHINode *PN = dyn_cast<PHINode>(Old))
+    SE->ConstantEvolutionLoopExitValue.erase(PN);
+  SE->Scalars.erase(Old);
+  // this now dangles!
 }
 
 ScalarEvolution::SCEVCallbackVH::SCEVCallbackVH(Value *V, ScalarEvolution *se)





More information about the llvm-branch-commits mailing list