summaryrefslogtreecommitdiffstats
path: root/llvm/unittests/IR/DominatorTreeTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/unittests/IR/DominatorTreeTest.cpp')
-rw-r--r--llvm/unittests/IR/DominatorTreeTest.cpp30
1 files changed, 30 insertions, 0 deletions
diff --git a/llvm/unittests/IR/DominatorTreeTest.cpp b/llvm/unittests/IR/DominatorTreeTest.cpp
index 5856d5539a0..da5d5025e23 100644
--- a/llvm/unittests/IR/DominatorTreeTest.cpp
+++ b/llvm/unittests/IR/DominatorTreeTest.cpp
@@ -797,6 +797,36 @@ TEST(DominatorTree, DeleteUnreachable) {
}
}
+TEST(DominatorTree, DeletionsInSubtrees) {
+ CFGHolder Holder;
+ std::vector<CFGBuilder::Arc> Arcs = {{"0", "1"}, {"1", "2"}, {"1", "3"},
+ {"1", "6"}, {"3", "4"}, {"2", "5"},
+ {"5", "2"}};
+
+ // It is possible to perform multiple deletions and inform the
+ // DominatorTree about them at the same time, if the all of the
+ // deletions happen in different subtrees.
+ std::vector<CFGBuilder::Update> Updates = {{Delete, {"1", "2"}},
+ {Delete, {"1", "3"}}};
+ CFGBuilder B(Holder.F, Arcs, Updates);
+ DominatorTree DT(*Holder.F);
+ EXPECT_TRUE(DT.verify());
+
+ Optional<CFGBuilder::Update> LastUpdate;
+ while ((LastUpdate = B.applyUpdate()))
+ ;
+
+ DT.deleteEdge(B.getOrAddBlock("1"), B.getOrAddBlock("2"));
+ DT.deleteEdge(B.getOrAddBlock("1"), B.getOrAddBlock("3"));
+
+ EXPECT_TRUE(DT.verify());
+ EXPECT_EQ(DT.getNode(B.getOrAddBlock("2")), nullptr);
+ EXPECT_EQ(DT.getNode(B.getOrAddBlock("3")), nullptr);
+ EXPECT_EQ(DT.getNode(B.getOrAddBlock("4")), nullptr);
+ EXPECT_EQ(DT.getNode(B.getOrAddBlock("5")), nullptr);
+ EXPECT_NE(DT.getNode(B.getOrAddBlock("6")), nullptr);
+}
+
TEST(DominatorTree, InsertDelete) {
std::vector<CFGBuilder::Arc> Arcs = {
{"1", "2"}, {"2", "3"}, {"3", "4"}, {"4", "5"}, {"5", "6"}, {"5", "7"},
OpenPOWER on IntegriCloud