[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