[PATCH] D140064: [IR] Adds Function::erase() for erasing a range of basic blocks
Vasileios Porpodas via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Dec 14 16:24:17 PST 2022
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rGc2355b361a0e: [IR] Adds Function::erase() for erasing a range of basic blocks (authored by vporpo).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D140064/new/
https://reviews.llvm.org/D140064
Files:
llvm/include/llvm/IR/Function.h
llvm/lib/IR/Function.cpp
llvm/unittests/IR/FunctionTest.cpp
Index: llvm/unittests/IR/FunctionTest.cpp
===================================================================
--- llvm/unittests/IR/FunctionTest.cpp
+++ llvm/unittests/IR/FunctionTest.cpp
@@ -443,4 +443,47 @@
"FromBeginIt not before FromEndIt!");
}
#endif //EXPENSIVE_CHECKS
+
+TEST(FunctionTest, EraseBBs) {
+ LLVMContext Ctx;
+ std::unique_ptr<Module> M = parseIR(Ctx, R"(
+ define void @foo() {
+ bb1:
+ br label %bb2
+ bb2:
+ br label %bb3
+ bb3:
+ br label %bb4
+ bb4:
+ br label %bb5
+ bb5:
+ ret void
+ }
+)");
+
+ Function *F = M->getFunction("foo");
+ BasicBlock *BB1 = getBBWithName(F, "bb1");
+ BasicBlock *BB2 = getBBWithName(F, "bb2");
+ BasicBlock *BB3 = getBBWithName(F, "bb3");
+ BasicBlock *BB4 = getBBWithName(F, "bb4");
+ BasicBlock *BB5 = getBBWithName(F, "bb5");
+ EXPECT_EQ(F->size(), 5u);
+
+ // Erase BB2.
+ BB1->getTerminator()->eraseFromParent();
+ auto It = F->erase(BB2->getIterator(), std::next(BB2->getIterator()));
+ EXPECT_EQ(F->size(), 4u);
+ // Check that the iterator returned matches the node after the erased one.
+ EXPECT_EQ(It, BB3->getIterator());
+
+ It = F->begin();
+ EXPECT_EQ(&*It++, BB1);
+ EXPECT_EQ(&*It++, BB3);
+ EXPECT_EQ(&*It++, BB4);
+ EXPECT_EQ(&*It++, BB5);
+
+ // Erase all BBs.
+ It = F->erase(F->begin(), F->end());
+ EXPECT_EQ(F->size(), 0u);
+}
} // end namespace
Index: llvm/lib/IR/Function.cpp
===================================================================
--- llvm/lib/IR/Function.cpp
+++ llvm/lib/IR/Function.cpp
@@ -380,6 +380,11 @@
BasicBlocks.splice(ToIt, FromF->BasicBlocks, FromBeginIt, FromEndIt);
}
+Function::iterator Function::erase(Function::iterator FromIt,
+ Function::iterator ToIt) {
+ return BasicBlocks.erase(FromIt, ToIt);
+}
+
//===----------------------------------------------------------------------===//
// Function Implementation
//===----------------------------------------------------------------------===//
Index: llvm/include/llvm/IR/Function.h
===================================================================
--- llvm/include/llvm/IR/Function.h
+++ llvm/include/llvm/IR/Function.h
@@ -715,6 +715,10 @@
Function::iterator FromBeginIt,
Function::iterator FromEndIt);
+ /// Erases a range of BasicBlocks from \p FromIt to (not including) \p ToIt.
+ /// \Returns \p ToIt.
+ Function::iterator erase(Function::iterator FromIt, Function::iterator ToIt);
+
/// Get the underlying elements of the Function... the basic block list is
/// empty for external functions.
///
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D140064.483027.patch
Type: text/x-patch
Size: 2650 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20221215/da2c8d9b/attachment.bin>
More information about the llvm-commits
mailing list