diff options
author | Dan Gohman <gohman@apple.com> | 2010-06-30 20:21:12 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2010-06-30 20:21:12 +0000 |
commit | f638f4ff84b5711082b2c30ce506e8ea5180bd99 (patch) | |
tree | 57a6798165f7d6a690787ffec2b25cfd5bf6d7ac | |
parent | 8ab6c54ce29d15e6c60fb4fdb0ca8a9b62da5c7a (diff) | |
download | bcm5719-llvm-f638f4ff84b5711082b2c30ce506e8ea5180bd99.tar.gz bcm5719-llvm-f638f4ff84b5711082b2c30ce506e8ea5180bd99.zip |
In ScalarEvolution::forgetValue, eliminate any SCEVUnknown
entries associated with the value being erased in the
folding set map. These entries used to be harmless, because
a SCEVUnknown doesn't store any information about its Value*,
so having a new Value allocated at the old Value's address
wasn't a problem. But now that ScalarEvolution is storing more
information about values, this is no longer safe.
llvm-svn: 107316
-rw-r--r-- | llvm/lib/Analysis/ScalarEvolution.cpp | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp index d541b5535d3..413b3b47f92 100644 --- a/llvm/lib/Analysis/ScalarEvolution.cpp +++ b/llvm/lib/Analysis/ScalarEvolution.cpp @@ -3657,6 +3657,26 @@ void ScalarEvolution::forgetValue(Value *V) { 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); } } |