Index: lib/IR/SafepointIRVerifier.cpp =================================================================== --- lib/IR/SafepointIRVerifier.cpp +++ lib/IR/SafepointIRVerifier.cpp @@ -374,12 +374,13 @@ GCPtrTracker::GCPtrTracker(const Function &F, const DominatorTree &DT) : F(F) { // First, calculate Contribution of each BB. - for (const BasicBlock &BB : F) { - BasicBlockState *BBS = new (BSAllocator.Allocate()) BasicBlockState; - for (const auto &I : BB) - transferInstruction(I, BBS->Cleared, BBS->Contribution); - BlockMap[&BB] = BBS; - } + for (const BasicBlock &BB : F) + if (DT.isReachableFromEntry(&BB)) { + BasicBlockState *BBS = new (BSAllocator.Allocate()) BasicBlockState; + for (const auto &I : BB) + transferInstruction(I, BBS->Cleared, BBS->Contribution); + BlockMap[&BB] = BBS; + } // Initialize AvailableIn/Out sets of each BB using only information about // dominating BBs. @@ -560,6 +561,7 @@ const DominatorTree &DT) { DomTreeNode *DTN = DT[const_cast(BB)]; + assert(DTN && "Unreachable blocks are ignored"); while (DTN->getIDom()) { DTN = DTN->getIDom(); const auto &Defs = BlockMap[DTN->getBlock()]->Contribution; Index: test/SafepointIRVerifier/unreachable-block-tolerant.ll =================================================================== --- test/SafepointIRVerifier/unreachable-block-tolerant.ll +++ test/SafepointIRVerifier/unreachable-block-tolerant.ll @@ -0,0 +1,23 @@ +; RUN: opt -safepoint-ir-verifier-print-only -verify-safepoint-ir -S %s 2>&1 | FileCheck %s + +; This test checks that StatepointIRVerifier does not crash on +; a CFG with unreachable blocks. + +%jObject = type { [8 x i8] } + +; Function Attrs: nounwind +define %jObject addrspace(1)* @test(%jObject addrspace(1)* %arg) gc "statepoint-example" { +; CHECK: Verifying gc pointers in function: test +; CHECK-NEXT: No illegal uses found by SafepointIRVerifier in: test + %safepoint_token3 = tail call token (i64, i32, double (double)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_f64f64f(i64 0, i32 0, double (double)* undef, i32 1, i32 0, double undef, i32 0, i32 5, i32 0, i32 -1, i32 0, i32 0, i32 0, %jObject addrspace(1)* %arg) + %arg2.relocated4 = call coldcc %jObject addrspace(1)* @llvm.experimental.gc.relocate.p1jObject(token %safepoint_token3, i32 13, i32 13) + ret %jObject addrspace(1)* %arg2.relocated4 + +unreachable: + ret %jObject addrspace(1)* null +} + +; Function Attrs: nounwind +declare %jObject addrspace(1)* @llvm.experimental.gc.relocate.p1jObject(token, i32, i32) #3 + +declare token @llvm.experimental.gc.statepoint.p0f_f64f64f(i64, i32, double (double)*, i32, i32, ...)