Index: llvm/lib/Analysis/CFG.cpp =================================================================== --- llvm/lib/Analysis/CFG.cpp +++ llvm/lib/Analysis/CFG.cpp @@ -254,8 +254,8 @@ } if (DT) { - if (DT->isReachableFromEntry(A->getParent()) != - DT->isReachableFromEntry(B->getParent())) + if (DT->isReachableFromEntry(A->getParent()) && + !DT->isReachableFromEntry(B->getParent())) return false; if (!ExclusionSet || ExclusionSet->empty()) { if (A->getParent() == &A->getParent()->getParent()->getEntryBlock() && Index: llvm/unittests/Analysis/CFGTest.cpp =================================================================== --- llvm/unittests/Analysis/CFGTest.cpp +++ llvm/unittests/Analysis/CFGTest.cpp @@ -491,3 +491,17 @@ "}"); ExpectPath(true); } + +TEST_F(IsPotentiallyReachableTest, UnreachableToReachable) { + ParseAssembly("define void @test() {\n" + "entry:\n" + " br label %exit\n" + "unreachableblock:\n" + " %A = bitcast i8 undef to i8\n" + " br label %exit\n" + "exit:\n" + " %B = bitcast i8 undef to i8\n" + " ret void\n" + "}"); + ExpectPath(true); +}