diff options
author | Florian Hahn <florian.hahn@arm.com> | 2017-11-01 09:48:12 +0000 |
---|---|---|
committer | Florian Hahn <florian.hahn@arm.com> | 2017-11-01 09:48:12 +0000 |
commit | b93c06331ea77953e80bbd5ffb30167eade466f0 (patch) | |
tree | 9f812759eb8229719ce671c88ef55b1f5a538fc0 /llvm/lib/Transforms/Utils/CodeExtractor.cpp | |
parent | 948c0bcbd6a1fb520db8dbc0c7644a0597de9c16 (diff) | |
download | bcm5719-llvm-b93c06331ea77953e80bbd5ffb30167eade466f0.tar.gz bcm5719-llvm-b93c06331ea77953e80bbd5ffb30167eade466f0.zip |
[CodeExtractor] Fix iterator invalidation in findOrCreateBlockForHoisting.
Summary:
By replacing branches to CommonExitBlock, we remove the node from
CommonExitBlock's predecessors, invalidating the iterator. The problem
is exposed when the common exit block has multiple predecessors and
needs to sink lifetime info. The modification in the test case trigger
the issue.
Reviewers: davidxl, davide, wmi
Reviewed By: davidxl
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D39112
llvm-svn: 317084
Diffstat (limited to 'llvm/lib/Transforms/Utils/CodeExtractor.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/CodeExtractor.cpp | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Utils/CodeExtractor.cpp b/llvm/lib/Transforms/Utils/CodeExtractor.cpp index 0bcf58bd490..557171e1a28 100644 --- a/llvm/lib/Transforms/Utils/CodeExtractor.cpp +++ b/llvm/lib/Transforms/Utils/CodeExtractor.cpp @@ -307,7 +307,9 @@ CodeExtractor::findOrCreateBlockForHoisting(BasicBlock *CommonExitBlock) { BasicBlock *NewExitBlock = CommonExitBlock->splitBasicBlock( CommonExitBlock->getFirstNonPHI()->getIterator()); - for (auto *Pred : predecessors(CommonExitBlock)) { + for (auto PI = pred_begin(CommonExitBlock), PE = pred_end(CommonExitBlock); + PI != PE;) { + BasicBlock *Pred = *PI++; if (Blocks.count(Pred)) continue; Pred->getTerminator()->replaceUsesOfWith(CommonExitBlock, NewExitBlock); |