Index: lib/Analysis/DivergenceAnalysis.cpp =================================================================== --- lib/Analysis/DivergenceAnalysis.cpp +++ lib/Analysis/DivergenceAnalysis.cpp @@ -138,7 +138,13 @@ // a2 = 2; // a = phi(a1, a2); // sync dependent on (tid < 5) BasicBlock *ThisBB = TI->getParent(); - BasicBlock *IPostDom = PDT.getNode(ThisBB)->getIDom()->getBlock(); + + // Unreachable blocks may not be in the dominator tree. + DomTreeNode *BBNode = PDT.getNode(ThisBB); + if (!BBNode) + return; + + BasicBlock *IPostDom = BBNode->getIDom()->getBlock(); if (IPostDom == nullptr) return; @@ -178,7 +184,12 @@ while (InfluenceRegion.count(InfluencedBB)) { for (auto &I : *InfluencedBB) findUsersOutsideInfluenceRegion(I, InfluenceRegion); - DomTreeNode *IDomNode = DT.getNode(InfluencedBB)->getIDom(); + + DomTreeNode *InfluenceNode = DT.getNode(InfluencedBB); + if (!InfluenceNode) + break; + + DomTreeNode *IDomNode = InfluenceNode->getIDom(); if (IDomNode == nullptr) break; InfluencedBB = IDomNode->getBlock(); Index: test/Analysis/DivergenceAnalysis/AMDGPU/unreachable-loop-block.ll =================================================================== --- /dev/null +++ test/Analysis/DivergenceAnalysis/AMDGPU/unreachable-loop-block.ll @@ -0,0 +1,17 @@ +; RUN: opt %s -mtriple amdgcn-- -analyze -divergence | FileCheck %s + +; CHECK: DIVERGENT: %tmp = cmpxchg volatile +define void @divergence_analysis_null_idom(i32 %tidx) #0 { +entry: + unreachable + +unreachable_loop: ; preds = %do.body.i, %if.then11 + %tmp = cmpxchg volatile i32 addrspace(1)* null, i32 0, i32 0 seq_cst seq_cst + %cmp.i = extractvalue { i32, i1 } %tmp, 1 + br i1 %cmp.i, label %unreachable_loop, label %end + +end: ; preds = %do.body.i51, %atomicAdd_g_f.exit + unreachable +} + +attributes #0 = { norecurse nounwind }