summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms
diff options
context:
space:
mode:
authorDan Gohman <gohman@apple.com>2009-11-23 16:13:39 +0000
committerDan Gohman <gohman@apple.com>2009-11-23 16:13:39 +0000
commit1f522d98f8e3a7275ee344a1f8c862b39d547d7c (patch)
tree6b47b67bf22df5ea0ae01e3894f39ab5342e423a /llvm/lib/Transforms
parenta6602e9e2a603dcd750d443e7b8fd60f1afc2a89 (diff)
downloadbcm5719-llvm-1f522d98f8e3a7275ee344a1f8c862b39d547d7c.tar.gz
bcm5719-llvm-1f522d98f8e3a7275ee344a1f8c862b39d547d7c.zip
Fix a use of an invalidated iterator in the case where there are multiple
adjacent uses of a dead basic block from the same user. This fixes PR5596. llvm-svn: 89658
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r--llvm/lib/Transforms/Scalar/SCCP.cpp6
1 files changed, 5 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Scalar/SCCP.cpp b/llvm/lib/Transforms/Scalar/SCCP.cpp
index 977827841d9..d8c59b1d742 100644
--- a/llvm/lib/Transforms/Scalar/SCCP.cpp
+++ b/llvm/lib/Transforms/Scalar/SCCP.cpp
@@ -1871,8 +1871,12 @@ bool IPSCCP::runOnModule(Module &M) {
BasicBlock *DeadBB = BlocksToErase[i];
for (Value::use_iterator UI = DeadBB->use_begin(), UE = DeadBB->use_end();
UI != UE; ) {
+ // Grab the user and then increment the iterator early, as the user
+ // will be deleted. Step past all adjacent uses from the same user.
+ Instruction *I = dyn_cast<Instruction>(*UI);
+ do { ++UI; } while (UI != UE && *UI == I);
+
// Ignore blockaddress users; BasicBlock's dtor will handle them.
- Instruction *I = dyn_cast<Instruction>(*UI++);
if (!I) continue;
bool Folded = ConstantFoldTerminator(I->getParent());
OpenPOWER on IntegriCloud