diff --git a/llvm/lib/Analysis/DivergenceAnalysis.cpp b/llvm/lib/Analysis/DivergenceAnalysis.cpp --- a/llvm/lib/Analysis/DivergenceAnalysis.cpp +++ b/llvm/lib/Analysis/DivergenceAnalysis.cpp @@ -301,6 +301,10 @@ markDivergent(Term); + // Don't propagate divergence from unreachable blocks. + if (!DT.isReachableFromEntry(Term.getParent())) + return; + const auto *BranchLoop = LI.getLoopFor(Term.getParent()); // whether there is a divergent loop exit from BranchLoop (if any) diff --git a/llvm/test/Analysis/DivergenceAnalysis/AMDGPU/unreachable-loop-block.ll b/llvm/test/Analysis/DivergenceAnalysis/AMDGPU/unreachable-loop-block.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Analysis/DivergenceAnalysis/AMDGPU/unreachable-loop-block.ll @@ -0,0 +1,17 @@ +; RUN: opt %s -mtriple amdgcn-- -analyze -divergence -use-gpu-divergence-analysis | FileCheck %s + +; CHECK: DIVERGENT: %tmp = cmpxchg volatile +define amdgpu_kernel void @unreachable_loop(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 }