Skip to content

Commit

Permalink
Speculatively revert r109705 since it seems to be causing some build bot
Browse files Browse the repository at this point in the history
angst.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@109718 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
echristo committed Jul 29, 2010
1 parent d9082df commit e6cbfa6
Show file tree
Hide file tree
Showing 6 changed files with 33 additions and 162 deletions.
5 changes: 0 additions & 5 deletions include/llvm/Analysis/ScalarEvolution.h
Original file line number Diff line number Diff line change
Expand Up @@ -386,11 +386,6 @@ namespace llvm {
bool isKnownPredicateWithRanges(ICmpInst::Predicate Pred,
const SCEV *LHS, const SCEV *RHS);

/// forgetSCEVUnknown - V is being deleted or RAUW'd; remove the
/// SCEVUnknown for it from the uniquing map, and optionally
/// clear its contents to point to a replacement value.
void forgetSCEVUnknown(Value *V, Value *NewV);

public:
static char ID; // Pass identification, replacement for typeid
ScalarEvolution();
Expand Down
21 changes: 3 additions & 18 deletions include/llvm/Analysis/ScalarEvolutionExpressions.h
Original file line number Diff line number Diff line change
Expand Up @@ -524,26 +524,11 @@ namespace llvm {
friend class ScalarEvolution;
friend class ScalarEvolution::SCEVCallbackVH;

/// V - The Value represented by this SCEVUnknown.
/// This should be an AssertingVH, however SCEVUnknowns are allocated in a
/// BumpPtrAllocator so their destructors are never called.
// This should be an AssertingVH, however SCEVUnknowns are allocated in a
// BumpPtrAllocator so their destructors are never called.
Value *V;

/// UpdateList - When values are RAUW'd with new values, and the new
/// values already have their own SCEVUnknowns, they can end up with
/// muliple SCEVUnknowns. This pointer links them all together so that
/// they can all be updated when another RAUW happens.
SCEVUnknown *UpdateList;

/// getUpdateListBack - Return the last SCEVUnknown in te UpdateList.
SCEVUnknown *getUpdateListBack() {
SCEVUnknown *P = this;
while (SCEVUnknown *Q = P->UpdateList) P = Q;
return P;
}

SCEVUnknown(const FoldingSetNodeIDRef ID, Value *v) :
SCEV(ID, scUnknown), V(v), UpdateList(0) {}
SCEV(ID, scUnknown), V(v) {}

public:
Value *getValue() const { return V; }
Expand Down
74 changes: 29 additions & 45 deletions lib/Analysis/ScalarEvolution.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3660,59 +3660,29 @@ void ScalarEvolution::forgetLoop(const Loop *L) {
}
}

/// forgetSCEVUnknown - V is being deleted or RAUW'd; remove the
/// SCEVUnknown for it from the uniquing map, and optionally
/// clear its contents to point to a replacement value.
void ScalarEvolution::forgetSCEVUnknown(Value *V, Value *NewV) {
/// forgetValue - This method should be called by the client when it has
/// 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.

// Check for an exisitng SCEVUnknown for V in the uniquing map.
FoldingSetNodeID ID;
ID.AddInteger(scUnknown);
ID.AddPointer(V);
void *IP;
if (SCEV *S = UniqueSCEVs.FindNodeOrInsertPos(ID, IP)) {
// Remove the old SCEVUnknown from the uniquing map, effectively
// leaking it from subsequent use by ScalarEvolution. There
// may be existing SCEVs live which still point to it though.
UniqueSCEVs.RemoveNode(S);

// If there's a replacement value, update the old SCEVUnknowns
// so that SCEVs which still point to it see the new value.
if (NewV) {
// Update the old SCEVUnknown and all SCEVUnknowns on its update list
// to point to NewV instead of V.
for (SCEVUnknown *U = cast<SCEVUnknown>(S); U; U = U->UpdateList) {
assert(U->V == V && "SCEVUnknown update list is inconsistent!");
U->V = NewV;
}

// Check for an existing SCEVUnknown for NewV in the uniquing map.
ID.clear();
ID.AddInteger(scUnknown);
ID.AddPointer(NewV);
if (SCEV *NewS = UniqueSCEVs.FindNodeOrInsertPos(ID, IP)) {
// The uniquing map already had an entry for the new
// value. Append the old SCEVUnknown (and its update list) to the
// new SCEVUnknown's update list.
cast<SCEVUnknown>(NewS)->getUpdateListBack()->UpdateList =
cast<SCEVUnknown>(S);
} else {
// The uniquing map did not have an entry for the new
// value yet. Set the old SCEVUnknown, which has now been
// updated, to be the SCEVUnknown in the uniquing map.
UniqueSCEVs.InsertNode(S, IP);
}
}
// This isn't necessary, but we might as well remove the
// value from the ValuesAtScopes map too.
ValuesAtScopes.erase(S);
}
}

/// forgetValue - This method should be called by the client when it has
/// 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) {
forgetSCEVUnknown(V, 0);

Instruction *I = dyn_cast<Instruction>(V);
if (!I) return;
Expand Down Expand Up @@ -5722,10 +5692,24 @@ void ScalarEvolution::SCEVCallbackVH::deleted() {

void ScalarEvolution::SCEVCallbackVH::allUsesReplacedWith(Value *V) {
assert(SE && "SCEVCallbackVH called with a null ScalarEvolution!");

Value *Old = getValPtr();

// First, update existing SCEVUnknowns.
SE->forgetSCEVUnknown(Old, V);
// 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
Expand Down
15 changes: 0 additions & 15 deletions unittests/Analysis/Makefile

This file was deleted.

78 changes: 0 additions & 78 deletions unittests/Analysis/ScalarEvolutionTest.cpp

This file was deleted.

2 changes: 1 addition & 1 deletion unittests/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

LEVEL = ..

PARALLEL_DIRS = ADT ExecutionEngine Support Transforms VMCore Analysis
PARALLEL_DIRS = ADT ExecutionEngine Support Transforms VMCore

include $(LEVEL)/Makefile.common

Expand Down

0 comments on commit e6cbfa6

Please sign in to comment.