From ec2e5b8c92e6fc98fdb33ff1bd4fba5f92dc7194 Mon Sep 17 00:00:00 2001 From: Max Kazantsev Date: Thu, 27 Oct 2022 17:54:15 +0700 Subject: [PATCH] Fix iterator corruption in splitBasicBlockBefore We should not delete block predecessors (via replacing successors of terminators) while iterating them, otherwise we may skip some of them. Instead, save predecessors to a separate vector and iterate over it. --- llvm/lib/IR/BasicBlock.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/llvm/lib/IR/BasicBlock.cpp b/llvm/lib/IR/BasicBlock.cpp index 687865d..20101a9 100644 --- a/llvm/lib/IR/BasicBlock.cpp +++ b/llvm/lib/IR/BasicBlock.cpp @@ -452,7 +452,11 @@ BasicBlock *BasicBlock::splitBasicBlockBefore(iterator I, const Twine &BBName) { // If there were PHI nodes in 'this' block, the PHI nodes are updated // to reflect that the incoming branches will be from the New block and not // from predecessors of the 'this' block. - for (BasicBlock *Pred : predecessors(this)) { + // Save predecessors to separate vector before modifying them. + SmallVector Predecessors; + for (BasicBlock *Pred : predecessors(this)) + Predecessors.push_back(Pred); + for (BasicBlock *Pred : Predecessors) { Instruction *TI = Pred->getTerminator(); TI->replaceSuccessorWith(this, New); this->replacePhiUsesWith(Pred, New); -- 2.7.4