summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Gohman <gohman@apple.com>2010-06-30 20:21:12 +0000
committerDan Gohman <gohman@apple.com>2010-06-30 20:21:12 +0000
commitf638f4ff84b5711082b2c30ce506e8ea5180bd99 (patch)
tree57a6798165f7d6a690787ffec2b25cfd5bf6d7ac
parent8ab6c54ce29d15e6c60fb4fdb0ca8a9b62da5c7a (diff)
downloadbcm5719-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.cpp20
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);
}
}
OpenPOWER on IntegriCloud