Index: lib/Transforms/Utils/Local.cpp =================================================================== --- lib/Transforms/Utils/Local.cpp +++ lib/Transforms/Utils/Local.cpp @@ -2265,8 +2265,16 @@ if (DTU) { DTU->applyUpdates(Updates, /*ForceRemoveDuplicates*/ true); - for (auto *BB : ToDeleteBBs) + bool Deleted = false; + for (auto *BB : ToDeleteBBs) { + if (DTU->isBBPendingDeletion(BB)) + --NumRemoved; + else + Deleted = true; DTU->deleteBB(BB); + } + if (!Deleted) + return false; } return true; } Index: unittests/Transforms/Utils/Local.cpp =================================================================== --- unittests/Transforms/Utils/Local.cpp +++ unittests/Transforms/Utils/Local.cpp @@ -838,4 +838,23 @@ runWithDomTree(*M, "br_self_loop", runLazy); runWithDomTree(*M, "br_constant", runLazy); runWithDomTree(*M, "br_loop", runLazy); + + M = parseIR(C, + R"( + define void @f() { + entry: + ret void + bb0: + ret void + } + )"); + + auto checkRUBlocksRetVal = [&](Function &F, DominatorTree *DT) { + DomTreeUpdater DTU(DT, DomTreeUpdater::UpdateStrategy::Lazy); + EXPECT_TRUE(removeUnreachableBlocks(F, nullptr, &DTU)); + EXPECT_FALSE(removeUnreachableBlocks(F, nullptr, &DTU)); + EXPECT_TRUE(DTU.getDomTree().verify()); + }; + + runWithDomTree(*M, "f", checkRUBlocksRetVal); } \ No newline at end of file