diff options
author | Philip Reames <listmail@philipreames.com> | 2015-02-28 00:47:50 +0000 |
---|---|---|
committer | Philip Reames <listmail@philipreames.com> | 2015-02-28 00:47:50 +0000 |
commit | a226e6115c5f591fcd68bcfd10cf872c155c0e2c (patch) | |
tree | d36ceec204e9d27d5cb24f7a4d59d4a0ccc3bd1f /llvm/lib | |
parent | b52cf5213dd7639789193e17906c0aca842cfe86 (diff) | |
download | bcm5719-llvm-a226e6115c5f591fcd68bcfd10cf872c155c0e2c.tar.gz bcm5719-llvm-a226e6115c5f591fcd68bcfd10cf872c155c0e2c.zip |
[RewriteStatepointsForGC] Fix iterator invalidation bug
Inserting into a DenseMap you're iterating over is not well defined. This is unfortunate since this is well defined on a std::map.
"cleanup per llvm code style standards" bug #2
llvm-svn: 230827
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp b/llvm/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp index bf5364a4df5..37c273c7fbe 100644 --- a/llvm/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp +++ b/llvm/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp @@ -684,12 +684,19 @@ static Value *findBasePointer(Value *I, DefiningValueMapTy &cache, states[def] = PhiState(); // Recursively fill in all phis & selects reachable from the initial one // for which we don't already know a definite base value for - // PERF: Yes, this is as horribly inefficient as it looks. + // TODO: This should be rewritten with a worklist bool done = false; while (!done) { done = true; + // Since we're adding elements to 'states' as we run, we can't keep + // iterators into the set. + SmallVector<Value*, 16> Keys; + Keys.reserve(states.size()); for (auto Pair : states) { - Value *v = Pair.first; + Value *V = Pair.first; + Keys.push_back(V); + } + for (Value *v : Keys) { assert(!isKnownBaseResult(v) && "why did it get added?"); if (PHINode *phi = dyn_cast<PHINode>(v)) { assert(phi->getNumIncomingValues() > 0 && @@ -734,6 +741,7 @@ static Value *findBasePointer(Value *I, DefiningValueMapTy &cache, while (progress) { oldSize = states.size(); progress = false; + // We're only changing keys in this loop, thus safe to keep iterators for (auto Pair : states) { MeetPhiStates calculateMeet(states); Value *v = Pair.first; @@ -768,6 +776,7 @@ static Value *findBasePointer(Value *I, DefiningValueMapTy &cache, } // Insert Phis for all conflicts + // Only changing keys in 'states', thus safe to keep iterators for (auto Pair : states) { Instruction *v = cast<Instruction>(Pair.first); PhiState state = Pair.second; |