diff --git a/llvm/include/llvm/IR/BasicBlock.h b/llvm/include/llvm/IR/BasicBlock.h --- a/llvm/include/llvm/IR/BasicBlock.h +++ b/llvm/include/llvm/IR/BasicBlock.h @@ -490,6 +490,12 @@ /// \Returns \p ToIt. BasicBlock::iterator erase(BasicBlock::iterator FromIt, BasicBlock::iterator ToIt); + /// Erases \p I from the instruction list. \Returns the iterator of the + /// instruction following \p I. + BasicBlock::iterator erase(Instruction *I) { + return InstList.erase(I->getIterator()); + } + /// Returns true if there are any uses of this basic block other than /// direct branches, switches, etc. to it. bool hasAddressTaken() const { diff --git a/llvm/lib/IR/Instruction.cpp b/llvm/lib/IR/Instruction.cpp --- a/llvm/lib/IR/Instruction.cpp +++ b/llvm/lib/IR/Instruction.cpp @@ -79,7 +79,7 @@ } iplist::iterator Instruction::eraseFromParent() { - return getParent()->getInstList().erase(getIterator()); + return getParent()->erase(this); } /// Insert an unlinked instruction into a basic block immediately before the diff --git a/llvm/unittests/IR/BasicBlockTest.cpp b/llvm/unittests/IR/BasicBlockTest.cpp --- a/llvm/unittests/IR/BasicBlockTest.cpp +++ b/llvm/unittests/IR/BasicBlockTest.cpp @@ -541,5 +541,43 @@ BB0->erase(BB0->begin(), BB0->end()); EXPECT_TRUE(BB0->empty()); } + +TEST(BasicBlockTest, EraseSingleInstr) { + LLVMContext Ctx; + std::unique_ptr M = parseIR(Ctx, R"( + define void @f(i32 %a) { + bb0: + %instr1 = add i32 %a, %a + %instr2 = sub i32 %a, %a + ret void + } +)"); + Function *F = &*M->begin(); + + auto BB0It = F->begin(); + BasicBlock *BB0 = &*BB0It; + + auto It = BB0->begin(); + Instruction *Instr1 = &*It++; + Instruction *Instr2 = &*It++; + Instruction *Ret = &*It++; + + EXPECT_EQ(BB0->size(), 3u); + + // Erase %instr1 + BB0->erase(Instr1); + EXPECT_EQ(BB0->size(), 2u); + EXPECT_EQ(&*BB0->begin(), Instr2); + + // Erase ret + BB0->erase(Ret); + EXPECT_EQ(BB0->size(), 1u); + EXPECT_EQ(&*BB0->begin(), Instr2); + + // Erase %instr2 + BB0->erase(Instr2); + EXPECT_TRUE(BB0->empty()); +} + } // End anonymous namespace. } // End llvm namespace.